Hibernate 常用 API 简介

Hibernate 常用 API 简介

  • Configuration
  • Session
  • SessionFactory
  • Transaction
  • Query
  • Criteria

Configuration

对象 加载配置
new Configuration().configure() hibernate.cfg.xml
new Configuration() hibernate.properties
new Configuration().configure(custom.xml) custom.xml( 自定义 )

核心配置文件可以是hibernate.cfg.xmlhibernate.properties,使用hibernate.cfg.xml时,只需将其放在src目录下,并在其中通过mapping标签配置实体类映射文件(xxx.hbm.xml),而使用hibernate.properties不能直接配置,需要通过java代码引入:

Configuration config = new Configuration().configure();
//config.addResource("xxx.hbm.xml");//方式一:绝对路径
config.addClass(Customer.class);//方式二:配置文件和Bean同名通包

SessionFactory

SessionFactory sessionFactory = config.getSessionFactory();
方法 操作
openSession() 获取一个新的Session,完成后要手动关闭
getCurrentSession() 从连接池中获取Session,与线程绑定(线程安全),事务结束后会自动关闭

SessionFactory并不是轻量级的,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。web项目中,可以通过监听器的配置,让SessionFactory对象在服务器启动时的初始化,也可以用一下方式在需要时初始化:

package org.xinyo.utils;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtils {
  private static Configuration configuration = new Configuration().configure();
  private static SessionFactory sessionFactory = configuration.buildSessionFactory();

  private HibernateUtils() {}

  /**
   * 获取session
   */
  public static Session openSession() {
    return sessionFactory.openSession();
  }
}

使用c3p0连接池

默认情况下,hibernate 使用内置连接池,如果需要使用c3p0为线程池提供者,需要手动配置:

<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>

Session

session本身线程不安全。

方法 操作
save(Object) 保存对象
update(Object) 修改对象
delete(Object) 删除对象
get/load(Class, id) 根据id进行查询
saveOrUpdate(Object) 执行save或update方法
createQuery(String hql) 获取一个query对象
createSQLQuery(String sql) 获取一个可以操作sql的SQLQuery对象
createCriteria() 获取一个Criteria可以完成条件查询

Transaction

Transaction是hibernate的事务接口,对底层的事务进行了封装。

显式开启事务:Session.openTransaction();

方法 操作
commit 提交
rollback 回滚

未显式开启事务,每一个Session操作为单独的一个事务,在默认情况下事务不会自动提交,需要在核心配置文件中配置hibernate.connection.autocommite为ture(默认为false)。

Query

Query接口方便了查询操作,可以使用hql或原生sql语句进行查询,但使用hibernate时不推荐sql方式查询,面向对象的hql更为方便。

以下示例中默认存在一个名为Customer的JavaBean

Query query = Session.createQuery(hql);
SQLQuery sqlQuery = Session.createSQLQuery(sql);

查询所有Customer

Query query = session.createQuery("from Customer");//Customer是Bean
List<Customer> list = query.list();

分页查询

Query query = session.createQuery("from Customer");
query.setFirdtResult(beginIndex); //开始,不包括本条
query.setMaxResults(countNumber); //页长
List<Customer> list = query.list();

查询指定列信息

Query query = session.createQuery("select name from Customer");
List<Object[]> list = query.list();

投影查询

Query query = session.createQuery("select new Customer(name,address) from Customer");
List<Customer> list = query.list();

需要在Customer类中构造对应的有参构造器Customer(name,address),不要忘记添加一个默认无参构造器。无显示构造器时,会有一个默认的无参构造器,添加任何构造器后就不存在隐式无参构造器了。

条件查询

where 关键字

Query query = createQuery("from Customer where name=?")//无名称参数
query.setParameter(0,"xxx") //索引从0开始,jdbc从1开始
//List<Customer> list = query.list();//一个或多个结果
Customer customer = query.uniqueResult; //前提是保证唯一结果

有名称参数

Query query = createQuery("from Customer where name=:myname");//有名称参数
query.setParameter("myname","xxx");

原生SQL的执行

查询所有

SQLQuery sqlQuery = session.createSQLQuery("select * from t_customer");
//List<Object[]> list = sqlQuery.list(); //默认封装成Object数组
sqlQuery.addEntity(Customer.class);//
List<Customer> list = sqlQuery.list();

条件查询

SQLQuery sqlQuery = session.creatSQLeQuery("select * from t_customer where name=?");
sqlQuery.setParameter(0,"xxx");
sqlQuery.addEntity(Customer.class);
Customer customer = sqlQuery.uniqueResult;

Criteria

将面向对象的方式应用地更彻底,非常适合多条件查询

查询所有

Criteria criteria = session.createCriteria(Customer.class);
List<Customer> list = criteria.list();

分页查询

criteria.setFirstResult(beginIndex);
criteria.setMaxResults(countNumber);
List<Customer> list = criteria.list();

多条件查询

1.查询name=’xxx’

criteria.add(Restrictions.eq("name", "xxx")); // where name='xxx';
List<Customer> list = criteria.list();

2.查询address=’上海’

criteria.add(Restrictions.eq("address", "上海"));
Customer customer = (Customer) criteria.uniqueResult();//前提保证唯一结果

3.查询name=’xxx’ 或者 address=’上海’

criteria.add(Restrictions.or(Restrictions.eq("name","xxx"),Restrictions.eq("address","上海")));
...//可以多次应用add方法,简便多条件查询
List<Customer> list = criteria.list();