Hibernate框架(一)文件配置、核心API、对象状态详解

来源:互联网 发布:示剑网络马大伟 编辑:程序博客网 时间:2024/05/16 11:50

Hibernate框架 (一)

hibernate结构

hibernate :
1. 数据访问层框架,操作数据库
2. 在Dao层操作数据,使用JDBC|DBUTILS时,我们都需要进行面向对象到面向关系型数据库的转换操作.
3. hibernate能够让我们以面向对象的方式操作数据库.

ORM:对象关系映射,通过配置文件来映射对象与关系型数据库之间的关系,最终能够做到以面向对象的方式来操作数据库.
Hibernate是一个数据持久化层的ORM框架.
Object:对象,java对象,此处特指JavaBean
Relational:关系,二维表,数据库中的表。
Mapping:映射|映射元数据,对象中属性,与表的字段,存在对应关系。

hibernate 配置详解

配置映射文件

与实体同一目录,与实体同名(大小写相同)

<?xml version="1.0" encoding="UTF-8"?><!-- 映射文件 --><!-- 导入dtt约束 --><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><!-- pageage属性:填写包名,后续配置中默认类所在包即为package属性所填写的包 --><hibernate-mapping package="cn.it.domain">    <!-- 类与表的映射 ,name填写完整类名,table写表名-->    <class name="cn.it.domain.Customer" table="cst_customer">         <!-- id元素:映射类中的主键属性(OID)与表中的主键列对应-->        <id name="cust_id" column="cust_id">             <!-- generator属性,主键生成策略 :决定对象在执行保存时,主键值如何获得  -->            <generator class="native"></generator>        </id>        <!--property元素:映射普通列 -->        <property name="cust_name" column="cust_name"></property>         <property name="cust_source" column="cust_source"></property>        <property name="cust_industry" column="cust_industry"></property>        <property name="cust_level" column="cust_level"></property>        <property name="cust_phone" column="cust_phone"></property>        <property name="cust_mobile" column="cust_mobile"></property>    </class></hibernate-mapping>

package属性:
填写一个包名,后续配置中默认类所在包即为package属性填写的包

class属性:
映射表与类的对应,name属性:填写完整的类名,table属性(可选):库中表名,默认使用类名作为表名.
id元素:映射类中的主键属性与表中的主键列对应,
name属性:类中主键属性名,
column属性:表中主键列名,
length属性(可选):配置当前列的长度,默认值:数据库对应类型最大长度,
type属性(可选):指定当前列(属性)的类型,默认值:启动检测属性类型,自动根据检测配置,

id元素:
映射类中的主键属性(OID)与表中的主键列对应
name属性:类中主键属性名.
column属性(可选):表中的主键列名.默认列名就是属性名
length属性(可选):配置当前列的长度.默认值:数据库对应类型最大长度.
type属性(可选):指定当前列(属性)的类型.默认值:自动检测属性类型.自动根据检测配置.

generator元素:
主键生成策略.决定对象在执行保存时,主键值如何获得
代理主键:
表达业务之外的字段.没有业务意义.
increment: 先查询表中的id最大值.加1作为新的主键值.有线程安全问题.测试时使用
*identity:依赖于数据库中的主键自增.
*sequence:使用Oracle中的序列来生成id值.
hilo(用不到):hibernate通过高低位算法来实现主键自增效果.
*native:自动三选一.identity|sequence|hilo
uuid:字符串类型主键.生成随机字符串作为主键.注意长度应超过32位.
自然主键:包含业务意义.
*assigned:手动指定id值.

property元素:
映射普通列
id元素:映射类中的主键属性与表中的主键列对应,
name属性:类中主键属性名,
column属性(可选):表中主键列名,
length属性(可选):配置当前列的长度,默认值:数据库对应类型最大长度,
type属性(可选):指定当前列(属性)的类型,默认值:启动检测属性类型,自动根据检测配置,

主配置文件

<?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>        <!-- 必选配置 (5个)-->        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>        <property name="hibernate.connection.url">jdbc:mysql:///hibernate</property>        <property name="hibernate.connection.username">root</property>        <property name="hibernate.connection.password">123</property>        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property><!-- hibernate方言配置 -->         <!-- 可选配置(3个) -->         <!-- 打印生成sql到控制台 -->         <property name="hibernate.show_sql">true</property>         <!-- 对生成的sql进行格式化 -->         <property name="hibernate.format_sql">true </property>         <!-- ## auto schema export  自动建表 -->         <property name="hibernate.hbm2ddl.auto">update</property>         <!-- 引入映射文件 -->        <mapping resource="cn/it/domain/Customer.hbm.xml"></mapping>    </session-factory></hibernate-configuration>  

