一,核心配置文件
1,Hibernate的映射文件*.hbm.xml
基本结构:
<?xml version="1.0" encoding="UTF-8" ?>
<!-- 映射文件的dtd信息 -->
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!--name 代表的是实体类名 table代表的是表名 -->
<class name="XXX" table="xxx">
<!-- name=id 代表i的是XXX类中的属性 column=id代表的是xxx表中的字段 -->
<id name="id" column="id">
<generator class="native"/> <!-- 主键生成策略 -->
</id>
<!-- 其他属性使用property标签来映射 -->
<property name="password" column="password" type="string"/>
</class>
</hibernate-mapping>
hibernate-mapping:该元素定义了XML配置文件的基本属性,他所定义的属性在映射文件的所有节点都有效
class:该元素用来声明一个持久化类,他是XML配置文件的主要内容
id:该元素用来设定持久化类的OID(对象标识符)和表的主键的映射
property:该元素用来将持久化类中的普通属性映射到数据库表对应的字段上
2,hibernate的配置文件hibernate.cfg.xml
基本结构:
<?xml version="1.0" encoding="UTF-8" ?>
<!-- 配置文件的dtd信息 -->
<!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://localhost:3306/hibernate
</property>
<!-- 用户名-->
<property name="hibernate.connection.username">
root
</property>
<!-- 密码 -->
<property name="hibernate.connection.password">
itcast
</property>
<!-- 其他配置 -->
<!-- 显示sql语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 格式化sql语句 -->
<property name="hibernate.format_sql">true</property>
<!-- 关联hbm配置文件 -->
<mapping resource="com/itcast/domain/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
Hibernate配置文件常用属性及用途:
名 称 | 用 途 |
---|---|
hibernate.dialect | 操作数据库方言 |
hibernate.connection.driver_class | 连接数据库驱动程序 |
hibernate.connection.url | 连接数据路URL |
hibernate.connection.username | 数据库用户名 |
hibernate.connection.password | 数据库密码 |
hibernate.show_sql | 在控制台上输出SQL语句 |
hibernate.format_sql | 格式化控制台输出的SQL语句 |
hibernate.hbm2ddl.auto | 当SessionFactory创建时是否根据映射文件自动验证表结构或自动创建, 自动更新数据库表结构。该参数的取值为validate,update,create和create-drop |
hibernate.connection.autocommit | 事物是否自动提交 |
二,Hibernate的核心API
在Hibernate中有6个常用的核心接口,分别是Configuration,SessionFactory,Session,Transaction,Query,Criteria
1,Configuration
在使用Hibernate时,首先要加载Configuration实例,Configuration实例主要用于启动,
加载,管理hibernate的配置文件。在启动Hibernate的过程中,Configuration实例首先确定
Hibernate配置文件的位置,然后读取相关配置,最后创建一个唯一的SessionFactory实例。
Configuration对象只存在于系统初始化阶段,它将SessionFactory创建完成后,就完成了使命
Hibernate通常使用
Configuration config = new Configuration().configure();
的方式
创建实例,此种方式默认会去src下读取hibernate.cfg.xml配置文件。如果不想使用默认的配置
文件,而是使用指定目录下的自定义的配置文件,则需要向configure()方法中传入一个文件路径
参数,代码如下:
Configuration config = new Configuration().configure("xml文件位置");
2,SessionFactory
SessionFactory接口负责Hibernate的初始化和建立Session对象。它在Hibernate中起到一个缓冲区的
作用,Hibernate可以将自动生成的SQL语句,映射数据以及某些可重复利用的数据放在这个缓冲区中。同时
它还保存了对数据库配置的所有映射关系,维护了当前的二级缓存。
获取方法为:
SessionFactory sessionFactory = config.buildSessionFactory();
SessionFactory具有以下特点:
- 它是线程安全的,它的同一个实例能够供多个线程共享
- 它是重量级的,不能随意地创建和销毁它的实例
由于这些特点,一般情况下,一个项目中只需要一个SessionFactory,只有当应用中存在多个数据源时,才为每个
数据源创建一个SessionFactory实例。因此在实际项目中,通常会抽取一个HibernateUtils的工具类,用来提供
Session对象:
public class HibernateUtils {
//声明一个私有静态final类型的Configuration对象
private static final Configuration config;
//声明一个私有静态final类型的SessionFactory对象
private static final SessionFactory factory;
//通过静态代码块构建SessionFactory
static{
config = new Configuration().configure();
factory = config.buildSessionFactory();
}
//提供一个共有静态方法供外部获取,并返回一个Session对象
public static Session getSession(){
return factory.openSession();
}
}
通过这个工具类,在项目可以直接通过HIbernateUtils.getSession()方式获取Session对象
3,Session
Session是应用程序与数据库之间交互操作的一个单线程对象,是Hibernate运作的中心,它的主要作用是为
持久化对象提供创建,读取和删除等功能,所有持久化对象必须在Session管理下才可以进行持久化操作
创建SessionFactory实例后,就可以通过它获取Session对象。获取Session有两种方法,如下:
Session session = sessionFactory.openSession();
Session session = sessionFactory.getCurrentSession();
第一种方法在创建实例时SessionFactory直接创建一个新的Session实例,并且在使用完后需要调用
close方法进行手动关闭
第二种方法创建的实例会被绑定到当前线程中,它在提交或回滚操作时会自动关闭
Session是线程不完全的,多个并发线程同时操作一个Session时,就可能造成数据存取混乱(方法内部
定义和使用Session时不会出现线程问题)。因此,因避免多个线程同时使用一个Session
在Session中提供了大量的常用方法:
- save(),update()和saveOrUpdate()方法:用于增加和修改对象
- delete()方法:用于删除对象
- get() 和load()方法:根据主键查询
- createQuery() 和createSQLQuery()方法:用于数据库操作对象
- createCriteria()方法:条件查询
4,Transaction
Transaction接口主要用于管理事物,它是Hibernate的数据库事物接口,且对底层的事物接口进行了封装。Transaction
接口的事物对象是通过Session对象开启的,其开启方式:
Transaction t = session.beginTransaction();
在Transaction接口,提供了事务管理的常用方法:
- commit()方法:提交相关联的Session实例
- rollback()方法:撤销事物操作
- wasCommitted()方法:检查事物是否提交
Session执行完数据库操作后,要使用Transaction接口的commit方法进行事物提交,才能真正将数据同步
到数据库中。发生异常时,需要使用rollback进行事物回滚,以避免数据发生错误。
5,Query
Query代表面向对象的一个Hibernate查询操作。在Hibernate中,通常使用session.createQuery()方法
接受一个HQL语句。然后调用Query的list()或uniqueResult()方法执行查询。
在Hibernate中使用Query对象的步骤:
(1)获得hibernate session 对象
(2)编写HQL语句
(3)调用session.createQuery创建查询对象
(4)如果HQL语句包含参数,则调用Query的setXxx设置参数
(5)调用Query对象的list()或uniqueResult()方法执行查询
下面同过一个案例来说明
在上个入门案例的项目下的com.itcast.test包下新建一个类QueryTest.java 入门案例链接
package com.itcast.test;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;
import com.itcast.domain.User;
public class QueryTest {
@Test
public void findAll_hqlTest(){
Configuration config = new Configuration().configure();
SessionFactory sessionFactory = config.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction t = session.beginTransaction();
String hql = "from User";
Query query = session.createQuery(hql);
List<User>list= query.list();
for(User user:list){
System.out.println(user);
}
t.commit();
session.close();
sessionFactory.close();
}
}
使用Junit测试该方法
数据库中的数据:
控制台输出的数据:
Query中除了使用list方法查询全部数据外,还有一些常用方法:
- setter方法:Query接口中提供了一系列的setter方法用于设置查询语句中的参数,针对
不同的数据类型,需要用到不同的setter方法
- iterator方法:该方法用于查询语句,该方法返回一个Iterator对象,在读取时只能按照顺序方法读取,它
仅把使用到的数据转换成java实体对象
- uniqueResult方法:该方法用于返回唯一结果,在确保只有一条记录的查询时可以使用该方法
- executeUpdate方法:该方法是Hibernate3的新特性,它支持HQL语句的更新和删除操作
- setFirstResult方法:该方法可以设置获取第一个记录的位置,也就是它表示从第几条记录开始查询,默认0
- setMaxResult方法:该方法用于设置结果集的最大记录数,通常与setFirstResult方法结合使用,限制结果集, 实现分页功能
6,Criteria
Criteria是一个完全面向对象,可扩展的条件查询API通过它完全不需要考虑数据库底层如何实现,以及SQL
语句如何编写,他是Hibernate框架的核心查询对象。
使用Criteria对象查询数据的主要步骤:
(1)获得Hibernate的Session对象
(2)通过Session获得Criteria对象
(3)使用Restrictions的静态方法创建Criterion对象
(4)向Criteria对象中添加Criterion查询条件。Criteria的add()方法用于加入查询条件
(5)执行Criteria的list或uniqueResult获得结果
下面通过一个案例来说明:
在入门案例的src目录下的com.itcast.test包下创建类CriteriaTest.java
package com.itcast.test;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.criterion.Restrictions;
import org.junit.Test;
import com.itcast.domain.User;
public class CriteriaTest {
@Test
public void qbcTest(){
Configuration config = new Configuration().configure();
SessionFactory sessionFactory= config.buildSessionFactory();
Session session= sessionFactory.openSession();
Transaction t = session.beginTransaction();
Criteria criteria = session.createCriteria(User.class);
criteria.add(Restrictions.eq("name", "tom"));
List<User>list =criteria.list();
for(User user:list){
System.out.println(user);
}
t.commit();
session.close();
sessionFactory.close();
}
}
用Junit测试运行:
控制台输出:
输出了name=tom 的信息