一、基础使用
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的 orm 框架,hibernate 可以自动生成SQL语句,自动执行。
1. 持久化类创建
设计原则:
- 必需为公有类 public,且含公有不带参构造方法
- 类内部属性私有,提供 setter/getter 封装
2. 创建对象关系映射文件-Clazz.hbm.xml
- < hibernate-mapping >
属性名称 | 描述 |
---|---|
schema | 模式名称 |
catalog | 目录名称 |
default-cascade | 级联风格 |
default-access | 访问策略 |
default-lazy | 加载策略 |
package | 默认包名 |
- < class >
属性名称 | 描述 |
---|---|
name | 映射类名 |
table | 映射表名 |
batch-size | 抓取策略 |
where | 抓取条件 |
entity-name | 多表映射 |
- < id >
属性名称 | 描述 |
---|---|
name | 映射属性名 |
type | 映射属性类型 |
column | 映射表中对应的字段名称 |
length | 指定长度 |
< generator> | 主键生成策略,如下常用 assigned:手工赋值 native:自动增长,覆盖手工赋值 |
- < component >
属性名称 | 描述 |
---|---|
name | 映射组件名 |
column | 映射表中对应的字段名称 |
- < property >
属性名称 | 描述 |
---|---|
name | 映射属性名 |
column | 映射表中对应的字段名称 |
3. 配置文件(常用配置)-hibernate.cfg.xml
属性名字 | 描述 | 使用 |
---|---|---|
show_sql | 控制台 log 输出 | true/false |
format_sql | 控制台 log 排版 | true/false |
hbm2ddl.auto | 数据处理与表结构生成 | create: 每次删除原有表,再创建新的表 update:在原有表上更新数据 create-drop:创建后删除 validate:表结构验证,一致的条件下创建 |
default_schema | 默认数据库,创建前缀表名称 | [schema_name] |
dialect | 数据库方言 |
<session-factory>
<!-- 数据库用户名 -->
<property name="connection.username">root</property>
<!-- 数据库用户名 -->
<property name="connection.password">666666</property>
<!-- 数据库驱动类 -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- 数据库连接URL -->
<property name="connection.url">jdbc:mysql://localhost:3306/db_examsystem</property>
<!-- 数据库方言 -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="hbm2ddl.auto">create</property>
<!-- 关联对象关系映射文件 -->
<mapping resource="Clazz.hbm.xml"/>
</session-factory>
4. 事务处理
Hibernate 对数据的操作均封装与事务当中按,且默认非自动提交(无启动事务提交则无法将数据存储值数据库当中)
4.1 Session
- 获取方式(默认)-openSession
<!-- 需手动关闭,获取新的 session 对象 -->
<property name="hibernate.current_session_context_class">jta</property>
- 获取方式-getCurrentSession()
<!-- 自动关闭,获取原有 session 对象 -->
<property name="hibernate.current_session_context_class">thread</property>
- 常用操作
- save:存储记录
- get:获取记录(调用时获取,记录不存在返回 null)
- load:获取记录(使用时获取,记录不存在抛异常)
- update:更新记录
- delete:删除
4.2 Transaction
mSession.doWork(new Work() {
@Override
public void execute(Connection connection) throws SQLException {
connection.setAutoCommit(true);// 实现自动提交
};
});
mSession.save(student);
mSession.flush();
或开启事务实现数据提交存储
mTransaction = mSession.beginTransaction();// 开启
// ...
mTransaction.commit();// 提交
二、表映射
1. 一对多 one2many
- 模拟当个课室中多个学生的场景,gId 为关联外键
<hibernate-mapping>
<class name="[packname].Grade" table="grade">
<id name="gId" type="int">
<column name="gId" />
<generator class="native" />
</id>
<set name="students" table="student" inverse="false" cascade="save-update" lazy="true">
<key>
<column name="gId" />
</key>
<one-to-many class="[packname].Student" />
</set>
</class>
</hibernate-mapping>
- < set >常用属性
属性名称 | 描述 |
---|---|
name | 映射类属性的名称 |
table | 关联类的目标数据库表 |
lazy | 指定关联对象是否使用延迟加载 |
inverse | 标识双向关联中被动的一方false/负责维护的一方true |
cascade | all:对所有炒作进行级联炒作 save-update:执行保存和更新操作是进行级联操作 delete:执行删除操作时进行级联操作 none:对所有操作不进行级联操作 |
2. 多对一 many2one
- 模拟多个学生在同一教室的场景,gId 为关联外键
<hibernate-mapping>
<class name="[packname].Student" table="student">
<id name="sId" type="int">
<column name="sId" />
<generator class="native" />
</id>
<many-to-one name="grade" class="[packname].Grade" column="gId" cascade="all"/>
</hibernate-mapping>