Hibernate的核心API
1.Configuration
用于
加载hibernate配置
①加载核心属性配置
hibernate.properties和hibernate.cfg.xml
//方式一:
去src 读取 hibernate.properties 属性配置文件Configuration cfg = new Configuration();
//方式二:去src读取 hibernate.cfg.xml
Configuration cfg = new Configuration().configure();
Configuration cfg = new Configuration().configure("自定义xml文件"); 去src 加载指定文件
②手动加载hbm映射配置,
持久化类与数据表的映射关系(*.hbm.xml 文件)
如果没有对PO类进行hbm映射,会报错 :
org.hibernate.MappingException: Unknown entity: cn.itcast.domain.Customer
那么我们可以手动加载其映射文件:
//方式一:
configuration.addResource("cn/itcast/domain/Customer.hbm.xml"); 加载hbm文件
//方式二:
configuration.addClass(Customer.class); 加载Class,自动搜索hbm映射文件
* 如果使用 hibernate.cfg.xml配置,将映射配置xml中 <mapping resource="cn/itcast/domain/Customer.hbm.xml"/>
2.SessionFactory
①
保存了当前的数据库配置信息和所有映射关系以及预定义的SQL语句
这个对象是线程安全的
//预定义SQL语句
<sql-query name="login">
<![CDATA[select * from user where username= ? and password =?]]>
</sql-query>
②
负责维护Hibernate的二级缓存 后面详细介绍
主要API
Session openSession() //随机从内部维护连接池中 获取一个连接,构造Session对象
Session getCurrentSession() //获得一个与线程绑定Session的对象 (ThreadLocal )
SessionFactory
内部维护数据库连接池,
很浪费资源,通常一个应用程序
只有一个
SessionFactory
对象
* 抽象一个HibernateUtils 工具类,确保只有一个SessionFactory (static )
HibernateUtils.java
/**
* Hibernate操作工具类,只创建一个SessionFactory
*/
public class HibernateUtils {
private static Configuration configuration;
private static SessionFactory sessionFactory;
static {
// 只对SessionFactory初始化一次
configuration = new Configuration().configure();
sessionFactory = configuration.buildSessionFactory();
}
/**
* 获得hibernate操作会话对象
* @return
*/
public static Session openSession() {
return sessionFactory.openSession();
}
}
SessionFactory 默认使用连接池时内置连接池,由DriverManagerConnectionProvider 类提供
* DriverManagerConnectionProvider 内部使用 DriverManager.getConnection 获得连接
配置c3p0连接池
第一步 导入 c3p0-0.9.1.jar(optional文件夹下面)
第二步 在hibernate.cfg.xml 修改连接提供者
<property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
第三步 (可选) 配置c3p0连接池属性
<property name="c3p0.min_size">5</property>
<property name="c3p0.max_size">20</property>
<property name="c3p0.timeout">120</property>
<property name="c3p0.idle_test_period">3000</property>
3.Session
代表hibernate操作会话对象,相当于Connection
session是一个单线程对象,线程不安全(在方法内部定义和使用Session,不会出现线程问题)
* 每个线程方法调用栈,是线程私有的
session 进行PO(Persistent Object)对象常见持久化操作, 存在一级缓存
常用API
save 完成插入
update 完成修改
delete 完成删除
get/load 根据主键字段查询
createQuery、 createSQLQuery 创建查询对象 Query 接收HQL, SQLQuery 接收SQL
createCriteria() 面向对象条件查询
4.Transaction 事务操作
commit 提交
rollback 回滚
如果没有开启事务,那么每个Session的操作,都相当于一个独立的事务
* 事务是否提交
//默认false
<property name="hibernate.connection.autocommit">false</property> 事务不提交
<property name="hibernate.connection.autocommit">true</property> 事务提交
5.Query
session.createQuery()获得
面向对象查询,操作类,操作属性
接收参数 HQL语句
开发代码步骤
获得Hibernate Session对象
编写HQL语句
调用session.createQuery 创建查询对象
如果HQL语句包含参数,则调用Query的setXXX设置参数
调用Query对象的list() 或uniqueResult() 方法执行查询
案例一 :查询所有数据 from Customer;
// 使用Query对象查询
@Test
public void testQuery() {
// 获得Session
Session session = HibernateUtils.openSession();
// 开启事务
Transaction transaction = session.beginTransaction();
// 1、 查询全部数据
String hql = "from Customer"; // from 类名; 查询对应表所有数据
Query query = session.createQuery(hql); // 创建Query对象
List<Customer> list = query.list();
System.out.println(list);
transaction.commit();
session.close();
}
案例二 :分页查询
setFirstResult(int firstResult) 设置返回结果从第几条开始
setMaxResults(int maxResults) 设置本次返回结果记录条数
// 使用Query对象查询
@Test
public void testQuery() {
// 获得Session
Session session = HibernateUtils.openSession();
// 开启事务
Transaction transaction = session.beginTransaction();
// 2 分页查询 (查询21-30条)
String hql = "from Customer";
Query query = session.createQuery(hql);
query.setFirstResult(20); // 索引20 代表 第21条
query.setMaxResults(10); // 查询10条
List<Customer> list = query.list();
System.out.println(list);
transaction.commit();
session.close();
}
案例三 :通过select关键字,查询指定属性对应列
select name,age from Customer; 返回每条数据 保存 Object[] ----- List<Object[]>
如果想将查询结果,保存Customer对象中
使用构造方法 !!!!! 在Customer类 定义name和age属性构造器 , select new Customer(name,age) from Customer
// 使用Query对象查询
@Test
public void testQuery() {
// 获得Session
Session session = HibernateUtils.openSession();
// 开启事务
Transaction transaction = session.beginTransaction();
// 3 查询返回指定列
name和age 是属性名
String hql = "select new Customer(name,age) from Customer";
Query query = session.createQuery(hql);
List<Customer> list = query.list();
System.out.println(list);
transaction.commit();
session.close();
}
案例四: 通过where语句 添加查询条件
无名字参数 from Customer where name= ? ; 设置参数 query.setParameter(0,"张三");
有名字参数 from Customer where name= :myname; 设置参数 query.setParameter("myname","张三");
// 使用Query对象查询
@Test
public void testQuery() {
// 获得Session
Session session = HibernateUtils.openSession();
// 开启事务
Transaction transaction = session.beginTransaction();
// 4 带有条件的查询
String hql = "from Customer where name = ? and age = ? "; // 匿名参数
Query query = session.createQuery(hql);
// 设置参数
query.setParameter(0, "张三");
query.setParameter(1, 20);
List<Customer> list = query.list();
System.out.println(list);
- --------------------------------------------------------------------------------------
String hql = "from Customer where name = :cname and age = :cage "; // 有名字参数
Query query = session.createQuery(hql);
// 设置参数
query.setParameter("cname", "张三");
query.setParameter("cage", 20);
List<Customer> list = query.list();
System.out.println(list);
transaction.commit();
session.close();
}
6.Criteria 接口(QBC查询 Query By Criteria )
主要为了解决多条件查询问题,以面向对象的方式添加条件,无需拼接HQL语句
获得对象
Criteria criteria = session.createCriteria(Customer.class);
开发代码步骤
获得Hibernate的Session对象
通过Session获得Criteria对象
使用Restrictions的静态方法创建Criterion条件对象
向Criteria对象中添加Criterion 查询条件
执行Criterita的 list() 或uniqueResult() 获得结果
* Criteria查询 可以实现和Query一样效果
案例一 查询所有
Criteria criteria = session.createCriteria(Customer.class);
// 使用Criteria查询
@Test
public void testCriteria() {
// 获得Session
Session session = HibernateUtils.openSession();
// 开启事务
Transaction transaction = session.beginTransaction();
// 1 查询全部数据
Criteria criteria = session.createCriteria(Customer.class);
List<Customer> list = criteria.list();
System.out.println(list);
transaction.commit();
session.close();
}
案例二 分页
criteria.setFirstResult(1);
criteria.setMaxResults(2);
// 使用Criteria查询
@Test
public void testCriteria() {
// 获得Session
Session session = HibernateUtils.openSession();
// 开启事务
Transaction transaction = session.beginTransaction();
// 2 分页查询
Criteria criteria = session.createCriteria(Customer.class);
criteria.setFirstResult(1);
criteria.setMaxResults(2);
List<Customer> list = criteria.list();
System.out.println(list);
transaction.commit();
session.close();
}
案例三 条件查询
criteria.add(Restrictions.eq("name", "李四"));
criteria.add(Restrictions.lt("age", 20));
criteria.add(Restrictions.like("name", "李%"));
// 使用Criteria查询
@Test
public void testCriteria() {
// 获得Session
Session session = HibernateUtils.openSession();
// 开启事务
Transaction transaction = session.beginTransaction();
// 3 带有条件的查询
Criteria criteria = session.createCriteria(Customer.class);
// 添加条件 姓名 :李四
criteria.add(Restrictions.like("name", "李%"));
// 添加条件 年龄 小于 20
criteria.add(Restrictions.lt("age", 20));
List<Customer> list = criteria.list();
System.out.println(list);
transaction.commit();
session.close();
}
** 当多条件组合查询时,criteria 更加方便