Hibernate原理、配置及单表操作
一、Hibernate的配置文档
其中:hbm2ddl.auto中的create表示每次修改数据的时候都会删除原有的表,生成新的表结构,原有的数据不再存在;update表示在原有数据的基础上进行更新,不会删除原有的数据。 hibernate.default_schema属性设置成数据库的名称,将数据库设置为默认数据库,这样,SQL语句上都会加上默认数据库的前缀。
二、Hibernate的执行流程
注意:在执行session方法进行表操作的时候要开启一个事务transaction,这些方法都需要封装在事务当中,执行完方法之后需要先提交事务,然后关闭session。
session可以理解为操作数据库的对象。
把对象保存在数据库中需要调用session的各种方法,如:save(),update(),delete(),createQuery()等。
三、事务transaction
四、session详解
五、hbm配置文档详解(对象关系映射文件)
1. 单一主键
其中,id标签下的子标签generator表示主键的生成策略,经常使用的有两种:
若生成策略使用assigned,但保存对象进数据库时没有对id进行手工赋值,那么它会使用实体化类中id的初始化值0进行赋值,如果数据表中存在id为0的记录,那么会保存失败。如果生成策略是native,则不用手工赋值,它会采用auto_increment的方式对id进行自动增加,就算手工再赋值也会不起作用。
2. hibernate的基本类型
在关系映射文档的type属性中,要么写hibernate类型(第一列),要么写java类型(第二列)。
3. 对象类型
添加了两个测试方法,对向数据库写入对象和从数据库读取对象进行了测试,代码如下:
1 @Test 2 public void testWriteBlob() throws IOException { 3 Students s = new Students(); 4 s.setSname("张楚"); 5 s.setGender("男"); 6 s.setBrithday(new Date()); 7 s.setAddress("上海"); 8 File file = new File("D://image.jpg"); 9 InputStream is = new FileInputStream(file); 10 Blob image = Hibernate.getLobCreator(session).createBlob(is, is.available()); 11 s.setPictrue(image); 12 session.save(s); 13 } 14 15 @Test 16 public void testReadBlob() throws Exception { 17 Students s = (Students)session.get(Students.class, 1); 18 Blob image = s.getPictrue(); 19 InputStream is = image.getBinaryStream(); 20 OutputStream os = new FileOutputStream("d:"+File.separator+"dest.jpg"); 21 byte[] buff = new byte[is.available()]; 22 int temp; 23 while((temp=is.read(buff, 0, is.available())) != -1) { 24 os.write(buff, 0, temp); 25 os.flush(); 26 } 27 /* 28 * 或者可以这样传 29 * in.read(buff); 30 * os.write(buff); 31 */ 32 is.close(); 33 os.close(); 34 }
4. 组件属性
假如将之前的Students类的代码中的String address属性更改为一个自己定义的一个Address类,这个类中有三个属性分别是postcode,phone,address,那么这个Address类也需要满足JavaBean的要求,并且在hbm文件中增加如上的配置。(Students类和测试类中也要做相应的修改,在此省略。)
这时的文件目录 和 新生成的表结构 为:
5. Hibernate对单表的增删改查操作
调用session的save()方法可以保存一个对象进入数据库,之前已经演示过。
查询记录可以使用session的 get 和 load 方法,修改可以使用session的update方法,删除可以使用session的delete方法。测试类中有代码如下:
1 @Test 2 public void testGetStudents() { 3 Students s = (Students)session.get(Students.class, 2); 4 System.out.println(s); 5 } 6 7 @Test 8 public void testLoadStudents() { 9 Students s = (Students)session.load(Students.class, 2); 10 System.out.println(s); 11 } 12 13 @Test 14 public void testUpdateStudents() { 15 Students s = (Students)session.get(Students.class, 2); 16 s.setGender("女"); 17 session.update(s); 18 } 19 20 @Test 21 public void testDeleteStudents() { 22 Students s = (Students)session.get(Students.class, 2); 23 session.delete(s); 24 }
查询记录所用到的get方法和load方法的区别: