Hibernate常用API
Hibernate的核心类和接口一共有6个,分别为:Session、SessionFactory、Transaction、Query、Criteria和Configuration
1. Configuration
Configuration config=new Configuration(); // 主要加载的是src目录下的hibernate.properties配置文件
public class HibernateTest {
// 测试手动加载映射配置文件
@Test
public void test() {
// 1.创建Configuration来加载配置文件
Configuration config = new Configuration().configure();
// 手动加载映射(可以省略,因为在hibernate核心配置文件中已经配置过,也就是mapping resource里面)
config.addResource("cn/itheima/domain/Customer.hbm.xml"); // 直接加载映射配置文件
// 2.得到SessionFactory
SessionFactory sessionFactory = config.buildSessionFactory();
// 3.得到Session
Session session = sessionFactory.openSession();
// 开启事务
session.beginTransaction();
Customer c = session.get(Customer.class, 1);
System.out.println(c);
// 事务提交
session.getTransaction().commit();
// 关闭Session
session.close();
// 关闭SessionFactory
sessionFactory.close();
}
}
2. SessionFactory
SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。
这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。
首先SessionFactory它的获取是通过Configuration得到:
// 1.创建Configuration来加载配置文件
Configuration config = new Configuration().configure();
// 2.得到SessionFactory
SessionFactory sessionFactory = config.buildSessionFactory();
SessionFactory内部还维护了一个连接池,如果我们要想使用c3p0连接池,应该怎样做昵?也即在Hibernate中如何使用c3p0连接池?
1.导入c3p0相关的jar包
2. 在hibernate.cfg.xml文件中配置c3p0连接池
<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<!-- C3P0连接池的配置 -->
<property name="hibernate.c3p0.max_size">20</property> <!-- 最大连接数 -->
<property name="hibernate.c3p0.min_size">5</property> <!-- 最小连接数 -->
<property name="hibernate.c3p0.timeout">120</property> <!-- 超时时间 -->
<property name="hibernate.c3p0.idle_test_period">3000</property> <!-- 空闲连接(等待)时间,以秒为单位 -->
3. Session
Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句)。但需要注意的是Session对象是非线程安全的。
通过SessionFactory获得Session的两种方式:
SessionFactory.openSession();
:相当于直接通过SessionFactory创建一个新的Session,使用完成后要手动调用close()方法来关闭。SessionFactory.getCurrentSession();
:获取一个与线程绑定的Session,当我们提交事务或事务回滚后会自动关闭。
Session的常用方法
save()
:保存对象update ()
:修改操作delete()
:删除get()/load()
:根据id进行查询avenOrUpdate()
:执行save或update操作createQuery()
:获取一个Query对象-
CreateSQLQUery()
:获取一个可以操作SQL的SQLQuery对象 createCriteria()
:取一个Criteria对象,它可以完成条件查询
4. Transaction
Transaction接口主要用于管理事务,它是Hibernate的事务接口,对底层的事务进行了封装。使用它可以进行事务操作。例如:
- 事务提交:commit()
- 事务回滚:rollback()
问题一:如何获取一个Transaction对象昵?可通过如下代码获得:
Transaction transaction = session.beginTransaction();
问题二:如果在程序中没有开启事务,是否存在事务?存在事务,默认session的每一个操作就会开启一个事务。并且默认情况下事务是不会自动提交的。相当于在Hibernate的核心配置文件中又如下配置:
<!-- 用于设置事务提交方式,默认是不自动提交的 -->
<property name="hibernate.connection.autocommit">false</property>
如果我们将其修改为:
<property name="hibernate.connection.autocommit">true</property>
则此时事务就会自动提交。
5. Query
Query接口让你方便地对数据库及持久对象进行查询,它可以有两种表达方式:HQL语言或本地数据库的SQL语句。Query经常被用来绑定查询参数、限制查询记录数量,并最终执行查询操作。
通过Query即可以执行hql语句:
Query query = session.createQuery("hql语句");
又可以执行本地sql语句:
SQLQuery sqlQuery = session.createSQLQuery("本地sql语句");
其中SQLQuery是Query的子类。
1 查询所有操作
使用HQL语句完成查询所有客户的操作,代码如下:
public class HibernateTest {
// 使用hql完成查询所有操作
@Test
public void test() {
Session session = HibernateUtils.openSession();
Query query = session.createQuery("from Customer"); // from后面是类名
List<Customer> list = query.list();
System.out.println(list);
session.close();
}
}
2 分页查询
public class HibernateTest {
// 分页查询
// 一页显示10条,要得到第二页数据
@Test
public void test() {
Session session = HibernateUtils.openSession();
session.beginTransaction();
// 一页显示10条,要得到第二页数据
Query query = session.createQuery("from Customer");
query.setFirstResult(10); // 从第几条开始,即开始位置,从0开始计数
query.setMaxResults(10); // 本次查询结果回显的条数
List<Customer> list = query.list();
System.out.println(list);
session.getTransaction().commit();
session.close();
}