一、Hibernate的API介绍
1、Configuration对象
Hibernate框架的配置对象,主要用于解析Hibernate配置文件和持久化映射文件中的信息,最重要的功能是用来创建SessionFactory对象(配置文件都要存放在classpath根路径)
- 方式一:把所有的配置信息全部放在hibernate.cfg.xml文件中
<!--
~ Hibernate, Relational Persistence for Idiomatic Java
~
~ License: GNU Lesser General Public License (LGPL), version 2.1 or later.
~ See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
-->
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!--配置数据库连接的信息-->
<!--数据库连接方言-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!--数据库驱动类名-->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!--数据库连接账户-->
<property name="hibernate.connection.url">jdbc:mysql:///hibernateDemo?useSSL=true&serverTimezone=UTC</property>
<!--数据库连接账户-->
<property name="hibernate.connection.username">root</property>
<!--数据库连接密码-->
<property name="hibernate.connection.password">admin</property>
<!--引用xml-->
<mapping resource="com/revanwang/_01/crud/domain/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
//1、创建配置对象
Configuration cfg = new Configuration();
//2、读取配置文件
cfg.configure("/hibernate.cfg.xml");
- 方法二:把基本配置信息全部放在hibernate.properties中,而在hibernate.cfg.xml文件中引入映射文件的配置
- hibernate.properties
#数据库方言
hibernate.dialect=org.hibernate.dialect.MySQLDialect
#数据库驱动类名
hibernate.connection.driver_class=com.mysql.jdbc.Driver
#数据库连接账户
hibernate.connection.url=jdbc:mysql:///hibernateDemo?useSSL=true&serverTimezone=UTC
#数据库连接账户
hibernate.connection.username=root
#数据库连接密码
hibernate.connection.password=admin
- hibernate.cfg.xml
<!--
~ Hibernate, Relational Persistence for Idiomatic Java
~
~ License: GNU Lesser General Public License (LGPL), version 2.1 or later.
~ See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
-->
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!--引用xml-->
<mapping resource="com/revanwang/_01/crud/domain/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
2、SessionFactory对象
- 1、负责创建Session对象
- 2、数据库的连接信息是配置SessionFactory
- 3、SessionFactory是线程安全的,Session是线程不安全的,SessionFactory的创建需要很大的系统开销,实际上在创建sessionFactory的时候才会去连接数据库,一般的,针对一个应用,一个数据库服务器,只需要一个SessionFactory实例就够了
- 4、SessionFactory的创建session对象的重要方法:openSession和getCurrentSession
- 4.1:openSession:这个方法代表开启一个全新的Session对象(测试环境使用)。
- 4.1.1:全新的连接
- 4.1.2:全新的事务
- 4.1.3:全新的一级缓存。
- 4.2:getCurrentSession:得到当前的上下文中的session,绑定当前线程(开发环境)。
- 4.2.1:如果当前上下文中存在session,则使用该session
- 4.2.2:如果当前上下文中不存在session,则使用openSession创建一个新的session
- 4.2.3:要使用getCurrentSession,必须在hibernate.cfg.xml中配置
- 4.1:openSession:这个方法代表开启一个全新的Session对象(测试环境使用)。
<property name="hibernate.current_session_context_class">thread</property>
- 5、getCurrentSession得到的session是和事务绑定的(spring集成Hibernate的方式)
- 5.1:无论是DML还是DQL,都必须开启事务
- 5.2:当事务提交的时候,session就关闭了,此时就不需要人为的调用session.close()
3、Session对象
- 1、包含了操作数据的很多方法:save/update/delete/get/currentQuery/beginTransaction/getTransaction
- 2、session不是线程安全的,所以session的最大生命周期,一个线程在web应用当中,一个session的最大生命周期request
- 3、Session中有一个缓存,称为一级缓存。存放当前工作单元加载的对象。在一个session的生命周期之内,连续拿到相同类型,相同ID的对象,只会发送一次SQL
- 4、一级缓存能提高一定的性能,但是有限
- 5、session加载出来的对象,都存放于一级缓存中进行管理
- 6、清除一级缓存的方法
- 6.1:clear():清空一级缓存所有对象
- 6.2:evict(Object obj):从一级缓存中清除指定的对象
Session分析一级缓存
在一个session的生命周期之内,连续拿到相同类型,相同ID的对象,只会发送一次SQL
- 设置显示SQL语句(hibernate.properties)
#数据库方言
hibernate.dialect=org.hibernate.dialect.MySQLDialect
#数据库驱动类名
hibernate.connection.driver_class=com.mysql.jdbc.Driver
#数据库连接账户
hibernate.connection.url=jdbc:mysql:///hibernateDemo?useSSL=true&serverTimezone=UTC
#数据库连接账户
hibernate.connection.username=root
#数据库连接密码
hibernate.connection.password=admin
#配置getCurrentSession
hibernate.current_session_context_class=thread
#显示SQL语句
hibernate.show_sql=true
#格式化显示SQL语句
hibernate.format_sql=true
- 获取id=1时
@Override
public User get(Long id) {
//4、获取Session
Session session = HibernateUtil.getHibernateSession();
session.beginTransaction();
//5、具体的查询操作
User user = (User) session.get(User.class, 1L);
session.getTransaction().commit();
return user;
}
- 打印SQL语句
Hibernate:
select
user0_.id as id1_0_0_,
user0_.name as name2_0_0_,
user0_.date as date3_0_0_
from
t_user user0_
where
user0_.id=?
- 获取id=1L、id=3L时
@Override
public User get(Long id) {
//4、获取Session
Session session = HibernateUtil.getHibernateSession();
session.beginTransaction();
//5、具体的查询操作
User user = (User) session.get(User.class, 1L);
User user1 = (User) session.get(User.class, 3L);
session.getTransaction().commit();
return user;
}
- 打印SQL语句
Hibernate:
select
user0_.id as id1_0_0_,
user0_.name as name2_0_0_,
user0_.date as date3_0_0_
from
t_user user0_
where
user0_.id=?
Hibernate:
select
user0_.id as id1_0_0_,
user0_.name as name2_0_0_,
user0_.date as date3_0_0_
from
t_user user0_
where
user0_.id=?
- 获取id=1L、id=1L时:
@Override
public User get(Long id) {
//4、获取Session
Session session = HibernateUtil.getHibernateSession();
session.beginTransaction();
//5、具体的查询操作
User user = (User) session.get(User.class, 1L);
User user1 = (User) session.get(User.class, 1L);
session.getTransaction().commit();
return user;
}
- 打印SQL语句
Hibernate:
select
user0_.id as id1_0_0_,
user0_.name as name2_0_0_,
user0_.date as date3_0_0_
from
t_user user0_
where
user0_.id=?
Session缓存.png
- clear清除一级缓存中所有对象的缓存
public User get(Long id) {
//4、获取Session
Session session = HibernateUtil.getHibernateSession();
session.beginTransaction();
//5、具体的查询操作
User user = (User) session.get(User.class, 1L);
//清除一级缓存中所有的缓存
session.clear();
User user1 = (User) session.get(User.class, 1L);
session.getTransaction().commit();
return user;
}
Hibernate:
select
user0_.id as id1_0_0_,
user0_.name as name2_0_0_,
user0_.date as date3_0_0_
from
t_user user0_
where
user0_.id=?
Hibernate:
select
user0_.id as id1_0_0_,
user0_.name as name2_0_0_,
user0_.date as date3_0_0_
from
t_user user0_
where
user0_.id=?
- evict:从一级缓存中清除指定对象的缓存
public User get(Long id) {
//4、获取Session
Session session = HibernateUtil.getHibernateSession();
session.beginTransaction();
//5、具体的查询操作
User user = (User) session.get(User.class, 1L);
//清除一级缓存中所有的缓存
session.evict(user);
User user1 = (User) session.get(User.class, 1L);
session.getTransaction().commit();
return user;
}
Hibernate:
select
user0_.id as id1_0_0_,
user0_.name as name2_0_0_,
user0_.date as date3_0_0_
from
t_user user0_
where
user0_.id=?
Hibernate:
select
user0_.id as id1_0_0_,
user0_.name as name2_0_0_,
user0_.date as date3_0_0_
from
t_user user0_
where
user0_.id=?
4、Transaction对象:代表对象事务的封装
- 1、session.beginTransaction() 设置当前事务为活动状态
- 2、session.getTransaction() 得到当前sessin上面已经活动的事务状态。注意,在调用这个方法之前必须调用beginTransaction()方法;该方法得到的对象永远不会为空
- 3、session.getTransaction().commit():提交事务
- 4、session.getTransaction().rollback():回滚事务
5、Query查询
@Override
public void queryList(String hql) {
Session session = HibernateUtil.getHibernateSession();
Query query = session.createQuery(hql);
query.setString(0, "%西夏%");
query.setLong(1, 1L);
query.setLong(2, 10L);
List<User> list = query.list();
for (User user : list) {
System.out.println(user);
}
}
6、Criteria查询
@Override
public void criteriaList() {
Session session = HibernateUtil.getHibernateSession();
Criteria criteria = session.createCriteria(User.class);
//设置约束条件
criteria.add(Restrictions.like("name", "西夏", MatchMode.ANYWHERE));
criteria.add(Restrictions.between("id", 1L, 10L));
List<User> list = criteria.list();
for (User user : list) {
System.out.println(user);
}
}
网友评论