06---Hibernate的核心API

3人阅读 评论(0) 收藏 举报
分类:

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 更加方便
查看评论

java核心API

1:学习的流程图 2: java.lang包 java.lang 包中的 Integer 类、Long 类和 Short 类都是 Number 的子类,他们的区别在于不同子类里...
  • liuhenggchao186
  • liuhenggchao186
  • 2016-07-25 19:38:54
  • 1249

Mybatis学习笔记-核心API简介

MyBaits
  • u012302681
  • u012302681
  • 2015-04-25 20:20:15
  • 1335

Hibernate核心API

Configuration类: Configuration对象用于配置和启动Hibernate。Hibernate应用通过Configuration实例来指定对象-关系映射文件的位置或者动态配置Hi...
  • u012505903
  • u012505903
  • 2014-11-30 11:31:30
  • 834

Java核心API必须掌握的程度

Java的核心API是非常庞大的,这给开发者来说带来了很大的方便。其中的一些内容是必须掌握的。   1、java.lang包下的80%以上的类的功能的灵活运用。 2、java.uti...
  • lchb_ok
  • lchb_ok
  • 2014-11-22 10:13:24
  • 2860

JAVA_JDK核心API

  • 2011年09月21日 22:58
  • 1.17MB
  • 下载

hibernate核心API介绍

1.1. 对象的三种状态 临时状态(瞬时状态): 指的是该对象不受session对象管理,没有id值,刚刚被new创建出来的。 持久化状态: 通过session对象的save、saveOrUp...
  • myz7758
  • myz7758
  • 2017-04-11 14:29:59
  • 160

Neo4J核心API

•GraphDatabaseService •Transaction beginTx() •Node createNode() •Node getNodeById(long i...
  • ngbfers
  • ngbfers
  • 2013-03-08 09:37:38
  • 498

Hibernate核心API的详解

ConfigurationConfiguration cfg = new Configuration(); cfg.configure();1. 到src下面找到名称hibernate.cfg.xml...
  • JeffCHP
  • JeffCHP
  • 2017-02-19 16:51:31
  • 296

Hibernate 核心的API

Configuration cfgConfiguration=new Configuration(); SessionFactory s = cfgConfiguration.configure(...
  • dare_
  • dare_
  • 2014-02-20 12:50:55
  • 1242

java基础巩固---JDBC的接口核心API

java.sql.* 和 javax.sql.* |-Driver接口:表示java驱动程序接口。所有的具体的数据库厂商要来实现此接口。 |-connect(url,properties):链接数...
  • yuexianchang
  • yuexianchang
  • 2016-12-07 19:59:28
  • 428
    个人资料
    等级:
    访问量: 5584
    积分: 719
    排名: 7万+
    文章存档