SSH框架之Hibernate框架的配置和基本使用流
一、框架的简介
1.框架:
框:即约束,制约,规范,在使用的是时候应该遵循的约定
架:架子,架构。已经搭建好的架构,方便使用,可重用
2.Hibernate框架作用
应用于DAO层,对JDBC的封装,主要实现CRUD操作(数据库联系),基于ORM的思想实现(对象关系映射)
3.Hibernate版本介绍
3.x:老版本
4.x:过度版本
5.x:新版本
二、Hibernate的使用流程
1.准备jar包
下载地址:Hibernate官网:http://hibernate.org/
需要安装的包文件:
1.必须文件:解压以后的lib文件夹下required文件夹的所有的jar包。还有数据库相关的jar包。以及下面的spatial下的slf4j文件日记jar包
2.可选文件:比如需要数据库连接池的jar包或者是log4j的jar包等基本包
2.准备hibernate的主配置文件
格式:xxx.xml(一般默认名称hibernate.cfg.xml),放置位置为项目src目录下。
配置内容如下:
1.数据库连接——必备:驱动,url ,username,password.
如下配置
2.数据库方言——可省略:建议配置;
a、使框架知道要链接的数据库是哪个数据库,当在实际应用过程中,hibernate框架就会根据方言调用不同的类或者在底层根据方言实现对要链接的
b.数据库进行操作,屏蔽了数据库的在上层的差异问题
3.映射配置——必备
<mapping resource="com/tongchuang/entity/Emp.hbm.xml"/>
4.其他配置——可选
a、显示sql语句
b、格式化sql语句的
<property name="hibernate.format_sql">true</property>
c、
<property name="hbm2ddl.auto">update</property>
- create:先删除再创建表
update:表不存在就创建,内容不一样就更新
create-drop:初始化时创建,
-sessionfactory close时删除
-validate:验证表结构是否一致
d、 二级缓存的配置
<!-- 配置二级缓存 --> <property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory</property>
e、 数据库连接池的配置
一般采用除c3p0连接池
<!-- 数据库连接池的使用 --> <!-- 选择使用C3P0连接池 --> <property name="hibernate.connection.provider_class">org.hibernate.c3p0.internal.C3P0ConnectionProvider</property> <!-- 连接池中最小连接数 --> <property name="hibernate.c3p0.min_size">5</property> <!-- 连接池中最大连接数 --> <property name="hibernate.c3p0.max_size">20</property> <!-- 设定数据库连接超时时间,以秒为单位。如果连接池中某个数据库连接处于空闲状态且超过timeout秒时,就会从连接池中移除--> <property name="hibernate.c3p0.timeout">120</property> <!-- 设置数据库 --> <property name="hibernate.c3p0.idle_test_period">3000</property> <!-- 每次都验证连接是否可用 --> <property name="hibernate.c3p0.validate">true</property>
f、配置事务隔离级别
一般为设置为:4可串行化:读加共享锁,写加排他锁,读写互不干扰,最安全
<!-- 事务隔离级别的配置 解决并发,默认的是4,一般情况下是不需要设置的--> <property name="hibernate.connection.isolation">4</property>
g、当前线程session
<!-- 其他配置 --> <property name="show_sql">true</property> <property name="format_sql">true</property> <!-- 适用于项目测试阶段的,表的操作方案:自动添加,修改,创建等等 --> <property name="hbm2ddl.auto">update</property> <!-- 设置事务隔离级别 --> <property name="hibernate.connection.isolation">4</property> <!-- 用线程管理session对象,目的是:延长session的生命周期 --> <property name="current_session_context_class">thread</property>
mysql数据库的配置信息
<?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://localhost:3306/mydb?characterEncoding=utf8</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<!-- 数据库方言的配置 mysql5.6版本可选 -->
<!-- 配置数据库方言的作用是屏蔽数据库的差异,换句话说是使hibernate框架知道要与哪种数据库取得联系 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!-- 其他配置 show查看sql语句 format格式化sql语句-->
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<!-- 映射配置:引入映射配置 -->
<mapping resource="com/yztc/yx/pojo/Dept.hbm.xml"/>
</session-factory>
</hibernate-configuration>
- ORACLE数据库配置信息
<!-- oracle的连接 -->
<property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
<property name="hibernate.connection.username">scott</property>
<property name="hibernate.connection.password">orcl</property>
<!-- 数据库方言:oracle11g版本可选 -->
<property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>
<!-- 其他配置一致 -->
3.创建实体类–对应表
实体类也就是对应数据库的字段的类,包含了相应的成员属性和相应的构造方法和get,set方法。
hibernate中实体类的书写规范
1)需要一个主属性–必需
2)默认构造方法–必需
3)getter/setter方法–必需
4)equals/hashCode方法–可选
注意:当创建了含参的构造方法时,一定需要加上无参的构造方法。因为在Hibernate帮你自动加载数据库是会通过反射的方法帮你创建实体类对象。规范写法是加上无参构造方法
public class Dept {
private Integer id;
private String name;
private String location;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
}
4.映射文件配置–ORM
基于ORM思想,使实体类和关系表实现一个联系–映射
映射文件一般在与实体类同包,命名规范:类名.hbm.xml
创建位置:可以在实体类所在的包下,也可以是src下新建的包下,不过映射位置有变化
标签属性:
-hibernate-mapping标签的属性:package属性:用于实现包的配置(实现配置实体类所属的包位置)
-class标签:name、table
- name:实现配置的实体类名
- table:用于实现配置关系的表格的名称,如果省略,则表明数据库表名和实体类名一致
-id标签:用于配置主属性和关键字段的映射,name,column,length,type等
- name:用于配置实体类的主属性:即CRUD方法中的id
- column:用于配置对应的主键,可省,如果省略那么属性名称和字段名称一致
- length:用于设置字段宽度,可省,如果省略那么由框架自动设置长度
- type:用于设置字段类型,可省,如果省略那么由框架根据属性的类型自适应。
-property:用于配置非主类型:属性和上面一致。区别在于name 和column 只是为了指定相应的属性和字段一致,
-generator:用于配置主键生成策略
字符串方式、数值–整数方式
在上面的基础之上可以是自动生成也可以是非自动生成
class的值–根据值的不同选择不同的主键生成策略
值:native 、identity、 sequence 、 uuid–掌握 hilo 、assigned 、foreign–了解
—native—由框架会根据所连接的数据库自适应选择哪种主键生成策略
—identity–适用于数据库中有auto_increment功能的 ORACLE不适用
—sequence–适用于数据库中序列功能的
—uuid—字符串形式的id值
—hilo—高低值主键值,值自动生成 5.X版本不适用
—assigned–主键值需要自己填充的,非自动生成
—foreign—涉及到外键,与表的关联设置有关
<?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 table="dept" name="com.yztc.yx.pojo.Dept">
<!-- id用于配制主属性和主键字段的对应;id的name用于配制属性名; column用于配制数据库字段名称 -->
<id name="id" column="deptno">
<!-- 主键生成策略 -->
<generator class="native"></generator>
</id>
<!-- property用于配制普通属性和字段的对应 -->
<property name="name" column="dname"></property>
<property name="location" column="loc"></property>
</class>
</hibernate-mapping>
注意:当实体类属性名和数据库字段名一致时,可以省略字段column
5.将映射配置文件配置到主配置文件中
在主配置文件中:
<!-- 映射配置:引入映射配置 -->
<mapping resource="com/yztc/yx/pojo/Dept.hbm.xml"/>
6.调用hirbernate的方法实现测试——CURD
1)读取主配置文件—Configuration对象读取,configure()
2)创建一个Session工厂
3)创建Session
4)调用方法完成操作
5)释放资源
public void testQueryByID() {
// 创建一个读取主配置文件的对象
Configuration cfg = new Configuration();
// 读取主配置文件
cfg.configure();
// 创建Session工厂
SessionFactory factory = cfg.buildSessionFactory();
// 打开Session--类似于jdbc的connection
Session session = factory.openSession();
// 执行查询操作,自动提交不需要自己提交
Dept dept = session.get(Dept.class, 1);
System.out.println(dept.getId() + "," + dept.getName());
// 释放资源
session.close();
factory.close();
}
注意:执行查询get查询方法时可以不用创建事务,也不用提交
不过执行其他增删改方法时就需要创建事务
public void testSave() {
Dept dept = new Dept();
dept.setName("事业");
dept.setLocation("杭州");
Session session = HibernateUtil.getSession();
Transaction transaction = null;
try {
transaction = session.beginTransaction();
session.save(dept);
transaction.commit();
} catch (Exception e) {
transaction.rollback();
e.printStackTrace();
} finally {
session.close();
}
}