Hibernate 主要的 API 详解
org.hibernate.cfg.Configuration
-
加载主配置文件以及映射文件,启动 hibernate。
-
主配置文件中主要有:数据库连接四要素,方言,数据源…
-
默认获取 hibernate.cfg.xml 配置文件
Configuration configer = new Configuration().configure();
- 如果配置文件名称有改变,则用带参数的构造器。
Configuration configer = new Configuration().configure();
SessionFactory接口
- 用来获取和管理我们的seesion,它在hibernate中其实是相当于一个缓冲区的作用(一个数据库对应一个sessionFactory)
// 2.创建sessionFactory
SessionFactory sessionFactory = configer.buildSessionFactory();
-
这个接口是hibernate的一个重量级对象,系统开销大(重要)。
-
它是单例的,但是它是线程安全的(它的大多数成员变量都是final,高并发和集群的时候不会产生数据不统一)
Session接口
-
应用程序和数据库的一次交互(会话),每次执行一个数据库的事务,都要创建新的session实例,用完以后需要关闭,不关闭,session 会不够用,内存会崩溃。
-
一个轻量级的接口,它是多例的,但是它是线程不安全的。
-
session对象获取的两种方式:
- sessionFactory.getCurrentSession(); 获取当前线程中的 session, 会自动关闭 session。
- sessionFactory.openSession() 创建一个新的 session 对象,需要我们手动关闭 session。
- 如果要保证一个线程一个session,所以需要在hibernate.cfg.xml里面配置:
<property name="hibernate.current_session_context_class">thread</property>
transaction接口
-
事务的开启
session.beginTransaction();``````session.getTransaction().begin();
-
事务的提交
session.getTransaction().commit();
-
事务的回滚
session.getTransaction().rollback();
hibernate.cfg.xml 详解
数据库连接配置
- 在hibernate.cfg.xml里面配置数据库的四要素
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hib</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123</property>
- 通过hibernate.properties文件进行配置
hibernate.connection.driver_class=com.mysql.jdbc.Driver
hibernate.connection.url=jdbc:mysql://localhost:3306/hib
hibernate.connection.username=root
hibernate.connection.password=123
注意:当 cfg 配置文件和 properties 文件同时配置了数据库信息的时候,cfg 配置文件优先。
数据源的配置
- 我们一般会用c3p0的数据源管理 详见hibernate.cfg.xml文件
<!-- 用C3P0的数据源连接方式 -->
<property name="hibernate.connection.provider_class">org.hibernate.c3p0.internal.C3P0ConnectionProvider</property>
- 在我们没有单独配置数据源管理的时候 ,它会用hibernate自带的数据源(not for product use - 不要在正式 的产品上面用,仅用于测试)
方言
-
不同的数据库会存在一些语法上的差异,而方言是解决这种差异的一种手段
<!-- 数据库方言 --> <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
-
解决hql翻译成sql,保证语法上的正确
自动建表配置
create 表示无论有没有对应的表都会先删除表,然后再创建,然后再向里面插入数据。
update 表示有表的时候不会创建表,只会更新表中原有数据,没有表的时候才会创建表。
<property name="hibernate.hbm2ddl.auto">update/create</property>
加入映射文件
<mapping resource="com/tz/hibernatestudy/sysmanage/entity/student.hbm.xml" />
持久化对象与数据库表的映射文件 xxx.hbm.xml 详解
<?xml version="1.0" encoding="UTF-8"?>
<!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="com.lyu.hibernate.sysmanage.entity.Student" table="t_student">
<id name="stId" column="st_id">
<generator class="native"></generator>
</id>
<property name="stName" column="st_name"></property>
<property name="stAge" column="st_age"></property>
</class>
</hibernate-mapping>
class 标签包含两个映射关系
一个是 持久化对象和数据库表的映射关系
一个是持久化对象属性与数据库表字段的映射关系
hibernate 映射文件中内置主键的生成策略
<id name = "stId" column = "ST_ID">
<generator class="native"></generator>
</id>
id 的生成策略有如下几种方式:
- increment:hibernate 自己维护主键的值,每次插入之前,max(ST_ID)+1,不适合高并发和集群环境。
- identity:数据库自身的增长来维护主键值 如 mysql 的auto_increment。
- sequence:在数据库中创建一个序列,hibenate 会调用序列来维护主键 ,oracle 比较实用。
- native:它会根据使用的数据库类型,从 identity 和 sequence 两种方式选取 一种合适的。
- uuid:采用 uuid(universally unique identifier) 算发来生成一个唯一识别码:ip 地址 + jvm 启动时间 + 当前系统时间 + 计数器 = 32 位。
- assigned:由程序自己设置id值,比如身份证,学好之类的业务编码。