• Hibernate实例二


    Hibernate实例二

    一、测试openSession方法和getCurrentSession方法

    hebernate中可以通过上述两种方法获取session对象以对数据库进行操作,下面的代码以及注解是对两种方法的辨析

    这两种方法是从SessionFactory获取Session的时候用

    SessionTest.java

      1 import java.sql.Connection;
      2 import java.sql.SQLException;
      3 import java.util.Date;
      4 
      5 import org.hibernate.Session;
      6 import org.hibernate.SessionFactory;
      7 import org.hibernate.Transaction;
      8 import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
      9 import org.hibernate.cfg.Configuration;
     10 import org.hibernate.jdbc.Work;
     11 import org.hibernate.service.ServiceRegistry;
     12 import org.junit.Test;
     13 
     14 /*
     15  * session详解
     16  * 如何获得session对象
     17  * 1)openSession
     18  * 2)getCurrentSession
     19  * getCurrentSession在事务提交或者回滚之后会自动关闭,而openSession需要你
     20  * 手动关闭。如果使用openSession而没有手动关闭,多次之后会导致连接池溢出
     21  * 
     22  * openSession方法每次都是创建新的对象
     23  * getCurrentSession一直使用的是同一个对象,有点类似单例模式
     24  */
     25 
     26 
     27 
     28 public class SessionTest {
     29 
     30     @Test
     31     public void testOpenSession(){
     32         //创建配置对象
     33         Configuration config = new Configuration().configure();
     34         //创建服务注册对象
     35         ServiceRegistry serviceRegistry =  new 
     36                 StandardServiceRegistryBuilder().applySettings(config.getProperties()).configure().build();
     37         //创建会话工厂对象
     38         SessionFactory sessionFactory = config.buildSessionFactory(serviceRegistry);
     39         //创建会话对象
     40         Session session1 = sessionFactory.openSession();
     41         Session session2 = sessionFactory.openSession();
     42         System.out.println(session1==session2);//false
     43         /*
     44         if (session!=null) {
     45             System.out.println("session创建成功");
     46         }
     47         else {
     48             System.out.println("session创建失败");
     49         }
     50          */
     51     }
     52 
     53     @Test
     54     public void testGetCurrentSession(){
     55         //创建配置对象
     56         Configuration config = new Configuration().configure();
     57         //创建服务注册对象
     58         ServiceRegistry serviceRegistry =  new 
     59                 StandardServiceRegistryBuilder().applySettings(config.getProperties()).configure().build();
     60         //创建会话工厂对象
     61         SessionFactory sessionFactory = config.buildSessionFactory(serviceRegistry);
     62         //创建会话对象
     63         Session session1 = sessionFactory.getCurrentSession();
     64         Session session2 = sessionFactory.getCurrentSession();
     65         System.out.println(session1==session2);//true
     66         /*
     67         if (session!=null) {
     68             System.out.println("session创建成功");
     69         }
     70         else {
     71             System.out.println("session创建失败");
     72         }
     73          */
     74     }
     75 
     76     @Test
     77     public void testSaveStudentsWithOpenSession(){
     78         //创建配置对象
     79         Configuration config = new Configuration().configure();
     80         //创建服务注册对象
     81         ServiceRegistry serviceRegistry =  new 
     82                 StandardServiceRegistryBuilder().applySettings(config.getProperties()).configure().build();
     83         //创建会话工厂对象
     84         SessionFactory sessionFactory = config.buildSessionFactory(serviceRegistry);
     85         //创建会话对象
     86         Session session1 = sessionFactory.openSession();
     87         //开启事务
     88         Transaction transaction = session1.beginTransaction();
     89         //生产学生对象
     90         Students s = new Students(1,"饭饭","男",new Date(),"博客园");
     91         session1.doWork(new Work() {
     92             @Override
     93             public void execute(Connection connection) throws SQLException {
     94                 // TODO Auto-generated method stub
     95                 System.out.println("connection hashCode:"+connection.hashCode());
     96             }
     97         });
     98         session1.save(s);//保存对象进入数据库
     99         //session1.close();
    100         transaction.commit();//提交事务
    101 
    102         //创建会话对象
    103         Session session2 = sessionFactory.openSession();
    104         //开启事务
    105         transaction = session2.beginTransaction();
    106         //生产学生对象
    107         s = new Students(2,"饭饭2","男",new Date(),"博客园2");
    108         session2.doWork(new Work() {
    109             @Override
    110             public void execute(Connection connection) throws SQLException {
    111                 // TODO Auto-generated method stub
    112                 System.out.println("connection hashCode:"+connection.hashCode());
    113             }
    114         });
    115         session2.save(s);//保存对象进入数据库
    116         transaction.commit();//提交事务
    117     }
    118     
    119     @Test
    120     public void testSaveStudentsWithGetCurrentSession(){
    121         //创建配置对象
    122         Configuration config = new Configuration().configure();
    123         //创建服务注册对象
    124         ServiceRegistry serviceRegistry =  new 
    125                 StandardServiceRegistryBuilder().applySettings(config.getProperties()).configure().build();
    126         //创建会话工厂对象
    127         SessionFactory sessionFactory = config.buildSessionFactory(serviceRegistry);
    128         //创建会话对象
    129         Session session1 = sessionFactory.getCurrentSession();
    130         //开启事务
    131         Transaction transaction = session1.beginTransaction();
    132         //生产学生对象
    133         Students s = new Students(1,"饭饭","男",new Date(),"博客园");
    134         session1.doWork(new Work() {
    135             @Override
    136             public void execute(Connection connection) throws SQLException {
    137                 // TODO Auto-generated method stub
    138                 System.out.println("connection hashCode:"+connection.hashCode());
    139             }
    140         });
    141         session1.save(s);//保存对象进入数据库
    142         //session1.close();
    143         transaction.commit();//提交事务
    144 
    145         //创建会话对象
    146         Session session2 = sessionFactory.getCurrentSession();
    147         //开启事务
    148         transaction = session2.beginTransaction();
    149         //生产学生对象
    150         s = new Students(2,"饭饭2","男",new Date(),"博客园2");
    151         session2.doWork(new Work() {
    152             @Override
    153             public void execute(Connection connection) throws SQLException {
    154                 // TODO Auto-generated method stub
    155                 System.out.println("connection hashCode:"+connection.hashCode());
    156             }
    157         });
    158         session2.save(s);//保存对象进入数据库
    159         transaction.commit();//提交事务
    160     }
    161 }

     这里有事务提交,事务提交就是将sql传到数据库,要是没有事务,session对象只能自己提交了。

    二、如何使用对象类型Blob类型

    Blob类型可以用来存照片、音频、视频等文件

    Hibernate对象数据类型

    1、实体类中定义这样的属性

    private Blob picture;//照片,大文本数据类型

    当然也要写这个属性对应的get/set方法

    2、修改映射文件

    <property name="picture" type="java.sql.Blob">
    <column name="PICTURE" />
    </property>

    3、测试Blob类型

      1 //这里报错我一直在纠结,其实视频里面这里也有错啊,我浪费时间
      2 //多去看视频下面的评论,有告诉我们很多问题的解决方案
      3 //运行代码时老犯配置错误,原来配置文件中不支持java注释的写法
      4 //我是通过删减犯错位置的代码来发现错误的
      5 
      6 
      7 
      8 import java.io.File;
      9 import java.io.FileInputStream;
     10 import java.io.FileOutputStream;
     11 import java.io.InputStream;
     12 import java.io.OutputStream;
     13 import java.sql.Blob;
     14 import java.util.Date;
     15 
     16 import javax.print.DocFlavor.INPUT_STREAM;
     17 
     18 import org.hibernate.Hibernate;
     19 import org.hibernate.Session;
     20 import org.hibernate.SessionFactory;
     21 import org.hibernate.Transaction;
     22 import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
     23 import org.hibernate.cfg.Configuration;
     24 import org.hibernate.service.ServiceRegistry;
     25 import org.junit.After;
     26 import org.junit.Before;
     27 import org.junit.Test;
     28 
     29 
     30 
     31 //测试类
     32 public class StudentsTest {
     33 
     34     private SessionFactory sessionFactory;
     35     private Session session;
     36     private Transaction transaction;
     37     
     38     @Before
     39     public void init(){
     40         //创建配置对象
     41         Configuration config = new Configuration().configure();
     42         //创建服务注册对象
     43         ServiceRegistry serviceRegistry =  new 
     44                 StandardServiceRegistryBuilder().applySettings(config.getProperties()).configure().build();//这里有点不一样
     45         //创建会话工厂对象
     46         sessionFactory = config.buildSessionFactory(serviceRegistry);
     47         //会话对象
     48         session = sessionFactory.openSession();
     49         //开启事务
     50         transaction = session.beginTransaction();
     51         
     52     }
     53     
     54     @After
     55     public void destory(){
     56         transaction.commit();//提交事务
     57         session.close();//关闭会话
     58         sessionFactory.close();//关闭会话工厂
     59     }
     60     
     61     
     62     @Test
     63     public void testSaveStudents(){
     64         //生产学生对象
     65 //        Students s = new Students(1,"饭饭","男",new Date(),"博客园");
     66         Students s = new Students();
     67         s.setSid(1);
     68         s.setSname("饭饭");
     69         s.setGender("男");
     70         s.setBirthday(new Date());
     71         //s.setAddress("博客园");
     72         Address address = new Address("400715","1888****749","重庆北碚西南大学");
     73         s.setAddress(address);
     74         session.save(s);//保存对象进入数据库
     75     }
     76     
     77     @Test
     78     public void TestWriteBlob() throws Exception {
     79         Students s = new Students(1,"饭饭","男",new Date(),"博客园");
     80         //先获得照片文件
     81         File f = new File("e:"+File.separator+"fanfan.jpg");
     82         //获取照片文件的输入流
     83         InputStream input = new FileInputStream(f);
     84         //创建一个Blob对象
     85         Blob image = (Blob) Hibernate.getLobCreator(session).createBlob(input, input.available());
     86         //设置照片属性
     87         s.setPicture(image);
     88         //保存学生
     89         session.save(s);
     90     }
     91     
     92     @Test
     93     public void testReadBlob() throws Exception{
     94         Students s = (Students)session.get(Students.class, 1);
     95         //获取Blob对象
     96         Blob image = s.getPicture();
     97         //获取输入流
     98         InputStream input = image.getBinaryStream();
     99         //创建输出流
    100         File f = new File("e:"+File.separator+"dest.jpg");
    101         //获取输出流
    102         OutputStream output = new FileOutputStream(f);
    103         //创建缓冲区
    104         byte[] buff = new byte[input.available()];
    105         input.read(buff);
    106         output.write(buff);
    107         input.close();
    108         output.close();
    109         
    110     }
    111     
    112 }

    三、Hibernate使用组件类型

    1、写出属性类Address.java,并在实体类Students.java中添加Address属性

     1 //地址类
     2 public class Address {
     3 
     4     private String postcode;//邮编
     5     private String phone;//电话
     6     private String address;//地址
     7     
     8     public Address(){
     9         
    10     }
    11 
    12     public Address(String postcode, String phone, String address) {
    13         //super();
    14         this.postcode = postcode;
    15         this.phone = phone;
    16         this.address = address;
    17     }
    18 
    19     public String getPostcode() {
    20         return postcode;
    21     }
    22 
    23     public void setPostcode(String postcode) {
    24         this.postcode = postcode;
    25     }
    26 
    27     public String getPhone() {
    28         return phone;
    29     }
    30 
    31     public void setPhone(String phone) {
    32         this.phone = phone;
    33     }
    34 
    35     public String getAddress() {
    36         return address;
    37     }
    38 
    39     public void setAddress(String address) {
    40         this.address = address;
    41     }
    42     
    43     
    44     
    45 }

    下面是在实体类Students.java中添加Address属性

    private Address address;//地址类对象

    也要生产地址类对象的get与set方法

    2、修改映射文件Students.hbm.xml

    <!--
    <property name="address" type="java.lang.String">
    <column name="ADDRESS" />
    </property>
    -->

    被替换为:

    <component name="address" class="Address">
    <property name="postcode" column="POSTCODE"></property>
    <property name="phone" column="PHONE"></property>
    <property name="address" column="ADDRESS"></property>
    </component>

    3、测试组件类型

     1 //这里报错我一直在纠结,其实视频里面这里也有错啊,我浪费时间
     2 //多去看视频下面的评论,有告诉我们很多问题的解决方案
     3 //运行代码时老犯配置错误,原来配置文件中不支持java注释的写法
     4 //我是通过删减犯错位置的代码来发现错误的
     5 
     6 
     7 
     8 import java.io.File;
     9 import java.io.FileInputStream;
    10 import java.io.FileOutputStream;
    11 import java.io.InputStream;
    12 import java.io.OutputStream;
    13 import java.sql.Blob;
    14 import java.util.Date;
    15 
    16 import javax.print.DocFlavor.INPUT_STREAM;
    17 
    18 import org.hibernate.Hibernate;
    19 import org.hibernate.Session;
    20 import org.hibernate.SessionFactory;
    21 import org.hibernate.Transaction;
    22 import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
    23 import org.hibernate.cfg.Configuration;
    24 import org.hibernate.service.ServiceRegistry;
    25 import org.junit.After;
    26 import org.junit.Before;
    27 import org.junit.Test;
    28 
    29 
    30 
    31 //测试类
    32 public class StudentsTest {
    33 
    34     private SessionFactory sessionFactory;
    35     private Session session;
    36     private Transaction transaction;
    37     
    38     @Before
    39     public void init(){
    40         //创建配置对象
    41         Configuration config = new Configuration().configure();
    42         //创建服务注册对象
    43         ServiceRegistry serviceRegistry =  new 
    44                 StandardServiceRegistryBuilder().applySettings(config.getProperties()).configure().build();//这里有点不一样
    45         //创建会话工厂对象
    46         sessionFactory = config.buildSessionFactory(serviceRegistry);
    47         //会话对象
    48         session = sessionFactory.openSession();
    49         //开启事务
    50         transaction = session.beginTransaction();
    51         
    52     }
    53     
    54     @After
    55     public void destory(){
    56         transaction.commit();//提交事务
    57         session.close();//关闭会话
    58         sessionFactory.close();//关闭会话工厂
    59     }
    60     
    61     
    62     @Test
    63     public void testSaveStudents(){
    64         //生产学生对象
    65 //        Students s = new Students(1,"饭饭","男",new Date(),"博客园");
    66         Students s = new Students();
    67         s.setSid(1);
    68         s.setSname("饭饭");
    69         s.setGender("男");
    70         s.setBirthday(new Date());
    71         //s.setAddress("博客园");
    72         Address address = new Address("400715","1888****749","重庆北碚西南大学");
    73         s.setAddress(address);
    74         session.save(s);//保存对象进入数据库
    75     }
    76     
    77 }

    四、Hibernate的增删改查操作

    * save():(增)保存数据  delete():(删)删除数据  update():(改)更新数据  get()/load():(查)取出数据    

      1 //这里报错我一直在纠结,其实视频里面这里也有错啊,我浪费时间
      2 //多去看视频下面的评论,有告诉我们很多问题的解决方案
      3 //运行代码时老犯配置错误,原来配置文件中不支持java注释的写法
      4 //我是通过删减犯错位置的代码来发现错误的
      5 
      6 
      7 
      8 import java.io.File;
      9 import java.io.FileInputStream;
     10 import java.io.FileOutputStream;
     11 import java.io.InputStream;
     12 import java.io.OutputStream;
     13 import java.sql.Blob;
     14 import java.util.Date;
     15 
     16 import javax.print.DocFlavor.INPUT_STREAM;
     17 
     18 import org.hibernate.Hibernate;
     19 import org.hibernate.Session;
     20 import org.hibernate.SessionFactory;
     21 import org.hibernate.Transaction;
     22 import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
     23 import org.hibernate.cfg.Configuration;
     24 import org.hibernate.service.ServiceRegistry;
     25 import org.junit.After;
     26 import org.junit.Before;
     27 import org.junit.Test;
     28 
     29 
     30 
     31 //测试类
     32 public class StudentsTest {
     33 
     34     private SessionFactory sessionFactory;
     35     private Session session;
     36     private Transaction transaction;
     37     
     38     @Before
     39     public void init(){
     40         //创建配置对象
     41         Configuration config = new Configuration().configure();
     42         //创建服务注册对象
     43         ServiceRegistry serviceRegistry =  new 
     44                 StandardServiceRegistryBuilder().applySettings(config.getProperties()).configure().build();//这里有点不一样
     45         //创建会话工厂对象
     46         sessionFactory = config.buildSessionFactory(serviceRegistry);
     47         //会话对象
     48         session = sessionFactory.openSession();
     49         //开启事务
     50         transaction = session.beginTransaction();
     51         
     52     }
     53     
     54     @After
     55     public void destory(){
     56         transaction.commit();//提交事务
     57         session.close();//关闭会话
     58         sessionFactory.close();//关闭会话工厂
     59     }
     60     
     61     
     62     @Test
     63     public void testSaveStudents(){
     64         //生产学生对象
     65 //        Students s = new Students(1,"饭饭","男",new Date(),"博客园");
     66         Students s = new Students();
     67         s.setSid(1);
     68         s.setSname("饭饭");
     69         s.setGender("男");
     70         s.setBirthday(new Date());
     71         //s.setAddress("博客园");
     72         Address address = new Address("400715","1888****749","重庆北碚西南大学");
     73         s.setAddress(address);
     74         session.save(s);//保存对象进入数据库
     75     }
     76     
     77     /*
     78      * get和load都是查询单个记录
     79      * 1、get方法会向数据库立即发送sql语句,load方法要等到第一次用的时候再发sql语句
     80      * 2、get方法返回的是本身对象,load方法返回的是代理对象,代理对象只保存了实例对象的主键id
     81      * 3、查询对象不存在时,get返回null,load返回ObjectNotFoundException异常
     82      */
     83     
     84     @Test
     85     public void testGetStudents(){//get查询单个记录
     86         Students s = (Students)session.get(Students.class, 1);
     87         System.out.println(s.getClass().getName());//answer: Students
     88         System.out.println(s);
     89         //answer: Students [sid=1, sname=饭饭, gender=男, birthday=2017-05-31 06:03:13.0, address=Address@c8b96ec]
     90     }
     91     
     92     @Test
     93     public void testLoadStudents(){//load查询单个记录
     94         /*
     95          * 没有后面这个输出s的语句,load方法不向数据库发送sql语句,加上这句话立马就有了
     96          * 
     97          */
     98         Students s = (Students)session.load(Students.class, 1);
     99         System.out.println(s.getClass().getName());//answer: Students_$$_jvstd5_0 显然这个结果是一个代理对象
    100         System.out.println(s);
    101         //answer: Students [sid=1, sname=饭饭, gender=男, birthday=2017-05-31 06:03:13.0, address=Address@c8b96ec]
    102     }
    103     
    104     @Test
    105     public void testUpdateStudents(){//更新记录
    106         Students s = (Students)session.get(Students.class, 1);
    107         s.setGender("女");
    108         session.update(s);
    109         System.out.println(s);
    110         
    111     }
    112     
    113     @Test
    114     public void testDeleteStudents(){//删除记录
    115         Students s = (Students)session.get(Students.class, 1);
    116         session.delete(s);
    117     }
    118 }

    五、总结

    * 1、什么是ORM?为什么要使用Hibernate?
    * ORM是对象关系映射
    * 使用ORM的好处是使得习惯使用面向对象编程的程序员在项目中尽量少写和底层数据库相关的sql语句
    * 这样做的好处:方便程序维护和修改以及跨平台性和扩展
    * Hibernate是Java领域类技术成熟稳定的ORM框架


    * 2、Hibernate开发的基本步骤
    * (1)编写项目配置文档hibernate.cfg.xml
    * (2)编写实体类(需遵循Java bins的规范)
    * (3)生产对应实体类的映射文件并添加到配置文档中
    * (4)调用Hibernate API函数进行测试


    * 3、什么是session?
    * hibernate对数据库的操作都要使用session对象,session对象相当于我们使用jdbc开发的一个connection对象
    * 我们使用hibernate对数据库的操作本质上就是调用session的API函数来实现的
    * save():(增)保存数据 get()/load():(查)取出数据 update():(改)更新数据 delete():(删)删除数据


    * 4、openSession与getCurrentSession
    * openSession每次创建一个新的实例对象,需要我们显示关闭
    * getCurrentSession使用的是一种单例模式,每次创建的都是相同的对象,自动关闭


    * 5、单表操作有哪些方法?
    * save():(增)保存数据 delete():(删)删除数据 update():(改)更新数据 get()/load():(查)取出数据


    * 6、get和load
    * get使用时立刻发送sql语句,而且直接获得实体类本身
    * load是在使用到具体的实例的非主属性的时候才会发送sql语句,返回的是代理对象

  • 相关阅读:
    Java基础知识(一)环境变量的设置、变量与常量、自动类型转换、自增长、赋值运算符
    ModelState
    DOM
    正则表达式常见形式
    通过JS设置一个元素的文本
    JS(三) 原型对象与原型链
    JS(二)call方法和apply方法
    第四周学习进度表
    敏捷开发方法综述
    数组02
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/6922433.html
Copyright © 2020-2023  润新知