Hibernate5.x的CRUD功能测试
一、实现CRUD操作
1、实现思路:
第一步 加载hibernate核心配置文件
第二步 创建SessionFactory对象
第三步 使用SessionFactory创建session对象
第四步 开启事务
第五步 写具体逻辑 crud操作
第六步 提交事务
第七步 关闭资源
/** * Session(重点) * 1 session类似于jdbc中的connection * 2 调用session里面不同的方法实现crud操作 * (1)添加save方法 (2)修改update方法 * (3)删除delete方法(4)根据id查询get方法 * 3 session对象单线程对象 * (1)session对象不能共用,只能自己使用 */
2、添加操作
//添加功能 @Test public void testAdd() { //第一步 加载hibernate核心配置文件 //到src下面找到名称是hibernate.cfg.xml //在hibernate里面封装对象 Configuration cfg = new Configuration(); cfg.configure(); //第二步 创建sessionFactory对象 //读取hibernate核心配置文件内容,创建sessionFactory //在过程中,根据映射关系,在配置数据库里面把表创建 SessionFactory sessionFactory = cfg.buildSessionFactory(); //第三步 使用sessionFactory创建session对象 //类似于连接 Session session = sessionFactory.openSession(); //第四步 开启事务 Transaction tx = session.beginTransaction(); //第五步 写具体逻辑crud操作 //添加操作 User user = new User(); user.setUsername("白白"); user.setPassword("1314"); user.setAddress("中国"); //调用session的方法实现添加 session.save(user); //第六步 提交事务 tx.commit(); //第七步 关闭资源 session.close(); sessionFactory.close(); }
为了方便,我们可以编写一个工具类
/** * 工具类,将获取核心配置文件的代码进行整合 * @author 葛云霞 * 获取核心配置文件标签,写静态代码块实现 */ public class DUtils { //写静态代码块实现 静态代码快在类加载时候执行 执行一次 static Configuration cfg = null; static SessionFactory sessionFactory = null; //静态代码块实现 static { //加载核心配置文件 cfg = new Configuration(); cfg.configure(); sessionFactory = cfg.buildSessionFactory(); } //提供方法返回sessionFactory public static SessionFactory getSessionFactory() { return sessionFactory; } //获取本地线程Session public static Session getSessionObject() { return sessionFactory.getCurrentSession(); } }
3、删除操作
//删除功能(调用工具类) @Test public void testDelete() { //1 调用工具类得到sessionFactory SessionFactory sessionFactory = DUtils.getSessionFactory(); //2 获取session Session session = sessionFactory.openSession(); //3 开启事务 Transaction tx = session.beginTransaction(); //4 删除操作 调用session里面delete方法实现 User user = session.get(User.class, 1);//可以通过User user = new User(); user.setUid(1); session.delete(user); //第六步 提交事务 tx.commit(); //第七步 关闭资源 session.close(); sessionFactory.close(); }
4、修改操作
//修改操作(调用工具类) @Test public void testUpdate() { //1 调用工具类得到sessionFactory SessionFactory sessionFactory = DUtils.getSessionFactory(); //2 获取session Session session = sessionFactory.openSession(); //3 开启事务 Transaction tx = session.beginTransaction(); //4 修改操作 调用session里面update方法实现 User user = session.get(User.class, 2); user.setUsername("笑笑"); session.update(user); //第六步 提交事务 tx.commit(); //第七步 关闭资源 session.close(); sessionFactory.close(); }
5、查询操作
//查询操作(调用操作类) @Test public void testGet() { //1 调用工具类得到sessionFactory SessionFactory sessionFactory = DUtils.getSessionFactory(); //2 获取session Session session = sessionFactory.openSession(); //3 开启事务 Transaction tx = session.beginTransaction(); //4 根据id查询 调用session里面的get方法 User user = session.get(User.class, 3); System.out.println(user); //第六步 提交事务 tx.commit(); //第七步 关闭资源 session.close(); sessionFactory.close(); }
另外我们有一些细节问题需要了解
/** * 实体类对象有三种 (1)瞬时态 (2)持久态 (3)托管态 * (1)瞬时态:对象里面没有id值,对象与session没有关联 * User user = new User(); * user.setName("丽丽"); * user.setPassword("1234"); * (2)持久态:对象里面有id值,对象与session没有关联 * User user = session.get(User.class,1); * (3)托管态:对象里面有id值,对象与session有关联 * User user = new User(); * user.setUid(3); */
//三种状态的相互转换
//saveOrUpdate方法:实现添加 实现修改 /** * 实体类对象状态是瞬时态,做添加 * 持久态 托管态都是做修改 */
//通过getCurrentSession() :该方法是获取本地的session 来编写上面的代码 @Test public void testSession() { SessionFactory sessionFactory = null; Session session = null; Transaction tx = null; try { sessionFactory = DUtils.getSessionFactory(); session = sessionFactory.getCurrentSession();//使用该方法,不需要再关闭session和sessionFactory,要不然会报错 //开启事务 tx = session.beginTransaction(); //增删改查方法编写的位置 //添加 User user = new User(); user.setUsername("王五"); user.setPassword("1234"); user.setAddress("中国"); session.save(user); //提交事务 tx.commit(); }catch(Exception e) { e.printStackTrace(); //回滚事务 tx.rollback(); } }