为什么要统一管理hirbate的sessionfactory?、
SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。
这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。
创建sessionfactory的工具类统一管理?
public class HibernateUtils { // SessionFactory全局只需要有一个就可以了 private static SessionFactory sessionFactory; static { // 初始化SessionFactory sessionFactory = new Configuration()// .configure()// .buildSessionFactory(); } /** * 获取全局唯一的SessionFactory * * @return */ public static SessionFactory getSessionFactory() { return sessionFactory; } /** * 从全局唯一的SessionFactory中打开一个Session * * @return */ public static Session openSession() { return sessionFactory.openSession(); } }
使用sessionfactory进行CRUD操作
1.先创建一个DAO对象
public class UserDao { /** * 保存 * * @param user */ public void save(User user) { Session session = HibernateUtils.openSession(); try { Transaction tx = session.beginTransaction(); // 开始事务 session.save(user); tx.commit(); // 提交事务 } catch (RuntimeException e) { session.getTransaction().rollback(); // 回滚事务 throw e; } finally { session.close(); // 关闭Session } } /** * 更新 * * @param user */ public void update(User user) { Session session = HibernateUtils.openSession(); Transaction tx = null; try { tx = session.beginTransaction(); session.update(user); // 操作 tx.commit(); } catch (RuntimeException e) { tx.rollback(); throw e; } finally { session.close(); } } /** * 删除 * * @param id */ public void delete(int id) { Session session = HibernateUtils.openSession(); Transaction tx = null; try { tx = session.beginTransaction(); Object user = session.get(User.class, id); // 要先获取到这个对象 session.delete(user); // 删除的是实体对象 tx.commit(); } catch (RuntimeException e) { tx.rollback(); throw e; } finally { session.close(); } } /** * 根据id查询一个User数据 * * @param id * @return */ public User getById(int id) { Session session = HibernateUtils.openSession(); Transaction tx = null; try { tx = session.beginTransaction(); User user = (User) session.get(User.class, id); // 操作 tx.commit(); return user; } catch (RuntimeException e) { tx.rollback(); throw e; } finally { session.close(); } } /** * 查询所有 * * @return */ public List<User> findAll() { Session session = HibernateUtils.openSession(); Transaction tx = null; try { tx = session.beginTransaction(); // 方式一:使用HQL查询 // List<User> list = session.createQuery("FROM User").list(); // 方式二:使用Criteria查询 Criteria criteria = session.createCriteria(User.class); List<User> list = criteria.list(); tx.commit(); return list; } catch (RuntimeException e) { tx.rollback(); throw e; } finally { session.close(); } }
2.。创建测试类进行测试
public class UserDaoTest { private UserDao userDao = new UserDao(); @Test public void testSave_1() { User user = new User(); user.setName("张三"); // 保存 userDao.save(user); } @Test public void testGetById() { User user = userDao.getById(2); System.out.println(user); } @Test public void testUpdate() { // 从数据库获取一条存在的数据 User user = userDao.getById(2); user.setName("李四"); // 更新 userDao.update(user); } @Test public void testDelete() { userDao.delete(1); } // ------------ @Test public void testSave_25() { for (int i = 1; i <= 25; i++) { User user = new User(); user.setName("test_" + i); userDao.save(user); // 保存 } } @Test public void testFindAll() { List<User> list = userDao.findAll(); for (User user : list) { System.out.println(user); } }这样通过一个sessionfactory的简单的增删改查就完成了。