Hibernate的核心API
一般我们通过hibernate进行操作的时候,都会遵循下面的流程,那么接下来我对每一个步骤进行讲解:
1 public void testInsert() { 2 //(1) 实例化配置对象 加载映射文件 加载 hibernate.cfg.xml 3 Configuration configuration = new Configuration().configure(); 4 //(2)创建会话工厂 5 SessionFactory sessionFactory = configuration.buildSessionFactory(); 6 //(3) 创建会话 7 Session session = sessionFactory.openSession(); 8 //(4) 开启事务 9 Transaction transaction = session.beginTransaction(); 10 11 /* 12 *编写自己的逻辑代码 13 */ 14 15 // 提交事务 16 transaction.commit(); 17 session.close(); 18 sessionFactory.close(); 19 }
(1) 实例化配置对象 configuration
这一步是用来加载核心配置文件
核心配置有两种:
hibernate.properties
加载:Configuration configuration = new Configuration();
hibernate.cfg.xml:
加载:Configuration configuration = new Configuration().configure();
(2)创建会话工厂 sessionFactory
Configuration对象根据当前的配置信息生成 SessionFactory对象,
SessionFactory 对象中保存了当前的数据库配置信息和所有映射关系以及预定义的SQL语句
SessionFactory 对象是线程安全的,SessionFactory还负责维护Hibernate的二级缓存,
SessionFactory对象根据数据库信息,维护连接池,创建Session(相当于Connection)对象
(3)创建会话 session对象(相当于 JDBC的 Connection)
Session 是应用程序与数据库之间交互操作的一个单线程对象,是 Hibernate 运作的中心,是线程不安全的
所有持久化对象必须在 session 的管理下才可以进行持久化操作,Session 对象有一个一级缓存
显式执行 flush 之前,所有的持久化操作的数据都缓存在 session 对象处,持久化类与 Session 关联起来后就具有了持久化的能力,
Session维护了Hiberante一级缓存.
session对象提供了许多的方法来实现增删改差:
save()/persist() :添加
update() :修改
saveOrUpdate() :增加和修改对象
delete() :删除对象
get()/load() :根据主键查询
createQuery() :创建一个Query接口,编写HQL语句
createSQLQuery() :创建一个SQLQuery接口,编写SQL语句数据库操作对象
createCriteria() :返回一个Criteria接口.条件查询
(4)提取工具类
因为我们在项目开发中经常需要进行相关增删改查的操作,所以都需要这个session对象,这个时候我们可以把她变成一个工具类
1 public class HibernateUtils { 2 3 private static Configuration configuration; 4 5 private static SessionFactory sessionFactory; 6 7 static{ 8 configuration=new Configuration().configure(); 9 10 sessionFactory=configuration.buildSessionFactory(); 11 } 12 public static Session getSession(){ 13 return sessionFactory.openSession(); 14 } 15 } 16 /* 17 *通过这个工具类,只要你每次HibernateUtils.getSession 18 *就可以获得session对象 19 */
(5) 开启事务 Transaction 对象
获得:Transaction tx = session.beginTransaction();
常用方法:
commit() :提交相关联的session实例
rollback() :撤销事务操作
wasCommitted() :检查事务是否提交
如果没有开启事务,那么每个Session的操作,都相当于一个独立的事务
6.Query 对象
Query代表面向对象的一个Hibernate查询操作
session.createQuery 接收一个HQL语句
HQL是Hibernate Query Language缩写, 语法很像SQL语法,但是完全面向对象的
举例
//1.查询所有的数据 public void testQuery(){ //这里就是通过足记编写的工具类,来获得session对象 Session session=HibernateUtils.getSession(); Transaction transaction =session.beginTransaction(); String hql="from Customer"; //类名 Query query =session.createQuery(hql); List<Customer> customers=query.list(); System.out.println(customers); transaction.commit(); session.close(); } }
查询所有的数据
//批量插入数据 public void testBathInsert(){ Session session=HibernateUtils.getSession(); Transaction transaction =session.beginTransaction(); for(int i=0;i<1000;i++){ Customer customer =new Customer(); customer.setName("小明_"+i); customer.setAddr("余杭区_"+i); customer.setCity("杭州_"+i); customer.setAge(i); session.save(customer); } transaction.commit(); session.close();
批量插入数据
1 //分页查询 2 public void testQueryByPage(){ 3 Session session=HibernateUtils.getSession(); 4 Transaction transaction =session.beginTransaction(); 5 6 //查询所有数据 7 String hql=" from Customer"; 8 Query query =session.createQuery(hql); 9 10 //设置查询条件 11 query.setFirstResult(20);//设置开始查询的位置 12 query.setMaxResults(20);//要查询的长度 13 14 List<Customer> customers =query.list(); 15 System.out.println(customers); 16 17 18 transaction.commit(); 19 session.close(); 20 }
分页查询
1 //通过select关键字 查询指定的属性和对应的列 2 public void testQuerySelect(){ 3 Session session=HibernateUtils.getSession(); 4 Transaction transaction =session.beginTransaction(); 5 //这里既然是new Customer(name,age),那么就需要通过这样的构造函数 6 String hql="select new Customer(name,age) from Customer"; 7 8 Query query =session.createQuery(hql); 9 10 List<Customer> customers =query.list(); 11 System.out.println(customers); 12 13 transaction.commit(); 14 session.close(); 15 }
选择特定的列
1 //通过where条件 2 public void testQueryParamter(){ 3 Session session=HibernateUtils.getSession(); 4 Transaction transaction =session.beginTransaction(); 5 6 String hql="from Customer where name=? and age=?"; 7 8 Query query =session.createQuery(hql); 9 query.setParameter(0, "小明_4"); 10 query.setParameter(1, 4); 11 12 List<Customer> customers =query.list(); 13 System.out.println(customers); 14 15 transaction.commit(); 16 session.close(); 17 }
where条件查询
7.Criteria(条件查询接口)
可以实现和Query一样的效果
举例
1 // 查询所有 2 public void testQueryAll() { 3 4 // 获取Session对象 5 Session session = HibernateUtils.getSession(); 6 //开启事务 7 Transaction transaction =session.beginTransaction(); 8 // 9 Criteria criteria =session.createCriteria(Customer.class); 10 11 List<Customer> customers =criteria.list(); 12 System.out.println(customers); 13 14 transaction.commit(); 15 session.close(); 16 }
查询所有
1 //分页查询 2 public void testQueryByPage(){ 3 // 获取Session对象 4 Session session = HibernateUtils.getSession(); 5 //开启事务 6 Transaction transaction =session.beginTransaction(); 7 8 Criteria criteria =session.createCriteria(Customer.class); 9 criteria.setFirstResult(30); 10 criteria.setMaxResults(20); 11 12 List<Customer> customers =criteria.list(); 13 System.out.println(customers); 14 15 transaction.commit(); 16 session.close();
分页查询
1 //条件查询 2 public void testQueryByCondition(){ 3 // 获取Session对象 4 Session session = HibernateUtils.getSession(); 5 //开启事务 6 Transaction transaction =session.beginTransaction(); 7 Criteria criteria =session.createCriteria(Customer.class); 8 9 //创建条件对象 10 Criterion criterion =Restrictions.eq("name", "小明_4"); 11 12 //把查询条件对象加载到查询对象 13 criteria.add(criterion); 14 15 List<Customer> customers =criteria.list(); 16 System.out.println(customers); 17 18 transaction.commit(); 19 session.close(); 20 }
条件查询
这篇文字就讲到这了,欢迎大家多多指点,谢谢!