Hibernate框架学习之增删改查
前言
上一小节我们建立一个基于Maven的Hibernate工程,并且完成基本的配置,粗略地了解了Hibernate,接下来这一小节,我们接着上一小节的内容,利用Hibernate来完成简单的增上改查。
封装工具类
为了操作的方面,首先先对Hibernate的基本操作进行一个封装,这样可以提高开发的效率,减少重复代码,封装过程如下所示:
新建一个包,命名为Utils
新建一个类,命名为HibernateUtils
-
代码抽取
// 获取Hibernate的配置对象 Configuration configuration = new Configuration().configure(); // 建立SessionFactory SessionFactory sessionFactory = configuration.buildSessionFactory(); // 打开session Session session = sessionFactory.openSession(); // 所要添加到数据库的学生对象 Students students = new Students(); students.setAge(22); students.setName("xuhuanfeng"); // 开启事务 Transaction ts = session.beginTransaction(); // 将数据添加到数据库 session.save(students); // 提交事务 ts.commit(); // 关闭对应的连接 session.close(); sessionFactory.close();
上面的代码是上一小节中使用到的代码,从代码中可以看到,前面几行代码都是重复性,也就是说,每次我们需要获得一个Session对象的时候,都需要这些代码,所以将其抽取出来,形成工具类。
-
代码封装
/** * Hibernate 工具类 * Created by xuhuanfeng on 2017-04-06. */ public class HibernateUtils { private static SessionFactory sessionFactory; //私有化构造器 private HibernateUtils(){} static { Configuration configuration = new Configuration().configure(); sessionFactory = configuration.buildSessionFactory(); } // 获得Session对象 public static Session openSession(){ return sessionFactory.openSession(); } }
增加操作
封装好对应的工具类之后,我们就可以开始增删改查之旅了,首先是增加记录。
增加记录主要的使用到的方法是save方法,这个在上一小节中已经了解过了,具体的操作代码如下所示
// 增加一个记录
@Test
public void testCreate(){
Session session = HibernateUtils.openSession();
// 所要添加到数据库的学生对象
Students students = new Students();
students.setAge(30);
students.setName("tom");
// 开启事务
Transaction ts = session.beginTransaction();
// 将数据添加到数据库
session.save(students);
// 提交事务
ts.commit();
// 关闭对应的连接
session.close();
}
需要注意的是,这里的事务是需要开启的,save方法本质上并没有将数据保存在数据库中,只有当事务commit了之后才会同步到数据库中。
运行之后就可以观察到,对应的记录已经添加到数据库中了。
查询操作
接下来是查询操作,主要分为查询单一记录以及查询满足条件的所有记录,查询操作是一个比较复杂的操作,这里只进行简单的单表查询,其他的查询在后面的小节中。
-
单一记录查询
单一记录主要是通过主键来获取对应的记录,也就是通过配置了id的属性来获取记录,使用get方法即可。
// 测试查询 @Test public void testQuery(){ Session session = HibernateUtils.openSession(); // 获取指定id的记录,这里的id指的是在元数据中配置<id>所对应的元素 Students students = session.get(Students.class, 1); System.out.println(students); session.close(); }
Hibernate中同时还提供另外一种获取单一记录的方式,可以使用load方法,两种方法的操作基本一样,如下所示
// 测试查询 @Test public void testQuery(){ Session session = HibernateUtils.openSession(); // 获取指定id的记录,这里的id指的是在元数据中配置<id>所对应的元素 Students students = session.load(Students.class,1); System.out.println(students); session.close(); }
这两种方式的区别在于,get方法在查询的时候就直接返回了所查询记录的全部内容,而load方法只是返回了具有该主键的对象,只有当使用到该对象的时候,才会去完整地加载该对象,也就是懒操作/ 延迟操作。测试该效果的方式非常简单,只需要将load代码中的
session.close();
与输出的代码交换位置,就可以看到(此时会抛出错误,具体内容为org.hibernate.LazyInitializationException: could not initialize proxy - no Session
具体原因在以后进行分析) -
多记录查询
多记录查询用于查询满足某一条件的所有结果,不过由于所记录查询会涉及到一些HQL的内容,所以这里先不介绍,后面会有一个小节专门讲解Hibernate的所有的查询方式以及各自的特点。
修改操作
修改操作同样有单一的修改操作以及复杂的修改操作,这里只演示简单的修改单一记录的操作。
在Hibernate中,一个比较简单的修改操作是,将该记录取出,然后修改该记录,然后进行更新,具体操作如下所示
// 修改操作
@Test
public void testUpdate(){
Session session = HibernateUtils.openSession();
// 获取id为1的学生
Students students = session.get(Students.class, 1);
students.setName("jack"); //将名字修改为jack
students.setAge(33); // 将年龄修改为33
Transaction ts = session.beginTransaction();
session.update(students); // 更新该记录
ts.commit();
session.close();
}
查看数据库中的数据就可以发现,id为1的学生的姓名以及年龄已经更改了。
删除操作
删除操作同上,也只演示简单的删除单一记录的操作。
在Hibernate中,最简单的删除操作是指定一个对象的id,并且删除该对象即可,如下所示
// 删除操作
@Test
public void testDelete(){
Session session = HibernateUtils.openSession();
// 删除id为1的学生
Students students = new Students();
students.setId(1);
Transaction ts = session.beginTransaction();
session.delete(students); // 删除该记录
ts.commit();
session.close();
}
查看数据库中的数据就可以发现,id为1的学生的记录已经被删除了。
总结
本小节主要对Hibernate的操作进行一个简单的封装,并且使用Hibernate完成最简单的增删改查操作,Hibernate的学习之路还在继续。