hibernate

Hibernate开发步骤搭建

  • 1、导入相关jar包(Hibernate压缩包 > lib包 > required包下所有的jar,外加log4j.jar和数据库驱动包)
1.png
  • 2、编写映射文件描述类与数据库表之间的关系

    • 引入dtd约束(Hibernate压缩包 > project > etc文件下有)
    <!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    
    • 映射文件推荐命名规则:类名.hbm.xml
  • 3、编写核心配置文件(位置在src下,名字叫做 hibernate.cfg.xml)

    • 引入核心配置文件dtd约束
    <!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
    
    • 配置数据库连接信息
        <!-- 配置连接数据库信息 -->
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql:///db_hibernate?useUnicode=true&characterEncoding=utf-8</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password"></property>
    
    • 配置数据库方言(方言同时设置数据的存储引擎,指定引擎为InnoDB,不指定外键不能用)
        <!-- 是否开启mysql数据库方言,同时指定表的存储引擎 -->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>  
    
    • 配置其他选配信息
        <!-- 显示执行的SQL语句,并对SQL语句格式进行设置 -->
        <property name="show_sql">true</property>
        <property name="format_sql">true</property>
        <!-- 自动更新表结构  -->
        <property name="hbm2ddl.auto">update</property>
    
    • 引入映射文件
        <!-- 引入映射配置文件 -->
        <mapping resource="com/wzw/bean/User.hbm.xml"/>
    

配置映射文件

配置实体类与数据表的联系

    ``` xml
    <class name="com.wzw.bean.User" table="tb_user">类与表的描述信息</class>
    ```

配置主键(hibernate要求实体类里面有一个属性作为唯一值,对应主键,主键可以有不同的生成策略)

    ``` xml
        <!-- 配置主键  -->
        <id name="id" column="tb_id">
            <!-- 配置主键生成策略 -->
            <generator class="native"></generator>
        </id>
    ```

    注意:主键生成策略(generator标签):native(根据本地数据库支持主键生成方式)、uuid(根据uuid算法生成一个32位16进制的字符串,推荐使用)

配置实体类属性与数据表字段的对应关系

    - 实体类属性与数据表字段可以使用<column>标签进行配置

    ``` xml
        <property name="username">
            <column name="tb_username"></column>
        </property>
    ```

    - 列名可以不写,默认和实体类名字段一样

    ``` xml
    <property name="username"></property>
    ```

    - type可以不写,默认和实体字段属性一致

    ``` xml
    <property name="username" column="tb_username" type="java.lang.String"></property>
    ```

    - length设置数据表中对应字段的长度,默认进行设置

    ``` xml
    <property name="username" column="tb_username" length="10"></property>
    ```

    - 普通方式配置实体类属性与数据表字段的关系

    ``` xml
    <property name="username" column="tb_username"></property>
    ```

使用Hibernate API操作

操作的主体流程

// 创建Configuration(hibernate包下)对象
        Configuration configuration = new Configuration();
        // 加载配置文件
        configuration.configure();
        // 得到SessionFactory对象
        SessionFactory sessionFactory = configuration.buildSessionFactory();
        // 得到session对象
        Session session = sessionFactory.openSession();
        // 开启事务
        Transaction transaction = session.beginTransaction();
        try {
            /*进行crud操作*/
            transaction.commit();
        } catch (Exception e) {
            if (transaction != null) {
                // 回滚事务
                transaction.rollback();
            }
            e.printStackTrace();
        } finally {
            // 释放session
            session.close();
            sessionFactory.close();
        }

实体类的三种状态

1、瞬时态:缓存中不存在,数据库中也不存在(不含有id与session无关)

2、持久态:缓存中存在,数据库中也存在(含有id,与session有关)

3、游离态(托管态):缓存中不存在,数据库中存在(含有id,与session无关)

hibernate缓存

  • hibernate缓存的作用

    1、数据存放到数据库里面,数据库本身是文件系统,使用流的方式操作文件效率不高

    2、把数据放入缓存中,不需要使用流的方式,可以直接读取数据

    3、再次使用相同语句进行查询时,先在缓存中查找,提高了查询效率

  • hibernate一级缓存

    1、存储的是数据而不是对象(通过id进行辨别)

    2、一级缓存使用范围是session(hibernate的session对象)

    3、默认进行开启

    特性:session一级缓存中有一个快照区,快照区保存原始的数据库信息,因此持久态实体类对象,改变对象的数据关闭缓存时自动进行更新(可以不调用update()方法)

增删改查API

  • get()是立即查询,查询出的对象是持久态
        // 向数据库中查询数据
        // 结论:get方法,立即查询(查询出的对象为持久态)
        User user = session.get(User.class, 7);
  • load()延迟查询
    // 向数据库中查询数据
    // 结论:load方法,延迟加载(查询出的对象为持久态),只有在使用查询出的对象时才进行查询,其它方面与get一样
    User user = session.load(User.class, 6);
  • save()添加
    // 向数据库中插入一条数据,返回值为插入数据的主键(save方法会把瞬时态对象变成持久态对象)
    Serializable serializable = session.save(user);
  • saveOrUpdate()添加或修改
    // 向数据库中插入一条数据,或对数据进行修改
    // 结论1:saveOrUpdate方法,如果添加的对象不含有主键属性,则与save方法执行相同(把瞬时态对象变为持久态对象)
    // 结论2:saveOrUpdate方法,如果添加的对象含有主键属性,会把对象保存到session一级缓存(相同主键值的对象保存在缓存中会报错,添加的对象进入持久态),
    // 清空缓存时session一级缓存会与一级快照区的数据进行比对,通过这种方式对数据进行修改(不管与数据库数据是否相同,都会进行修改)
    session.saveOrUpdate(user);
  • marge()添加或修改,该方法的返回值是一个持久化对象
    // 向数据库中插入一条数据,或对数据进行修改
    // 结论1:merge方法,如果添加的对象不含有主键属性,则与save方法执行相同(但是不会把瞬时态对象变为持久态对象)
    // 结论2:merge方法,如果添加的对象含有主键属性,先查询对象把对象数据放入快照区会,把传入的对象保存到session一级缓存(相同主键值的对象保存在缓存中会报错,对象不会进入持久状态),
    // 清空缓存时session一级缓存会与一级快照区的数据进行比对,通过这种方式对数据进行修改(两者相同不会进行修改)
    session.merge(user);
  • update()修改数据
    // 向数据库中修改数据
    // 结论:update方法,把传入的对象保存到session一级缓存(相同主键值的对象保存在缓存中会报错,对象进入持久状态),
    // 清空缓存时session一级缓存会与一级快照区的数据进行比对,通过这种方式对数据进行修改(两者相同不会进行修改)
    session.update(user);
  • delete()删除数据
    // 向数据库中删除数据
    // 结论:delete方法,删除一级缓存中的相应数据(不清除快照区的数据),并阻止这个对象的操作,
    // 清除缓冲区时通过缓冲区和快照区的对比进行删除
    session.delete(user);

hibernate绑定session

  • hibernate帮我们实现了与本地线程的绑定(底层还是ThreadLocal)

  • 在主配置文件中进行配置,通过sessionFactory.getCurrentSession();得到与线程绑定的session

    <!-- session与本地线程进行绑定 -->
    <property name="hibernate.current_session_context_class">thread</property>
        
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,588评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,456评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,146评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,387评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,481评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,510评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,522评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,296评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,745评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,039评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,202评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,901评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,538评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,165评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,415评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,081评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,085评论 2 352

推荐阅读更多精彩内容