06---Hibernate的核心API

Hibernate的核心API

1.Configuration 
    用于 加载hibernate配置
    加载核心属性配置 hibernate.properties和hibernate.cfg.xml
 
   
  1. //方式一src 读取 hibernate.properties 属性配置文件
  2. Configuration cfg = new Configuration();  
  3. //方式二src读取 hibernate.cfg.xml  
  4. Configuration cfg = new Configuration().configure();  
  5.  Configuration cfg = new Configuration().configure("自定义xml文件"); src 加载指定文件 
  
     手动加载hbm映射配置, 持久化类与数据表的映射关系(*.hbm.xml 文件)
如果没有对PO类进行hbm映射,会报错 : 
 
   
  1. org.hibernate.MappingException: Unknown entity: cn.itcast.domain.Customer 
          那么我们可以手动加载其映射文件:
 
  
  1. //方式一:
  2. configuration.addResource("cn/itcast/domain/Customer.hbm.xml"); 加载hbm文件 
  3. //方式二:
  4. configuration.addClass(Customer.class); 加载Class,自动搜索hbm映射文件
     * 如果使用 hibernate.cfg.xml配置,将映射配置xml中 <mapping resource="cn/itcast/domain/Customer.hbm.xml"/>
  
2.SessionFactory
     保存了当前的数据库配置信息和所有映射关系以及预定义的SQL语句 这个对象是线程安全的
 
  
  1. //预定义SQL语句
  2. <sql-query name="login">
  3.     <![CDATA[select * from user where username= ? and password =?]]>
  4. </sql-query>

     负责维护Hibernate的二级缓存      后面详细介绍
主要API
 
   
  1. Session openSession()  //随机从内部维护连接池中 获取一个连接,构造Session对象
  2. Session getCurrentSession() //获得一个与线程绑定Session的对象 ThreadLocal
     SessionFactory 内部维护数据库连接池, 很浪费资源,通常一个应用程序 只有一个 SessionFactory 对象
* 抽象一个HibernateUtils 工具类,确保只有一个SessionFactory (static )
     HibernateUtils.java
 
   
  1. /**
  2. * Hibernate操作工具类,只创建一个SessionFactory
  3. */
  4. public class HibernateUtils {
  5. private static Configuration configuration;
  6. private static SessionFactory sessionFactory;
  7. static {
  8. // 只对SessionFactory初始化一次
  9. configuration = new Configuration().configure();
  10. sessionFactory = configuration.buildSessionFactory();
  11. }
  12. /**
  13. * 获得hibernate操作会话对象
  14. * @return
  15. */
  16. public static Session openSession() {
  17. return sessionFactory.openSession();
  18. }
  19. }

    SessionFactory 默认使用连接池时内置连接池,由DriverManagerConnectionProvider 类提供 
* DriverManagerConnectionProvider 内部使用 DriverManager.getConnection 获得连接 

    配置c3p0连接池  
第一步 导入 c3p0-0.9.1.jar(optional文件夹下面)
第二步 在hibernate.cfg.xml 修改连接提供者
 
  
  1. <property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
第三步 (可选) 配置c3p0连接池属性 
 
  
  1. <property name="c3p0.min_size">5</property>
  2. <property name="c3p0.max_size">20</property>
  3. <property name="c3p0.timeout">120</property>
  4. <property name="c3p0.idle_test_period">3000</property>

3.Session
     代表hibernate操作会话对象,相当于Connection 
session是一个单线程对象,线程不安全(在方法内部定义和使用Session,不会出现线程问题)
* 每个线程方法调用栈,是线程私有的 
session 进行PO(Persistent Object)对象常见持久化操作, 存在一级缓存

    常用API 
 
  
  1. save 完成插入
  2. update 完成修改
  3. delete 完成删除
  4. get/load 根据主键字段查询
  5. createQuery createSQLQuery 创建查询对象 Query 接收HQL SQLQuery 接收SQL
  6. createCriteria()  面向对象条件查询

4.Transaction 事务操作
commit 提交
rollback 回滚 

    如果没有开启事务,那么每个Session的操作,都相当于一个独立的事务
* 事务是否提交 
 
   
  1. //默认false 
  2. <property name="hibernate.connection.autocommit">false</property> 事务不提交
  3. <property name="hibernate.connection.autocommit">true</property> 事务提交 

5.Query
    session.createQuery()获得
面向对象查询,操作类,操作属性
接收参数 HQL语句 
 
   
  1. 开发代码步骤
  2.     获得Hibernate Session对象
  3.     编写HQL语句
  4.     调用session.createQuery 创建查询对象
  5.     如果HQL语句包含参数,则调用QuerysetXXX设置参数
  6.     调用Query对象的list() uniqueResult() 方法执行查询

    案例一 :查询所有数据 from Customer;
 
   
  1. // 使用Query对象查询
  2. @Test
  3. public void testQuery() {
  4. // 获得Session
  5. Session session = HibernateUtils.openSession();
  6. // 开启事务
  7. Transaction transaction = session.beginTransaction();
  8. // 1、 查询全部数据
  9. String hql = "from Customer"; // from 类名; 查询对应表所有数据
  10. Query query = session.createQuery(hql); // 创建Query对象
  11. List<Customer> list = query.list();
  12. System.out.println(list);
  13. transaction.commit();
  14. session.close();
  15. }

    案例二 :分页查询 
