版权声明:本文为 小异常 原创文章,非商用自由转载-保持署名-注明出处,谢谢!
本文网址:https://blog.csdn.net/sun8112133/article/details/106151264
通过上篇 HelloWorld 博客我们已经大致了解了 Hibernate 这款全自动化框架的执行流程。
本篇博客主要介绍 Hibernate 中的两类配置文件:核心配置文件 和 映射文件(这两类配置文件的文件名一般要遵循相应的规范)。
一、核心配置文件
Hibernate 核心配置文件 的模板在
project\etc
目录中。
1、Hibernate 的核心配置方式
1)方式一:属性配置文件(hibernate.properties,不推荐使用)
hibernate.connection.driver_class=com.mysql.jdbc.Driver
...
hibernate.show_sql=true
注意: 属性配置文件的文件名是:hibernate.properties
。这种方式一般不使用,因为它不能引入映射文件,还得手动编写代码来加载映射文件,过程过于繁琐。
2)方式二:XML配置文件(hibernate.cfg.xml,推荐使用)
XML 配置文件的文件名是:
hibernate.cfg.xml
,我们一般推荐大家使用这种方式。
<?xml version="1.0" encoding="UTF-8"?>
<!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.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///sys</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123456</property>
<!-- 配置Hibernate的方言 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 可选配置================ -->
<!-- 打印SQL -->
<property name="hibernate.show_sql">true</property>
<!-- 格式化SQL -->
<property name="hibernate.format_sql">true</property>
<!-- 自动创建表 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 配置C3P0连接池 -->
<property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<!--在连接池中可用的数据库连接的最少数目 -->
<property name="c3p0.min_size">5</property>
<!--在连接池中所有数据库连接的最大数目 -->
<property name="c3p0.max_size">20</property>
<!--设定数据库连接的过期时间,以秒为单位,
如果连接池中的某个数据库连接处于空闲状态的时间超过了timeout时间,就会从连接池中清除 -->
<property name="c3p0.timeout">120</property>
<!--每3000秒检查所有连接池中的空闲连接 以秒为单位-->
<property name="c3p0.idle_test_period">3000</property>
<!-- 设置事务隔离级别 -->
<property name="hibernate.connection.isolation">4</property>
<!-- 配置当前线程绑定的 Session -->
<property name="hibernate.current_session_context_class">thread</property>
<!-- 引入映射 -->
<mapping resource="com/domain/Customer.hbm.xml"/>
<mapping resource="com/domain/LinkMan.hbm.xml"/>
</session-factory>
</hibernate-configuration>
2、核心配置
1)必要配置
A. 连接数据库的基本参数
- 驱动类(
hibernate.connection.driver_class
) - URL(
hibernate.connection.url
) - 用户名(
hibernate.connection.username
) - 密码(
hibernate.connection.password
)
<!-- 连接数据库的基本参数 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///sys</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123456</property>
B. Hibernate 方言(hibernate.dialect
)
Hibernate 方言 简单的说就是设置使用的数据库语言,这样 Hibernate 在底层就能转换成对应数据库的 SQL 语言。
<!-- 配置 Hibernate 的 MySQL 方言 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
2)可选配置
A. 显示 SQL(hibernate.show_sql
)
是否在控制台上显示相应的 SQL 语句。
B. 格式化 SQL(hibernate.format_sql
)
是否美化控制台上的 SQL 语句。
C. 自动建表(hibernate.hbm2ddl.auto
)
通过此配置可以使用 Hibernate 来创建或更新数据表。其中
hbm2ddl
是指可以根据映射文件转为 DDL 语言(数据库模式定义语言 ),它里面的2
代表 to。它有以下五个值:
none
:默认值,不使用 Hibernate 的自动建表功能;create
:如果数据库中已经有表,则删除原有表,然后再重新创建;如果数据库中没有表,则新建表。此值一般测试的时候会使用;create-drop
:如果数据库中已经有表,则删除原有表,然后执行后面的语句,再删除这个表;如果数据库中没有表,则新建一个表,使用完了再删除该表。此值一般测试的时候会使用,使用此值时必须把 SessionFactory 关闭,若不关闭则会报错;update
:如果数据库中有表,就使用原有表;如果数据库中没有表,则创建新表;validate
:如果数据库中没有表,就不会创建表,它只会使用数据库中原有的表,但是它使用的时候会校验映射和表结构。
D. 配置连接池
<!-- 配置C3P0连接池 -->
<property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<!--在连接池中可用的数据库连接的最少数目 -->
<property name="c3p0.min_size">5</property>
<!--在连接池中所有数据库连接的最大数目 -->
<property name="c3p0.max_size">20</property>
<!--设定数据库连接的过期时间,以秒为单位,
如果连接池中的某个数据库连接处于空闲状态的时间超过了timeout时间,就会从连接池中清除 -->
<property name="c3p0.timeout">120</property>
<!--每3000秒检查所有连接池中的空闲连接 以秒为单位-->
<property name="c3p0.idle_test_period">3000</property>
E. 事务隔离级别(hibernate.connection.isolation
)
事务的隔离级别有四个,它们在程序中用四个数字进行表示,它们分别是:
- 读未提交:Read uncommitted isolation,它用
1
表示;- 读已提交:Read committed isolation,它用
2
表示;- 可重复读:Repeatable read isolation,它用
4
表示;- 序列化:Serializable isolation,它用
8
表示。
<!-- 设置事务隔离级别 为 可重复读 -->
<property name="hibernate.connection.isolation">4</property>
F. 当前线程绑定的 Session(hibernate.current_session_context_class
)
在 Hibernate 中可以指定 Session 管理方式,它的可选值有:
thread
:Session 对象的生命周期与本地线程绑定;jta
:Session 对象的生命周期与 JTA 事务绑定;managed
:Hibernate 委托程序来管理 Session 对象的生命周期。
<!-- 配置当前线程绑定的 Session -->
<property name="hibernate.current_session_context_class">thread</property>
3)引入映射文件
在配置文件中引入映射文件只能通过 XML 配置文件 的方式,如:
<mapping resource="com/demo/domain/Customer.hbm.xml" />
二、映射文件
映射文件 是将 Java 中的实体类与数据库中的表建立映射关系的配置文件,它的文件名格式是:
类名.hbm.xml
。它有几个常用标签:
1、class 标签
class 标签是用来建立类与表的映射关系。它的常用属性有:
name
:类的全类名,如:name="com.demo.Student"
;table
:表名。如果类名和表名一致,table
属性可以省略,如:table="s_student"
;catelog
:数据库名。这个属性可以不用写,因为在核心配置文件中已经配置过了,如果一个项目中用到了多个数据库,该属性才发挥作用,如:catelog="sys"
。
2、id 标签
id 标签是用来建立类中的
id
属性与表中主键字段的对应关系。它的常用属性有:
-
name
:类中的属性名; -
column
:表中的字段名。如果类中的属性名和表中的字段名一致,column
属性可以省略; -
length
:字段长度。我们一般通过 Hibernate 建表时需要用到此属性; -
type
:类型。这个属性不需要自己去写,Hibernate 可以自动进行转换。此类型有三种写法:-
Java 类型:
type="java.lang.String"
-
Hibernate 类型:
type="string"
-
数据库类型:
<property name="cust_name" length="32"> <column name="cust_name" sql-type="varchar"></column> </property>
-
3、property 标签
property 标签是用来建立类中的普通属性与表字段的对应关系。id 标签 与 property 标签十分类似,相同的属性我就不进行过多介绍了。它的常用属性有:
name
:类中的属性名;column
:表中的字段名。如果类中的属性名和表中的字段名一致,column
属性可以省略;length
:字段长度。我们一般通过 Hibernate 建表时需要用到此属性;type
:这个属性不需要自己去写,Hibernate 可以自动进行转换;not-null
:是否允许为空(数据表里是非空约束)。not-null='true'
;unique
:是否唯一(数据表里是唯一约束)。unique="true"
。
4、实例代码
<!-- 建立类与表的映射 -->
<class name="com.hibernate.demo1.Customer" table="cst_customer">
<!-- 建立类中的属性与表中的主键对应 -->
<id name="cust_id" column="cust_id">
<!-- 主键都有生成策略 native: 本地策略 -->
<generator class="native" />
</id>
<!-- 建立类中的普通属性和表字段的对应 -->
<property name="cust_name" column="cust_name" />
<property name="cust_source" column="cust_source" />
<property name="cust_industry" column="cust_industry" />
<property name="cust_level" column="cust_level" />
<property name="cust_phone" column="cust_phone" />
<property name="cust_mobile" column="cust_mobile" />
</class>