核心的配置文件:
1: 文件命名:
src: 类路径(**一定要遵循命名规范)
文件的名称固定: hibernate.cfg.xml
2:核心:
xml声明部分: 引入了一个dtd文件:
配置的内容:
必须参数: 连接数据的四大参数:
driver_class
url
username
password
dialect : 方言:
可选参数:
show_sql : 运行的时候, 在控制台上打印sql 语句:
format_sql : 打印sql 的时候, 带有格式:
hbm2ddl.auto : Hibernate是否生成ddl语句:
引入映射文件 :
resource =“Customer.hbm.xml” // 引入文件存在的位置:
案例: user/com/mrzhang/domain/Customer.hbm.xml
整个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>
<!-- sessionFactory: -->
<session-factory>
<!-- 连接数据库的 四个参数: 必须要进行配置的四个参数:-->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/Hibernate001</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<!-- 配置要连接的数据库: 从核心包的dialect当中找到: -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!-- 可选参数:
hibernate.show_sql: 打印sql语句:
hibernate.format:打印的sql 语句具备格式:
-->
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<!--
是否使用Hibernate生成数据库的ddl语句 : create drop alter
none: 表示 Hibernate不管理ddl 语句:
create: 删除底层数据表, 创建新的表。
create-drop: 运行完成之后, 将底层数据库的表删除:
update: 数据库当中没表, 自动创建:
数据库当中有表, 使用原有的表。
使用原来的表: 如果表结构发生了变化, 能够自动更新表结构。
-->
<property name="hibernate.hbm2ddl.auto">create</property>
<!-- Hibernate 内部有自己的数据源: 但是也可以引入外部的这些优秀的数据源
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>
<!-- 引入实体的映射文件: -->
<mapping resource="com/yidongxueyuan/domain/Customer.hbm.xml"/>
</session-factory>
</hibernate-configuration>
映射文件的详解:
就是上面代码中的这个部分:
<xml dtd 部分> (直接复制即可)
<hibernate-mappding name》(csdnbug,尖括号会报错打不出来): 实体类的全路径名称:
table: 对应数据库当中的表: 如果table 和 表名和 实体类的名称相同, table 可以省略。
catalog ="" 指定了数据库的名称: 可以省略:
name: 类当中属性的名称:
column: 数据库当中的主键字段: 如果属性的名称和字段相对应, 就省略
length:指定了数据库当中列的长度。 可以不指定。 默认情况是255:
type: 指定数据当中的类型: 使用默认值:
type的值有三种表示形式:
可以使用java当中的类型: java.lang.String
可以指定数据库当中的类型: varchar
可以使用Hibernate自带类型: string
管理主键字段: 主键的生成策略:
name:
column:
length:
type: 以上四个字段和id的一致:
not-null: 字段是否为空: false true
unique: 设置值是否为一: false true :
<?xml version="1.0"?>
<!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 : 实体bean的全路径名称:
table: 实体类对应的底层数据库表: 当实体类的名称和表的名称一致的情况下, 可以省略的。
catalog: 对应数据库的名称: 可以省略
-->
<class name="com.yidongxueyuan.domain.Customer" table="cst_customer" >
<!-- 配置主键字段:
单独的标签: id :
name: 实体当中的属性:
column: 对应表当中的字段。
制定主键的生成策略:
-->
<id name="cust_id" column="cust_id" length="21" >
<!-- 主键的生成策略 -->
<generator class="native"/>
</id>
<!-- 普通的字段:
property:表示这是普通的字段:
name: 实体bean的属性。
column: 表的字段;
-->
<property name="cust_name" column="cust_name" length="21" type="string" not-null="true" unique="false"/>
<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>
</hibernate-mapping>
API详解:
1: Configuration对象:
Configuration : 配置对象, Hibernate工作通过该对象, 读取配置文件。
configure() ;只能直接读取src 下的 hibernate.cfg.xml 文件, 名称固定
configure(String path); 可以读取指定位置的配置文件。
addResource(“String path”);如果Hibernate的核心配置文件, 是一个Properties文件, 不能自动加载映射。 需要手动加载。
buildSessionFactory();获得一个会话工厂:
2: SessionFactory : 工厂类:
1:作用: a: 获得session: openSession();
b: 不是轻量级的对象, 一个项目只需要一个工厂。 线程安全的对象。
c: SessionFactory 是一个缓存对象, 负责Hibernate当中的二级缓存。
二级缓存, 不能直接使用, 如果需要使用, 需要配置。 在实际的开发过程当中, 已经被Redis数据库取代。
d: 内部维护了一个连接池:
使用步骤:
(1)引入外部数据源的jar包:
(2)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>
<!-- sessionFactory: -->
<session-factory>
<!-- 连接数据库的 四个参数: 必须要进行配置的四个参数:-->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/Hibernate001</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<!-- 配置要连接的数据库: 从核心包的dialect当中找到: -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!-- 可选参数:
hibernate.show_sql: 打印sql语句:
hibernate.format:打印的sql 语句具备格式:
-->
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<!--
是否使用Hibernate生成数据库的ddl语句 : create drop alter
none: 表示 Hibernate不管理ddl 语句:
create: 删除底层数据表, 创建新的表。
create-drop: 运行完成之后, 将底层数据库的表删除:
update: 数据库当中没表, 自动创建:
数据库当中有表, 使用原有的表。
使用原来的表: 如果表结构发生了变化, 能够自动更新表结构。
-->
<property name="hibernate.hbm2ddl.auto">create</property>
<!-- Hibernate 内部有自己的数据源: 但是也可以引入外部的这些优秀的数据源
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>
<!-- 引入实体的映射文件: -->
<mapping resource="com/yidongxueyuan/domain/Customer.hbm.xml"/>
</session-factory>
</hibernate-configuration>
(3)通过控制台的初始化信息可以查询
例子如下:
package com.yidongxueyuan.test;
import java.io.Serializable;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;
import com.yidongxueyuan.domain.Customer;
public class HibernateTest01 {
@Test
public void testAdd() throws Exception {
/*
* 1: 第一步: 读取Hibernate的核心配置文件:
* 2:第三步: 获得一个会话工厂:
* 3: 使用工厂获得一个session对象:
*/
//创建一个对象, 用来读取核心的配置文件:
/*
* 对象: 创建配置对象, 并且调用方法的时候, 并没有直接指定读取的配置文件。 默认读取的是类路径下的
* 名称为:hibernate.cfg.xml 的配置文件:
*/
Configuration config = new Configuration().configure();
//获得一个会话工厂:
SessionFactory factory = config.buildSessionFactory();
//3:使用工厂获得一个session对象: 类似之前的connnection :
Session session = factory.openSession();
// 4: 开启事务:
Transaction tx = session.beginTransaction();
//====================中间进行增删改查操作:
//操作实体bean:
Customer cust = new Customer();
cust.setCust_name("军哥");
cust.setCust_phone("18811307278");
Serializable id = session.save(cust);//主键字段:
// 事务的提交:
tx.commit();
//关闭session:
session.close();// close : session对象换回到池子当中。
//关闭SessionFactory:
factory.close();//显示关闭sessionFactory 。
}
}