setFirstResult(int firstResult) 设置返回结果从第几条开始
setMaxResults(int maxResults) 设置本次返回结果记录条数
 
   
  1. // 使用Query对象查询
  2. @Test
  3. public void testQuery() {
  4. // 获得Session
  5. Session session = HibernateUtils.openSession();
  6. // 开启事务
  7. Transaction transaction = session.beginTransaction();
  8. // 2 分页查询 (查询21-30条)
  9. String hql = "from Customer";
  10. Query query = session.createQuery(hql);
  11. query.setFirstResult(20); // 索引20 代表 第21条
  12. query.setMaxResults(10); // 查询10条
  13. List<Customer> list = query.list();
  14. System.out.println(list);
  15. transaction.commit();
  16. session.close();
  17. }

    案例三 :通过select关键字,查询指定属性对应列
select name,age from Customer; 返回每条数据 保存 Object[] ----- List<Object[]>
               如果想将查询结果,保存Customer对象中 
                    使用构造方法 !!!!! 在Customer类 定义name和age属性构造器 , select new Customer(name,age) from Customer 
 
   
  1. // 使用Query对象查询
  2. @Test
  3. public void testQuery() {
  4. // 获得Session
  5. Session session = HibernateUtils.openSession();
  6. // 开启事务
  7. Transaction transaction = session.beginTransaction();
  8. // 3 查询返回指定列
  9. nameage 是属性名
  10. String hql = "select new Customer(name,age) from Customer";
  11. Query query = session.createQuery(hql);
  12. List<Customer> list = query.list();
  13. System.out.println(list);
  14. transaction.commit();
  15. session.close();
  16. }

    案例四: 通过where语句 添加查询条件
无名字参数 from Customer where name= ? ;  设置参数 query.setParameter(0,"张三");
有名字参数 from Customer where name= :myname;  设置参数 query.setParameter("myname","张三");
 
  
  1. // 使用Query对象查询
  2. @Test
  3. public void testQuery() {
  4. // 获得Session
  5. Session session = HibernateUtils.openSession();
  6. // 开启事务
  7. Transaction transaction = session.beginTransaction();
  8. // 4 带有条件的查询
  9. String hql = "from Customer where name = ? and age = ? "; // 匿名参数
  10. Query query = session.createQuery(hql);
  11. // 设置参数
  12. query.setParameter(0, "张三");
  13. query.setParameter(1, 20);
  14. List<Customer> list = query.list();
  15. System.out.println(list);
  16. --------------------------------------------------------------------------------------
  17. String hql = "from Customer where name = :cname and age = :cage "; // 有名字参数
  18. Query query = session.createQuery(hql);
  19. // 设置参数
  20. query.setParameter("cname", "张三");
  21. query.setParameter("cage", 20);
  22. List<Customer> list = query.list();
  23. System.out.println(list);
  24. transaction.commit();
  25. session.close();
  26. }

6.Criteria 接口(QBC查询 Query By Criteria )
    主要为了解决多条件查询问题,以面向对象的方式添加条件,无需拼接HQL语句 
    获得对象   
 
  
  1. Criteria criteria = session.createCriteria(Customer.class);
     开发代码步骤 
 
   
  1. 获得HibernateSession对象
  2. 通过Session获得Criteria对象
  3. 使用Restrictions的静态方法创建Criterion条件对象
  4. Criteria对象中添加Criterion 查询条件
  5. 执行Criterita list() uniqueResult() 获得结果

    * Criteria查询 可以实现和Query一样效果 

    案例一 查询所有 
Criteria criteria = session.createCriteria(Customer.class);
 
   
  1. // 使用Criteria查询
  2. @Test
  3. public void testCriteria() {
  4. // 获得Session
  5. Session session = HibernateUtils.openSession();
  6. // 开启事务
  7. Transaction transaction = session.beginTransaction();
  8. // 1 查询全部数据
  9. Criteria criteria = session.createCriteria(Customer.class);
  10. List<Customer> list = criteria.list();
  11. System.out.println(list);
  12. transaction.commit();
  13. session.close();
  14. }

    案例二 分页 
criteria.setFirstResult(1);
criteria.setMaxResults(2);
 
   
  1. // 使用Criteria查询
  2. @Test
  3. public void testCriteria() {
  4. // 获得Session
  5. Session session = HibernateUtils.openSession();
  6. // 开启事务
  7. Transaction transaction = session.beginTransaction();
  8. // 2 分页查询
  9. Criteria criteria = session.createCriteria(Customer.class);
  10. criteria.setFirstResult(1);
  11. criteria.setMaxResults(2);
  12. List<Customer> list = criteria.list();
  13. System.out.println(list);
  14. transaction.commit();
  15. session.close();
  16. }

    案例三 条件查询
criteria.add(Restrictions.eq("name", "李四"));
criteria.add(Restrictions.lt("age", 20));
criteria.add(Restrictions.like("name", "李%"));
 
   
  1. // 使用Criteria查询
  2. @Test
  3. public void testCriteria() {
  4. // 获得Session
  5. Session session = HibernateUtils.openSession();
  6. // 开启事务
  7. Transaction transaction = session.beginTransaction();
  8. // 3 带有条件的查询
  9. Criteria criteria = session.createCriteria(Customer.class);
  10. // 添加条件 姓名 :李四
  11. criteria.add(Restrictions.like("name", "李%"));
  12. // 添加条件 年龄 小于 20
  13. criteria.add(Restrictions.lt("age", 20));
  14. List<Customer> list = criteria.list();
  15. System.out.println(list);
  16. transaction.commit();
  17. session.close();
  18. }

    ** 当多条件组合查询时,criteria 更加方便
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值