在项目的 src 目录下创建一个名称为 com.mengma.test 的包,在该包下创建一个名称为UserTest的测试类。

添加数据

在 UserTest 类中创建一个名称为 testInsert 的方法,该方法用于向数据库中添加数据,其代码如下所示。

  1. package com.mengma.test;

  2. import org.hibernate.SessionFactory;
  3. import org.hibernate.Transaction;
  4. import org.hibernate.cfg.Configuration;
  5. import org.hibernate.Session;
  6. import org.junit.Test;

  7. import com.mengma.domain.User;

  8. public class UserTest {
  9. // 添加操作
  10. @Test
  11. public void testInsert() {
  12. // 1.创建Configuration对象并加载hibernate.cfg.xml配置文件
  13. Configuration config = new Configuration().configure();
  14. // 2.获取SessionFactory
  15. SessionFactory sessionFactory = config.buildSessionFactory();
  16. // 3.得到一个Session
  17. Session session = sessionFactory.openSession();
  18. // 4.开启事务
  19. Transaction transaction = session.beginTransaction();
  20. // 5.执行持久化操作
  21. User user = new User();
  22. user.setName(“zhangsan”);
  23. user.setAge(21);
  24. user.setGender(“男”);
  25. // 将对象保存到表中
  26. session.save(user);
  27. // 6.提交事务
  28. transaction.commit();
  29. // 7.关闭资源
  30. session.close();
  31. sessionFactory.close();
  32. }
  33. }

上述代码中,首先创建 Configuration 类的实例,并加载解析 hibernate.cfg.xml 核心配置文件。然后获取 SessionFactory 读取解析映射文件信息,并将 Configuration 对象中的所有配置信息加载到 SessionFactory 内存中。接着得到一个 Session,开启一个事务,之后创建 User 对象,向对象中设置添加数据,通过 session.save() 方法完成向数据库中保存数据的操作。最后提交事务,并关闭资源。

添加 JUnit 测试

在软件开发过程中,需要有相应的测试工作。依据测试目的的不同,可以将软件测试分为单元测试、集成测试、系统测试等。其中单元测试在软件开发阶段是最底层的测试,它易于及时发现并解决问题。JUnit 就是一个进行单元测试的开源框架。

本程序使用的就是单元测试框架 JUnit4,使用此框架测试时,不需要 main 方法,就可以直接对类中的方法进行运行测试。其中 @Test 用于测试的注解,要测试哪个方法,只需要在相应测试的方法上添加此注解即可。

当在需要测试方法上写入 @Test 后,MyEclipse 会在 @Test 处报出 Test cannot be resolved to a type 的错误,将鼠标移到 @Test 处,在显示的弹出窗口中,单击 Add JUnit4 library to the build path,程序会自动将 JUnit4 的支持包加入到项目中,如图 1 所示。

04-Hibernate实现增删改查功能 - 图1
图 1 添加JUnit4

添加后在项目中会多出两个关于 JUnit4 的 JAR 包,在 MyEclipse 中的显示如图 2 所示。

04-Hibernate实现增删改查功能 - 图2
图 2 JUnit 框架支持包

在 UserTest 类中,右击 testInsert() 方法,在弹出的快捷菜单中选择 Run As→JUnit Test 选项运行测试,如图 3 所示。

04-Hibernate实现增删改查功能 - 图3
图 3 运行JUnit

单击 JUnit Test 选项后,运行的结果如图 4 所示。

04-Hibernate实现增删改查功能 - 图4
图 4 运行结果

在图 4 中,当 JUnit 选项卡的进度条为绿色时,表明运行结果正确,如果进度条为红色,则表示有错误,并且会在窗口中显示所报的错误信息。运行成功后,查询数据库 user 表中的数据,其结果如图 5 所示。

04-Hibernate实现增删改查功能 - 图5
图 5 使用Hibernate添加数据

从图 5 中可以看出,使用 Hibernate 框架成功地向 user 表中添加了一条数据。

修改数据

