Hibernate的核心API
Configuration:负责管理Hibernate的配置信息
1.加载核心配置文件
核心配置有两种:
hibernate.properties
加载:Configuration configuration = new Configuration();
hibernate.cfg.xml:
加载:Configuration configuration = new Configuration().configure();
2.加载映射文件
第一种写法:
configuration.addResource("cn/yzu/hibernate3/demo1/Customer.hbm.xml");
第二种写法:(要求:映射文件名称要规范,类与映射在同一个包下)
configuration.addClass(Customer.class);
SessionFactory:Session工厂
Configuration对象根据当前的配置信息生成 SessionFactory对象,SessionFactory 对象中保存了当前的数据库配置信息和所有映射关系以及预定义的SQL语句
SessionFactory 对象是线程安全的,SessionFactory还负责维护Hibernate的二级缓存,SessionFactory对象根据数据库信息,维护连接池,创建Session(相当于Connection)对象
抽取工具类
public class HibernateUtils { private static Configuration configuration; private static SessionFactory sessionFactory; static{ configuration = new Configuration().configure(); sessionFactory = configuration.buildSessionFactory(); } public static Session openSession(){ return sessionFactory.openSession(); } public static void main(String[] args) { openSession(); } }
在Hibernate中使用c3p0连接池
引入c3p0的jar包:c3p0-0.9.1.jar
在核心配置中添加一段配置:
<!-- C3P0连接池设定--> <!-- 使用c3po连接池 配置连接池提供的供应商--> <property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider </property> <!--在连接池中可用的数据库连接的最少数目 --> <property name="c3p0.min_size">5</property> <!--在连接池中所有数据库连接的最大数目 --> <property name="c3p0.max_size">20</property> <!--设定数据库连接的过期时间,以秒为单位, 如果连接池中的某个数据库连接处于空闲状态的时间超过了timeout时间,就会从连接池中清除 --> <property name="c3p0.timeout">120</property> <!--每3000秒检查所有连接池中的空闲连接 以秒为单位--> <property name="c3p0.idle_test_period">3000</property>
Session(相当于 JDBC的 Connection)
Session 是应用程序与数据库之间交互操作的一个单线程对象,是 Hibernate 运作的中心,是线程不安全的,所有持久化对象必须在 session 的管理下才可以进行持久化操作,Session 对象有一个一级缓存,显式执行 flush 之前,所有的持久化操作的数据都缓存在 session 对象处,持久化类与 Session 关联起来后就具有了持久化的能力,Session维护了Hiberante一级缓存.
方法:
save()/persist() :添加
update() :修改
saveOrUpdate() :增加和修改对象
delete() :删除对象
get()/load() :根据主键查询
createQuery() :创建一个Query接口,编写HQL语句
createSQLQuery() :创建一个SQLQuery接口,编写SQL语句数据库操作对象
createCriteria() :返回一个Criteria接口.条件查询
Transaction
获得:Transaction tx = session.beginTransaction();
常用方法:
commit() :提交相关联的session实例
rollback() :撤销事务操作
wasCommitted() :检查事务是否提交
如果没有开启事务,那么每个Session的操作,都相当于一个独立的事务
Query
Query代表面向对象的一个Hibernate查询操作
session.createQuery 接收一个HQL语句
HQL是Hibernate Query Language缩写, 语法很像SQL语法,但是完全面向对象的
例子:
// 1.简单查询 List<Customer> list = session.createQuery("from Customer").list(); // 2.条件查询: List<Customer> list = session.createQuery("from Customer where name = ?").setParameter(0, "芙蓉").list(); // 3.分页查询:select * from customer limit a,b; a:从哪开始 b:每页显示记录数. Query query = session.createQuery("from Customer"); query.setFirstResult(3); query.setMaxResults(3); List<Customer> list = query.list();
Criteria(条件查询接口)
// 1.简单查询 List<Customer> list = session.createCriteria(Customer.class).list(); // 2.条件查询: Criteria criteria = session.createCriteria(Customer.class); criteria.add(Restrictions.eq("name","芙蓉")); List<Customer> list = criteria.list(); // 3.分页查询: Criteria criteria = session.createCriteria(Customer.class); criteria.setFirstResult(3); criteria.setMaxResults(3); List<Customer> list = criteria.list();