必选配置(5个)
前4项数据库参数设置
第5项时hibernate 方言配置,不属于SQL99标准,不同数据库在sql99标准基础上发展了各自的差异化的语句,这些语法就是数据库方言.
注意:务必选择最短方言配置.

可选配置(3个)
1、打印生成sql到控制台
2、对生成的sql进行格式化
3、auto schema export 自动建表
#hibernate.hbm2ddl.auto create 自动建表,每次启动hibernate都会自动建表,即使表已经存在,仍会删除重新建表
#hibernate.hbm2ddl.auto create-drop 自动建表,每次hibernate都会自动建表,每次运行完成会将表删除,
#hibernate.hbm2ddl.auto update 自动建表,如果有表就不再重新创建,如果配置改变,自动更改表结构
#hibernate.hbm2ddl.auto validate 不会自动创建表结构,只负责在启用时校验表结构,检出问题后会抛出异常

引入映射文件
引入映射文件的位置,路径从src开始

API详解

confinguration对象详解

功能:用于读取配置文件的对象,根据读取到的文件创建SessionFactory

  1. 创建配置读取对象 ,调用空参构造即可创建
  2. 调用配置读取对象的读取配置文件方法,读取配置文件,空参configure方法读取src/hibernate.cfg.xml

    import org.hibernate.cfg.Configuration;import org.junit.Test;/** * Configuration详解 * 读取配置文件的对象 * @author Administrator */public class Demo01 {    @Test    public void test1(){        //1.创建配置读取对象,调用空参构造即可创建        Configuration conf = new Configuration();        //2.调用配置读取对象的读取配置文件的方法,读取配置文件        conf.configure();        //以上两步合二为一        Configuration configure = new Configuration().configure();    }    @Test    public void test2(){        //1.创建配置读取对象,读取配置文件        Configuration conf = new Configuration().configure();        //2.根据配置创建SessionFactory        conf.buildSessionFactory();    }}

SessionFactory对象详解

功能:根据配置信息创建session对象

注意:1.SessionFactory需要消耗相对较多的内存资源(保存了所有配置)
2.SessionFactory是线程安全的设计
结论:在一个web项目中要确保只有一个SessionFactory对象存在

Configuration conf = new Configuration.configure();
//根据配置创建SessionFactory
SessionFactory sf = conf.buildSessionFactory();
创建session方式1:返回一个全新的session对象
Session session1 = sf.openSession();
创建session方式2:获得与线程绑定的session对象
Session session2 = sf.getCurrentSession();

import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;import org.junit.Test;/** * SessionFactory详解 * 根据配置文件创建session对象 * @author Administrator */public class Demo02 {    @Test    public void test1(){        //1.创建配置读取对象,读取配置文件        Configuration conf = new Configuration().configure();        //2.根据配置创建SessionFactory        SessionFactory sf = conf.buildSessionFactory();        //创建session方式一:返回一个全新的session对象        Session session = sf.openSession();        //创建session方式二:获得与线程绑定的session对象        Session session2 = sf.getCurrentSession();    }}

Session对象详解

功能:hibernate中操作数据库的核心对象
1.增删改查所有操作
2.获得事务操作对象

import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;import org.junit.Test;import cn.it.domain.Customer;import cn.it.utils.HibernateUtils;/** * Session详解 * hibernate操作数据库核心对象, * 1.实现增删改查操作 * 2.获取事务操作对象 * @author Administrator * */public class Demo03 {    @Test    public void test1(){        //1.创建配置读取对象,读取配置文件        Configuration conf = new Configuration().configure();        //2.根据配置创建SessionFactory        SessionFactory sf = conf.buildSessionFactory();        //3.创建session方式一:返回一个全新的session对象        Session session = sf.openSession();        //4.获得事务操作对象        Transaction tx = session.getTransaction();        //5.开启事务        tx.begin();        //获取事务操作对象与开启事务合并        Transaction tx2 = session.beginTransaction();        //6.提交事务        tx2.commit();        //7.回滚事务        tx2.rollback();    }    /**     * 往数据库中添加     */    @Test    public void test2(){        //1.获取session对象        Session session = HibernateUtils.openSesseion();        //2.获得事务操作对象,开启事务        Transaction tx = session.beginTransaction();        //3.操作        Customer customer = new Customer();        customer.setCust_name("张三");        session.save(customer);        //4.提交事务        tx.commit();        //5.关闭资源        session.close();    }    /**     * 根据id查询数据库中数据     */    @Test    public void test3(){        //1.获取session对象        Session session = HibernateUtils.openSesseion();        //2.获得事务操作对象,开启事务        Transaction tx = session.beginTransaction();        //3.操作        //根据oid查询        Customer customer = session.get(Customer.class, 1L);        System.out.println(customer.getCust_name());        //4.提交事务        tx.commit();        //5.关闭资源        session.close();    }    /**     * 修改数据库(先查询后修改,没有修改的属性不变)(推荐)     */    @Test    public void test4_1(){        //1.获取session对象        Session session = HibernateUtils.openSesseion();        //2.获得事务操作对象,开启事务        Transaction tx = session.beginTransaction();        //3.操作        //根据oid查询        Customer customer = session.get(Customer.class, 1L);        //修改属性        customer.setCust_name("李四");//      session.update(customer);        //4.提交事务        tx.commit();        //5.关闭资源        session.close();    }    /**     * 修改数据库,只修改修改属性,其他项置为null     */    @Test    public void test4_2(){        //1.获取session对象        Session session = HibernateUtils.openSesseion();        //2.获得事务操作对象,开启事务        Transaction tx = session.beginTransaction();        //3.操作        Customer customer = new Customer();        customer.setCust_id(2L);        //修改属性        customer.setCust_name("王五");        session.update(customer);        //4.提交事务        tx.commit();        //5.关闭资源        session.close();    }    /**     * 删除数据库中数据(先查询,再删除)     */    @Test    public void test5_1(){        //1.获取session对象        Session session = HibernateUtils.openSesseion();        //2.获得事务操作对象,开启事务        Transaction tx = session.beginTransaction();        //3.操作        Customer customer = session.get(Customer.class, 1L);        //删除属性        session.delete(customer);        //4.提交事务        tx.commit();        //5.关闭资源        session.close();    }    /**     * 删除数据库中数据(根据id删除属性)(推荐)     */    @Test    public void test5_2(){        //1.获取session对象        Session session = HibernateUtils.openSesseion();        //2.获得事务操作对象,开启事务        Transaction tx = session.beginTransaction();        //3.操作        Customer customer = new Customer();        customer.setCust_id(2L);        //删除属性        session.delete(customer);        //4.提交事务        tx.commit();        //5.关闭资源        session.close();    }           }

Transaction对象

功能:用于操作事务的方法

import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;import org.junit.Test;/** * Transaction对象详解 * 用于操作事务的方法 * 获得增删改查操作 * @author Administrator * */public class Demo04 {    @Test    public void test1(){        //1.创建配置读取对象,读取配置文件        Configuration conf = new Configuration().configure();        //2.根据配置创建SessionFactory        SessionFactory sf = conf.buildSessionFactory();        //3.创建session方式一:返回一个全新的session对象        Session session = sf.openSession();        //4.获得事务操作对象        Transaction tx = session.getTransaction();        //5.开启事务        tx.begin();        //将4和5两部合并,获取事务操作对象并开启事务        Transaction tx2 = session.beginTransaction();        //6.提交事务        tx2.commit();        //7.回滚事务        tx2.rollback();    }}

实体对象

书写规则

  1. 提供一个无参public访问控制符的构造器
  2. 提供一个标识属性,映射数据表主键字段
  3. 所有属性提供public访问控制阀的set/get方法
  4. 属性尽量使用基本数据类型的包装类型
  5. 不要用final修饰class
  6. 实现java.io.Serializable接口(建议,不是hibernate要求规范)

主键生成策略

决定对象在执行保存时,主键如何获得

代理主键:表达业务之外的字段,没有业务意义
increment:先查询表中id最大值,加1作为新的主键值,有线程安全问题,测试时使用
identity:依赖于数据库中的主键自增
sequence:使用Oracle中序列来生成id值
hilo:(用不到),hibernate高地位算法来实现主键自增效果
native:自动三选一,identity|sequence|hilo
uuid:字符串类型主键,生成随机字符串作为主键,注意长度应超过32位,

自然主键:包含业务含义
assigned:用于自然主键,手动指定id值

hibernate中的对象状态

瞬时状态

  1. 对象没有oid值
  2. 对象没有与session关联

持久化状态

  1. 对象有oid值
  2. 对象与session有关联

特点:持久化状态的对象,会在事务提交时自动与事务同步

游离|托管状态

  1. 对象有oid值
  2. 对象没有与session关联

对象状态的转换

这里写图片描述

0 0
原创粉丝点击