- hibernate的引出:
- crm:客户关系管理
- javaEE开发的三层架构:客户层, WEB层 ,业务逻辑层, 持久层
- 客户层: html css js
- WEB:servlet jsp
- 业务逻辑:javaBean spring
- 持久层: JDBC Hibernate Mybatis DbUtils SpringJDBC模板
- Hibernate概述
- 概念:开源的持久层的ORM框架
- ORM:对象关系映射;利用描述对象与数据库表之间的映射的元数据,自动持久化对象。
- orm分为4级:hibernate属于4级,完全面向对象,mybatis 属于2级 dbutils属于1级
- 优势:
- 对JDBC进行了轻量级封装,减少内存消耗
- 基于JDBC,简化了DAO层(data access object)编码工作;
- 映射灵活,处理一对一,一对多多种关系;
- 可扩展性强,开放源码
- 文件包内容
- hibernate-release-5.0.7.Final
- documentation 存放相关文档
- lib存放依赖的JAR包
- project 存放源代码
- hibernate-release-5.0.7.Final
- Hibernate框架的搭建
- 1.导包
- required下的9个jar包
- 驱动包:mysql-connector-java-5.1.7-bin.jar
- 2.创建数据库,准备表,实体
- 3.书写orm元数据
- 文件名称 Xxxxx.hbm.xml
- 导入约束 1 设置catelog location key type:url key:在libary找以dtd结尾mapping的;
- 复制代码头
- orm元数据
- 4.书写主配置文件 hibernate.cfg.xml
- 1.导包
<hibernate-configuration>
<session-factory>
<!-- 数据库驱动 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- 数据库url -->
<property name="hibernate.connection.url">jdbc:mysql:///hibernate_32</property>
<!-- 数据库连接用户名 -->
<property name="hibernate.connection.username">root</property>
<!-- 数据库连接密码 -->
<property name="hibernate.connection.password">1234</property>
<!-- 数据库方言
不同的数据库中,sql语法略有区别. 指定方言可以让hibernate框架在生成sql语句时.针对数据库的方言生成.
sql99标准: DDL 定义语言 库表的增删改查
DCL 控制语言 事务 权限
DML 操纵语言 增删改查
注意: MYSQL在选择方言时,请选择最短的方言.
-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 将hibernate生成的sql语句打印到控制台 -->
<property name="hibernate.show_sql">true</property>
<!-- 将hibernate生成的sql语句格式化(语法缩进) -->
<property name="hibernate.format_sql">true</property>
<!--
## auto schema export 自动导出表结构. 自动建表
#hibernate.hbm2ddl.auto create 自动建表.每次框架运行都会创建新的表.以前表将会被覆盖,表数据会丢失.(开发环境中测试使用)
#hibernate.hbm2ddl.auto create-drop 自动建表.每次框架运行结束都会将所有表删除.(开发环境中测试使用)
#hibernate.hbm2ddl.auto update(推荐使用) 自动生成表.如果已经存在不会再生成.如果表有变动.自动更新表(不会删除任何数据).
#hibernate.hbm2ddl.auto validate 校验.不自动生成表.每次启动会校验数据库中表是否正确.校验失败.
-->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 引入orm元数据
路径书写: 填写src下的路径
-->
<mapping resource="cn/itheima/domain/Customer.hbm.xml" />
</session-factory>
</hibernate-configuration>
- 5.书写代码测试
//测试Hibernate框架
public class Demo {
@Test
//保存客户
public void fun1(){
Configuration conf = new Configuration().configure();
SessionFactory sessionFactory = conf.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
//----------------------------------------------
Customer c = new Customer();
c.setCust_name("google公司");
session.save(c);//执行保存
//----------------------------------------------
tx.commit();
session.close();
sessionFactory.close();
}
}
- hibernate的API详解
- Configuration 配置对象主要用于Hibernate框架加载映射文件
Configuration config = new Configuration().configure();
//configure("xml文件位置"),默认为src下
- SessionFactory Session工厂对象:接口负责Hibernate的初始化和建立Session对象。他在hibernate起到缓冲区作用,Hibernate可以将自动生成的SQL语句、映射数据以及某些可重复利用的数据放入,还保存对数据库配置的映射关系,维护二级缓存。
//SessionFactory 的获得
SessionFactory sessionFactory = config.bulidSessionFactory();
- 特点 线程安全的,他的同一个实例能够供多个线程共享;
- 重量级的,不能随意的创建和销毁他的实例;
- 由于这特点,一般一个项目中只需要一个sessionfactory 只有当应用中存在多个数据源时,才为每个数据源建立一个SessionFactory实例。
- 因此在实际使用中,会抽取一个HibernateUtils工具类。
public class HibernateUtils {
private static SessionFactory sf;
static{
//1 创建,调用空参构造
Configuration conf = new Configuration().configure();
//2 根据配置信息,创建 SessionFactory对象
sf = conf.buildSessionFactory();
}
//获得session => 获得全新session
public static Session openSession(){
//3 获得session
Session session = sf.openSession();
return session;
}
//获得session => 获得与线程绑定的session
public static Session getCurrentSession(){
//3 获得session
Session session = sf.getCurrentSession();
return session;
}
public static void main(String[] args) {
System.out.println(HibernateUtils.openSession());
}
}
Session
- 获得方法2种:openSession();直接创建新的session实例,用完需要调用close()方法关闭。 getCurrentSession();一个绑定线程的。提交或者回滚自动关闭。
session是轻量级的,线程不安全,软件架构是应避免多个线程操作一个session,它有一个缓存,一级缓存,存放当前工作单元加载的对象。
session中的方法:
save();update();saveOrUpdate(); 增加修改
delete();
get(Customer.class,1l)和load();
createQuery();和createSQLQuery();数据库操作对象;
createCriteria()条件查询;Transaction 封装了事务
获得事务:session.getTransaction(); session.beginTransaction();建议用这个开启并操作事务;
Transcation transaction = session.beginTransaction();
transaction.commit();
transaction.rollback();
- Hibernate中的实体编写规则:
1.持久化类需要提供无参构造方法
2.持久化类的属性需要私有,提供getset方法;
3.属性使用包装类的类型:例如double和Double 如果忘记输入会出现null,为零则为0,double则都是0区分不开。
4.要有唯一标识OID与表的主键对应。
5.不要用final修饰,因为hibernate有延迟加载机制,这个机制会产生代理对象,产生代理对象是字节码的增强技术,其实就是产生当前类的一个子对象,如果用final修饰就不能产生子类,延迟加载会失效。 主键生成策略
主键类型:
1.自然主键,把具有业务含义的字段作为主键。例如customer中可以将name作为主键,不能为null,不允许重名,不允许修改。
2.代理主键 ,不具有业务含义字段作为主键,通常为整数类型。
主键生成策略:
1.代理主键
identity : 主键自增.由数据库来维护主键值.录入时不需要指定主键.
sequence: Oracle中的主键生成策略.
hilo(了解): 高低位算法.主键自增.由hibernate来维护.开发时不使用.
native:hilo+sequence+identity 自动三选一策略.
increment(了解): 主键自增.由hibernate来维护.每次插入前会先查询表中id最大值.+1作为新主键值.
uuid: 产生随机字符串作为主键. 主键类型必须为string 类型.2.自然主键
assigned:自然主键生成策略. hibernate不会管理主键值.由开发人员自己录入。Hibernate持久化类的三种状态
- 1.瞬时态 transient 没有id,没有在session缓存中
- 2.持久态 persistent 没有id,没有在session缓存中
- 3.游离态 datached 有id,没有在session缓存中
详细说明在文档。我们希望同步到Hibernate 中的数据为持久态。