框:即约束,制约,规范,在使用的是时候应该遵循的约定
架:架子,架构。已经搭建好的架构,方便使用,可重用
应用于DAO层,对JDBC的封装,主要实现CRUD操作(数据库联系),基于ORM的思想实现(对象关系映射)
3.x:老版本
4.x:过度版本
5.x:新版本
下载地址:Hibernate官网:http://hibernate.org/
需要安装的包文件:
1.必须文件:解压以后的lib文件夹下required文件夹的所有的jar包。还有数据库相关的jar包。以及下面的spatial下的slf4j文件日记jar包
2.可选文件:比如需要数据库连接池的jar包或者是log4j的jar包等
基本包
格式: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">trueproperty>
c、
<property name="hbm2ddl.auto">updateproperty>
update:表不存在就创建,内容不一样就更新
create-drop:初始化时创建,
-sessionfactory close时删除
-validate:验证表结构是否一致
d、 二级缓存的配置
<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.SingletonEhCacheRegionFactoryproperty>
e、 数据库连接池的配置
一般采用除c3p0连接池
<property name="hibernate.connection.provider_class">org.hibernate.c3p0.internal.C3P0ConnectionProviderproperty>
<property name="hibernate.c3p0.min_size">5property>
<property name="hibernate.c3p0.max_size">20property>
<property name="hibernate.c3p0.timeout">120property>
<property name="hibernate.c3p0.idle_test_period">3000property>
<property name="hibernate.c3p0.validate">trueproperty>
f、配置事务隔离级别
一般为设置为:4可串行化:读加共享锁,写加排他锁,读写互不干扰,最安全
<property name="hibernate.connection.isolation">4property>
g、当前线程session
<property name="show_sql">trueproperty>
<property name="format_sql">trueproperty>
<property name="hbm2ddl.auto">updateproperty>
<property name="hibernate.connection.isolation">4property>
<property name="current_session_context_class">threadproperty>
mysql数据库的配置信息
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driverproperty>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mydb?characterEncoding=utf8property>
<property name="hibernate.connection.username">rootproperty>
<property name="hibernate.connection.password">rootproperty>
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialectproperty>
<property name="hibernate.show_sql">trueproperty>
<property name="hibernate.format_sql">trueproperty>
<mapping resource="com/yztc/yx/pojo/Dept.hbm.xml"/>
session-factory>
hibernate-configuration>
<property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriverproperty>
<property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:orclproperty>
<property name="hibernate.connection.username">scottproperty>
<property name="hibernate.connection.password">orclproperty>
<property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialectproperty>
实体类也就是对应数据库的字段的类,包含了相应的成员属性和相应的构造方法和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;
}
}
基于ORM思想,使实体类和关系表实现一个联系–映射
映射文件一般在与实体类同包,命名规范:类名.hbm.xml
创建位置:可以在实体类所在的包下,也可以是src下新建的包下,不过映射位置有变化
标签属性:
-hibernate-mapping标签的属性:package属性:用于实现包的配置(实现配置实体类所属的包位置)
-class标签:name、table
-id标签:用于配置主属性和关键字段的映射,name,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—涉及到外键,与表的关联设置有关
主键生成策略可参考:http://www.cnblogs.com/hoobey/p/5508992.html
<hibernate-mapping>
<class table="dept" name="com.yztc.yx.pojo.Dept">
<id name="id" column="deptno">
<generator class="native">generator>
id>
<property name="name" column="dname">property>
<property name="location" column="loc">property>
class>
hibernate-mapping>
注意:当实体类属性名和数据库字段名一致时,可以省略字段column
在主配置文件中:
<mapping resource="com/yztc/yx/pojo/Dept.hbm.xml"/>
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();
}
}