hibernate介绍
Hibernate是轻量级JavaEE应用的持久层框架,它用于实现DAO,它是一个关系型数据库ORM框架。
用于实现DAO:使用hibernate实现数据访问层。
ORM框架:Object Relational Mapping 对象关系映射
Object:对象,java对象
Relational:关系,关系型数据库中二维表。
Mapping:映射,通过操作java对象去操作数据库。
java类-------------->表
java对象----------->表中记录
java对象属性------->表中字段
hibernate执行流程
1、配置文件
hbm.xml(映射文件,建立对象和表的映射关系) 一个表对应一个hbm.xml
.java(domain,java对象,pojo):定义属性、getter/setter方法
一个表定义一个java类(pojo)
hibernate.cfg.xml(hibnernate主配置文件),
只需要定义一个主配置文件,名称不固定,hibernate默认使用"hibenrate.cfg.xml"
2、通过configuration加载配置文件,准备hibernate的运行环境
3、创建sessionFactory会话工厂,用于创建会话
4、通过sessionFactory创建session会话,session中包括一个connection数据库连接,通过session向数据库发出sql语句。
5、对增、删、改操作,需要开启事务,通过transaction对象提交或回滚事务。
6、对查询操作,不需要开启事务,通过query对象构造查询条件查询数据库
7、释放资源, session用完要手动close关闭,sessionFactory在应用程序结束自动关闭。
创建映射文件
一张表对应一个hbm.xml和一个pojo(也就是实体类)。
编写hbm.xml,配置dtd约束
CstCustomer实体类
然后实体类的配置文件
<?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 >
<!-- 将表和类对应起来
name:类名,写类的全限定名 (必须配置)
table:表名(必须配置)
catalog:使用mysql配置数据库名,可以不用配置
schema:使用oracle时候配置用户名
-->
<class name="com.zking.crm.domain.CstCustomer" table="cst_customer" >
<!-- 配置二级缓存 类级别的缓存 -->
<cache usage="read-write"/>
<!-- 主键映射
name:表中的主键对应的属性
type:属性的类型
-->
<id name="custId" type="java.lang.Long">
<!-- 对应表中主键字段 -->
<column name="cust_id"></column>
<!-- 主键生成策略
identity:自增主键生成策略
还有其它策略:uuid(唯一串),assgiend(手动指定)、sequence(用于oracle中的序列生成主键)
-->
<generator class="identity"></generator>
</id>
<!-- 普通属性和字段的映射
name:类中的属性
-->
<property name="custName" type="string">
<!-- 属性对应的字段 -->
<column name="cust_name"></column>
</property>
<property name="custUserId" type="java.lang.Long">
<column name="cust_user_id"></column>
</property>
<property name="custCreateId" type="java.lang.Long">
<column name="cust_create_id"></column>
</property>
<!-- <property name="custSource" type="string">
<column name="cust_source" length="32"></column>
</property> -->
<property name="custIndustry" type="string">
<column name="cust_industry" length="32"></column>
</property>
<property name="custLevel" type="string">
<column name="cust_level" length="32"></column>
</property>
<property name="custLinkman" type="string">
<column name="cust_linkman" length="64"></column>
</property>
<property name="custPhone" type="string">
<column name="cust_phone" length="64"></column>
</property>
<property name="custMobile" type="string">
<column name="cust_mobile" length="16"></column>
</property>
<!-- 一对多配置,一个客户对应多个联系人
name:一方中set的属性名
inverse="true":当前在客户中,关系维护由对方进行维护
-->
<set name="cstLinkmans" cascade="save-update,delete" inverse="true" fetch="select" lazy="true">
<key>
<!--多方中外键 -->
<column name="lkm_cust_id"></column>
</key>
<!-- class:指定多方类路径,即联系人类路径 -->
<one-to-many class="com.zking.crm.domain.CstLinkman"/>
</set>
<!-- 配置多对一 多个客户对应一个数据字典 -->
<many-to-one name="baseDictByCustSource" class="com.zking.crm.domain.BaseDict" fetch="join">
<column name="cust_source"></column>
</many-to-one>
</class>
</hibernate-mapping>
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>
<!-- 配置hibernate运行的参数 -->
<!-- 数据库方言,根据数据库选择 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!-- 数据库驱动 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- 数据库连接url -->
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/crm_hibernate</property>
<!-- 数据库用户名和密码 -->
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123</property>
<!-- 配置c3p0 -->
<!-- 连接池提供商 -->
<property name="hibernate.connection.provider_class">org.hibernate.c3p0.internal.C3P0ConnectionProvider</property>
<!-- 连接池中保留的最大连接数-->
<property name="hibernate.c3p0.max_size">10</property>
<!-- 连接池中保留的最小连接数 -->
<property name="hibernate.c3p0.min_size">1</property>
<!-- 最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃 -->
<property name="hibernate.c3p0.maxIdleTime">60</property>
<!-- 获得连接的超时时间,如果超过这个时间,会抛出异常,单位毫秒 -->
<property name="hibernate.c3p0.timeout">5000</property>
<!--为了方便调试是否在运行hibernate时在日志中输出sql语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 是否对日志中输出的sql语句进行格式化 -->
<property name="hibernate.format_sql">true</property>
<!--
hbm2ddl.auto的4个值,如果不需要设置为none,建议正式环境设置为none
validate 加载hibernate时,验证创建数据库表结构
create 每次加载hibernate,重新创建数据库表结构,这就是导致数据库表数据丢失的原因。
create-drop 加载hibernate时创建,退出是删除表结构
update 加载hibernate自动更新数据库结构
none 不执行检查
-->
<property name="hibernate.hbm2ddl.auto">none</property>
<!-- 事务隔离级别 -->
<property name="hibernate.connection.isolation">4</property>
<!-- 配置session绑定本地线程 -->
<property name="hibernate.current_session_context_class">thread</property>
<!-- 开启二级缓存 -->
<property name="hibernate.cache.use_second_level_cache">true</property>
<!-- 要指定缓存的供应商 -->
<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory</property>
<!-- 开启查询缓存 -->
<property name="hibernate.cache.use_query_cache">true</property>
<!-- 加载hbm.xml映射文件 -->
<mapping resource="com/zking/crm/domain/CstCustomer.hbm.xml"/> <!-- 客户基本信息配置文件 -->
<mapping resource="com/zking/crm/domain/CstCustomerDetail.hbm.xml"/> <!-- 客户详情信息配置文件 -->
<mapping resource="com/zking/crm/domain/CstLinkman.hbm.xml"/> <!-- 客户联系人信息配置文件 -->
<mapping resource="com/zking/crm/domain/SysUser.hbm.xml"/> <!-- 用户信息配置文件 -->
<mapping resource="com/zking/crm/domain/SysRole.hbm.xml"/> <!-- 角色信息配置文件 -->
<mapping resource="com/zking/crm/domain/BaseDict.hbm.xml"/> <!-- 数据字典配置文件 -->
</session-factory>
</hibernate-configuration>
1、加载映射文件
2、配置hibernate运行的参数(属性)
1)数据库方言,决定了hibenrate发出哪个数据库认识的sql语句
2)数据库连接参数,可以配置成连接池
hibernate框架默认会加载classpath 下的hibernate.cft.xml
所需jar包