在 UserTest 类中,添加一个名为 testUpdate() 的方法,该方法用于修改 user 表中的数据,其代码如下所示:

  1. // 修改操作
  2. @Test
  3. public void testUpdate() {
  4. // 1.创建Configuration对象并加载hibernate.cfg.xml配置文件
  5. Configuration config = new Configuration().configure();
  6. // 2.获取SessionFactory
  7. SessionFactory sessionFactory = config.buildSessionFactory();
  8. // 3.得到一个Session
  9. Session session = sessionFactory.openSession();
  10. // 4.开启事务
  11. Transaction transaction = session.beginTransaction();
  12. // 5.执行持久化操作
  13. User user = new User();
  14. user.setId(1);
  15. user.setName(“zhangsan”);
  16. user.setAge(19);
  17. user.setGender(“男”);
  18. // 更新数据
  19. session.update(user);
  20. // 6.提交事务
  21. transaction.commit();
  22. // 7.关闭资源
  23. session.close();
  24. sessionFactory.close();
  25. }

从上述代码中可以看出,Hibernate 修改数据的方法与其保存数据的方法类似,只是在修改数据后通过 session.update() 方法执行的更新操作。

使用 JUnit 运行此方法,执行成功后,查询 user 表中的数据,其结果如图 6 所示。

04-Hibernate实现增删改查功能 - 图6
图 6 更新数据后的数据表

从图 6 中可以看出,表中 age 字段已经被修改为 19,说明使用 Hibernate 成功更新了 user 表中的数据。

查询数据

在 UserTest 类中,添加一个名称为 testFindById() 的方法,查询 id 为 1 的表数据,其代码如下所示:

  1. // 查询操作
  2. @Test
  3. public void findByIdTest() {
  4. // 1.创建Configuration对象并加载hibernate.cfg.xml配置文件
  5. Configuration config = new Configuration().configure();
  6. // 2.获取SessionFactory
  7. SessionFactory sessionFactory = config.buildSessionFactory();
  8. // 3.得到一个Session
  9. Session session = sessionFactory.openSession();
  10. // 4.开启事务
  11. Transaction transaction = session.beginTransaction();
  12. // 5.执行持久化操作
  13. User user = (User) session.get(User.class, 1);
  14. System.out.println(user.getId() + “” + user.getName() + “”
    • user.getAge() + “” + user.getGender());
  15. // 6.提交事务
  16. transaction.commit();
  17. // 7.关闭资源
  18. session.close();
  19. sessionFactory.close();
  20. }

从上述代码中可以看出,与增加和修改数据相比,查询操作中通过使用 session.get() 方法获取 User 对象数据,然后将查询出的 User 对象数据输出到控制台。

使用 JUnit4 运行 findByIdTest() 方法后,控制台的显示如图 7 所示。

在图 7 中,控制台开始处出现的警告部分是由于没有配置 log4j 才显示的,此处可先不必理会。中间部分是 Hibernate 自动生成的 SQL 语句信息,这是由于在 hibernate.cfg.xml 中增加了显示 SQL 语句和格式化 SQL 的配置信息才显示出来的。最后就是所查询出的数据输出信息。

注意:在 Hibernate 中,除了使用 get() 方法加载数据以外,还可以使用 load() 方法加载数据,它们都能将数据从数据库中取出。两者的区别是使用 get() 方法加载数据时,如果指定的记录不存在,则返回 null;而使用 load() 方法加载数据时,如果指定的记录不存在,则会报出 ObjectNotfountException 异常,这一异常说明使用 load() 方法加载数据时,要求记录必须存在。

04-Hibernate实现增删改查功能 - 图7
图 7 查询结果

删除数据

在 UserTest 类中,添加一个名称为 deleteByIdTest() 的方法,在该方法中使用 Hibernate 将 id 为 1 的这条记录从数据表中删除,其方法代码如下所示:

  1. // 删除操作
  2. @Test
  3. public void deleteByIdTest() {
  4. // 1.创建Configuration对象并加载hibernate.cfg.xml配置文件
  5. Configuration config = new Configuration().configure();
  6. // 2.获取SessionFactory
  7. SessionFactory sessionFactory = config.buildSessionFactory();
  8. // 3.得到一个Session
  9. Session session = sessionFactory.openSession();
  10. // 4.开启事务
  11. Transaction transaction = session.beginTransaction();
  12. // 5.执行持久化操作
  13. User user = (User) session.get(User.class, 1);
  14. session.delete(user);
  15. // 6.提交事务
  16. transaction.commit();
  17. // 7.关闭资源
  18. session.close();
  19. sessionFactory.close();
  20. }

从上述代码中可以看出,在执行删除操作时,先通过 get() 方法获取了 id 为 1 的 User 对象,然后通过 delete() 方法删除了该对象数据。

使用 JUnit 运行此方法,执行成功后,再次查询数据库 user 表,会发现 user 表中的数据已经为空,这表明使用 Hibernate 框架删除数据的操作执行成功。