一、什么是hibernate
1.对象与关系型数据之间的映射管理框架
2.ORM框架/持久层框架
ORM (Object Relational Mapping) : 对象关系映射
优点:跨数据库的无缝移植 (SqlServet、Oracle、MySql)
二、如何在项目中添加hibernate(5.2.12.Final)支持(手动添加)
- 添加hibernate相关依赖
- 在resource目录下添加hibernate.cfg.xml(核心配置文件)
2.1. 添加DTD支持
2.2. 添加Hibernate的配置 mysql的jar使用5.x即可
2.2.1 数据库相关
(connection.username|connection.password|connection.url|connection.driver_class|dialect)
2.2.2 调试相关(show_sql|format_sql)
2.2.3 实体相关(实体类必须事先Serializable接口)
- 实体映射文件一定要加到核心配置文件 (hibernate.cfg.xml(1)/*.hbm.xml(N))一对N
hibernate.cfg.xml
<!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>
<!--1. 数据库相关 -->
<!-- connection.username| connection.password| connection.url| connection.driver_class|
dialect -->
<property name="connection.username">root</property>
<property name="connection.password">123</property>
<property name="connection.url">jdbc:mysql://localhost:3306/j2ee?useUnicode=true&characterEncoding=UTF-8</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 2.调试相关 -->
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<!-- 开启二级缓存 -->
<property name="hibernate.cache.use_second_level_cache">true</property>
<!-- 开启查询缓存 -->
<property name="hibernate.cache.use_query_cache">true</property>
<!-- EhCache驱动 -->
<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
<!-- 3.实体类映射文件 -->
<mapping resource="entity/User.hbm.xml" />
<mapping resource="entity/Order.hbm.xml" />
<mapping resource="entity/OrderItem.hbm.xml" />
<mapping resource="entity/Book.hbm.xml" />
<mapping resource="entity/Category.hbm.xml" />
</session-factory>
</hibernate-configuration>
User.cfg.xml
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="entity.User" table="t_user">
<id name="id" column="id" type="java.lang.Integer">
<generator class="increment"></generator>
</id>
<version name="version" type="java.lang.Integer"></version>
<property name="userName" column="user_name" type="java.lang.String"></property>
<property name="userPwd" column="user_pwd" type="java.lang.String"></property>
<property name="realName" column="real_name" type="java.lang.String"></property>
<property name="sex" column="sex" type="java.lang.String"></property>
<property name="birthday" column="birthday" type="java.sql.Date"></property>
<property insert="false" update="false" name="createDatetime" column="create_datetime" type="java.sql.Timestamp"></property>
<property name="remark" column="remark" type="java.lang.String"></property>
</class>
</hibernate-mapping>
三、如何使用hibernate完成CRUD操作
- 读取配置
- 创建SessionFac
- 打开Session
- 开启事务
- CURD
- 提交事务/回滚事
- 关闭Session
注意事项
8. hibernate默认使用的是手动事务,因此必须显示的开启和提交事务
9. 删除/修改操作时,必须先查再删
四、工具类SessionFactoryUtil
package utils;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class SessionFactoryUtil {
public static Configuration configuration;
public static SessionFactory sessionFactory;
public static ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
static {
configuration = new Configuration();
configuration.configure("hibernate.cfg.xml");
sessionFactory = configuration.buildSessionFactory();
}
/**
* 获取与数据交互的session对象
*
* @return
*/
public static Session getSession() {
// 从线程找session
Session session = threadLocal.get();
// 没有找到就在sessionFactory里得到一个session
if (null == session) {
session = sessionFactory.openSession();
threadLocal.set(session);
}
return session;
}
/**
* 关闭会话
*/
public static void closeSession() {
// 从线程找session
Session session = threadLocal.get();
// 没有找到就在sessionFactory里得到一个session
if (null != session) {
session.close();
threadLocal.set(null);
}
}
public static void main(String[] args) {
Session session = SessionFactoryUtil.getSession();
System.out.println(session.isConnected());
SessionFactoryUtil.closeSession();
System.out.println(session.isConnected());
}
}
五、主键生成策略
hibernate的主键生成器:
- generator元素:表示了一个主键生成器,它用来为持久化类实例生
成唯一的标识 。
主键生成器要求:
- assigned: 数据类型不限、保存前必须赋值
- identity: 数字,无需赋值
- sequence: 数字,无需赋值, 默认使hibernate_sequence这个序列,
也可以通过sequence/sequence_name参数赋值 - increment: 数字,无需赋值
- uuid/uuid.hex (是由容器自动生成的一个32位的字符串,.hex代表的是十六进制):32位的字符串,无需赋值
- native:identity+sequence
自定义主键生成器 - *.hbm.xml(实体映射文件)指定主键生成器类:(class中放全路径名)
- 创建主键生成器类:实现org.hibernate.id.IdentifierGenerator接口即
可,并还可以实现org.hibernate.id.Configurable接口来读取一些配置信息(PersistentIdentifierGenerator.TABLE,
PersistentIdentifierGenerator.PK)