1.hibernate.cfg.xml剖析
- 数据库连接配置
- 可选配置
- 资源注册
- 二级缓存(后期)
- 查询缓存(后期)
Hibernate.cfg.xml是默认的文件名称,可以随便起名xxx.xml,建议使用hibernate.cfg.xml
1.数据库连接配置
必须配置
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/hiber01</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
2.可选配置
1.Hibernate默认使用的数据库的连接池,connection.pool_size是连接池的连接数量
<property name="connection.pool_size">1</property>
2.数据库的方言
Hibernate可以支持多种数据库,不同数据库的sql会有差别,hibernate可以根据不同的数据库来生成不同的sql,每一种数据库hibernate为我们定义了一种方言
<property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
注意:在文档 F:\拓新\阶段三资料\hibernate资料\hibernate-release-4.3.11.Final\hibernate-release-4.3.11.Final\documentation\manual\en-US\html 下的index.html下可查看
3.是否输出sql
是否在控制台输出sql语句
<property name="show_sql">true</property>
高级配置:
4.第三方的数据库连接池的配置(c3p0)
<!-- 数据库连接最小连接数 -->
<property name="c3p0.min_size">10</property>
<!-- 数据库最大连接数 -->
<property name="c3p0.max_size">100</property>
<!-- 连接数据库超时时间 3000ms 3s -->
<property name="c3p0.timeout">3000</property>
5.建表策略
<property name="hbm2ddl.auto">none</property>
四个值:
None:不做任何事
Create:每次执行hibernate的操作时都删表建表
Create-drop:每次执行hibernate操作时都建表删表,SessionFactory关闭就删表
Validate:每次执行hibernate操作就验证数据库的表和mapping的关系是否正确
我们默认选择none或者不配置就ok了
3.注册映射文件
包名用/分隔
<mapping resource="com/zy/hiber/model/User.hbm.xml"/>
2.模型类的规范
1.必须要有默认构造方法:查询时把数据表中的一条数据映射成一个对象时需要使用默认构造器来创建对象。
2.必须提供一个OID,作为对象的主键
3.属性的私有化封装,提供set和get方法
4.不要使用final来修饰模型类中成员,如果是final类型后续延迟加载无法实现
5.最好使用包装类
默认值
基本类型:int 0
包装类:integer null
3.映射文件配置
每一个model都有一个相对于的映射文件,命名规范:模型类.hbm.xml,位置可以任意但是建议放在model的同级包下。
1.Class元素映射:
class:映射类
属性:
name:要映射的model的全路径
table:model映射到数据库的表名
也可以在
<hibernate-mapping package="com.zy.hiber.model">
中指定。
2.属性的映射
Property:属性的映射
属性:
Name:模型类的属性名
Column:映射都表中的列名
Type:hibernate提供的数据类型,可以由java的数据类型转换成数据库中的数据类型
Length:映射到数据库中的字段的长度
not-null:是否可以为空
unique-key:唯一约束的键名
3.主键映射
<!—id
是主键映射配置
-->
<id name="userId" column="user_id">
<!--
generator:主键的映射策略
-->
<generator class="assigned"></generator>
</id>
映射策略:
- Assigned:手动指定id,在实际项目中基本不用
- Increment:通过获得当前的id的最大值的方式然后在最大值上加1来指定主键,在实际项目中不去使用因为有危险
-
如果A先插入数据库中的主键最大值就是2,B这时来插入就出现了主键重复
Increment方式有并发问题,所以不用。
3.Identity:使用mysql的自增,前提是model类的oid是数值类型,映射column也是数值类型
这种自增没有并发问题,因为主键的自增策略由数据库管理(有锁机制)
4.Sequence:是Oracle数据库的自增策略
5.Native:是智能的自增策略,会根据数据库的方言来翻译identify/sequence
6.Uuid:通过hibernate生成一个32位的不重复的字符串,要求是oid是字符串类型,相应的数据库的id也是varchar,这种策略在实际项目中大量使用,建议使用uuid,性能高些。
4.环境初始化
Configuration:创建hibernate配置对象,读取hibernate.cfg.xml文件初始化环境
ServiceRegistry:注册hibernate属性信息
SessionFactory:Session工程类,这个类是一个重量级的对象,线程安全的,负责创建Session,这个对象在服务器启动的时候创建一个即可。
Session,是一次和数据库的会话,但是不一定是一次连接,Session给我们提供很多操作数据库的方法,操作的是对象,影响的是数据库。
Transaction:事务对象,控制我们Session对象数据库操作的事务。
5.封装hibernateUtils
HibernateUtils.java
package com.zy.hiber.utils;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
public class HibernateUtils {
private static SessionFactory sf;
static{
//创建hibernate的配置对象
Configuration cfg = new Configuration();
//配置hibernate的核心文件的位置
cfg.configure("hibernate.cfg.xml");
//注册配置属性信息
ServiceRegistry sr = new StandardServiceRegistryBuilder()
.applySettings(cfg.getProperties()).build();
sf = cfg.buildSessionFactory(sr);
}
public static SessionFactory getSessionFactory(){
return sf;
}
public static Session getSession(){
return sf.openSession();
}
public static void closeSession(Session session){
session.close();
}
public static void closeResource(Session session){
session.close();
sf.close();
}
}
TestHibernate.java
@Test
public void test1() {
Session session = HibernateUtils.getSession();
Transaction tx = session.beginTransaction();
//开启事物
try {
User user = new User();
user.setUserId(1);
user.setUname("zhangyan");
user.setGender(1);
user.setBirthday(new Date());
//通过Session保存对象
session.save(user);
//提交事物
tx.commit();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
tx.rollback();
}finally{
HibernateUtils.closeResource(session);
}
}