Hibernate复习(一)

一、框架体系结构
这里写图片描述
SSH框架和SSM框架(虽然后者还没有学到)

二、Hibernate基础
①定义:
Hibernate是一个轻量级JavaEE应用的持久层解决方案,是一个关系从数据库ORM框架
Hibernate提供了对关系数据库增删改查操作
②优点:
 Hibernate对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码
 Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的orm实现,它很大程度的简化了dao层编码工作 session.save(User);
 Hibernate使用java的反射机制
 Hibernate的性能非常好,因为它是一个轻量级框架。映射的灵活性很出色。它支持很多关系型数据库,从一对一到多对多的各种复杂关系
三、Hibernate基础案例
1.jar包:
antlr.jar:解析框架,Hibernate用于解析HQL
hibernate3.jar:核心
dom4j.jar:解析xml
jta.jar:事务规范
hibernate-jpa-api.Final.jar:jpa规范支持
slf4j-api.jar:日志框架
2.数据库及核心配置文件

<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <!-- SessionFactory,相当于之前学习连接池配置 -->
    <session-factory>
        <!-- 1 基本4项 -->
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql:///h_day01_db</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">1234</property>

        <!-- 2 与本地线程绑定 -->
        <property name="hibernate.current_session_context_class">thread</property>

        <!-- 3 方言:为不同的数据库,不同的版本,生成sql语句(DQL查询语句)提供依据 
            * mysql 字符串 varchar
            * orcale 字符串 varchar2
        -->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>

        <!-- 4 自动创建表(了解) ,学习中使用,开发不使用的。
            * 开发中DBA 先创建表,之后根据表生产 PO类
            * 取值:
            update:【】
                如果表不存在,将创建表。
                如果表已经存在,通过hbm映射文件更新表(添加)。(映射文件必须是数据库对应)
                    表中的列可以多,不负责删除。
            create :如果表存在,先删除,再创建。程序结束时,之前创建的表不删除。【】
            create-drop:与create几乎一样。如果factory.close()执行,将在JVM关闭同时,将创建的表删除了。(测试)
            validate:校验 hbm映射文件 和 表的列是否对应,如果对应正常执行,如果不对应抛出异常。(测试)
        -->
        <property name="hibernate.hbm2ddl.auto">create</property>

        <!-- 添加映射文件 
            <mapping >添加映射文件
                resource 设置 xml配置文件 (addResource(xml))
                class 配置类 (addClass(User.class)) 配置的是全限定类名
        -->
        <mapping  resource="com/itheima/a_hello/User.hbm.xml"/>
    </session-factory>


</hibernate-configuration>

测试类:

@Test
    public void demo01(){
        User user = new User();
        user.setUsername("swj");
        user.setPassword("1234");


        //1 加载配置文件获得核心配置对象
        Configuration config = new Configuration().configure();
        //2 获得工厂 SessionFactory,相当于连接池
        SessionFactory factory = config.buildSessionFactory();
        //3获得会话session,相当于链接Connection
        Session session = factory.openSession();
        //4 开启事务
        Transaction transaction = session.beginTransaction();

        //操作
        session.save(user);

        //5 提交事务 | 回滚事务
        transaction.commit();
        //6 释放资源--关闭session
        session.close();
        //7 释放资源--关闭工厂factory
        factory.close();
    }

四、API详解
①SessionFactory
(相当于java web 连接池)管理所有session

public class sessionfactory_test {
    @Test
    //SessionFactory 创建session的工厂
    public void fun1(){
        //1加载配置
        Configuration  conf = new Configuration().configure();
        //2 根据Configuration 配置信息创建 SessionFactory
        SessionFactory sf = conf.buildSessionFactory();
        //3 获得session
        //3.1 openSession => 获得一个全新的Session对象
        sf.openSession();
        //3.2 getCurrentSession => 获得与当前线程绑定的session对象
        // 调用getCurrentSession 需要加上一个配置: <property name="hibernate.current_session_context_class">thread</property>
        sf.getCurrentSession();

    }
}

②Session会话
 Session 相当于 JDBC的 Connection – 会话
 通过session操作PO对象 –增删改查
save 保存
update 更新
delete 删除
get 通过id查询,如果没有 null
load 通过id查询,如果没有抛异常
createQuery(“hql”) 获得Query对象:
hql语句:hibernate提供面向对象查询,使用对象(类)和属性进行查询
createCriteria(Class) 获得Criteria对象:
qbc(query by criteria),hibernate提供纯面向对象查询语言,提供直接使用PO对象进行操作

③Transaction 事务
开启事务 beginTransaction()
获得事务 getTransaction()
提交事务:commit()
回滚事务:rollback()

五、Hibernate中持久化类
①持久化对象的唯一标识OID
 Java按地址区分同一个类的不同对象
 关系数据库用主键区分同一条记录
 Hibernate使用OID来建立内存中的对象和数据库中记录的对应关系
结论: 对象的OID和数据库的表的主键对应。为保证OID的唯一性,应该让Hibernate来为OID赋值

②自然主键和代理主键
主键须具备:不为空;不能重复;不能改变
自然主键: 在业务中,某个属性符合主键的三个要求.那么该属性可以作为主键列.
代理主键: 在业务中,不存符合以上3个条件的属性,那么就增加一个没有意义的列.作为主键.

③基本数据与包装类型
 基本数据类型和包装类型对应hibernate的映射类型相同
 基本类型无法表达null、数字类型的默认值为0。
 包装类默认值是null。当对于默认值有业务意义的时候需要使用包装类。

④类型对应
这里写图片描述

⑤普通属性

<hibernate-mapping> 
            package 用于配置PO类所在包
                例如: package="com.itheima.d_hbm"
        <class> 配置 PO类 和 表 之间对应关系
            name:PO类全限定类名
                例如:name="com.itheima.d_hbm.Person"
                如果配置 package,name的取值可以是简单类名 name="Person"
            table : 数据库对应的表名
            dynamic-insert="false" 是否支持动态生成insert语句
            dynamic-update="false" 是否支持动态生成update语句
                如果设置true,hibernate底层将判断提供数据是否为null,如果为null,insert或update语句将没有此项。
        普通字段
            <property>
                name : PO类的属性
                column : 表中的列名,默认name的值相同
                type:表中列的类型。默认hibernate自己通过getter获得类型,一般情况不用设置
                    取值1: hibernate类型
                        string 字符串
                        integer 整形
                    取值2: java类型 (全限定类名)
                        java.lang.String 字符串
                    取值3:数据库类型
                        varchar(长度) 字符串
                        int 整形
                        <property name="birthday">
                            <column name="birthday" sql-type="datetime"></column>
                        </property>
                        javabean 一般使用类型 java.util.Date
                        jdbc规范提供3中
                            java类型              mysql类型
                            java.sql.Date       date
                            java.sql.time       time
                            java.sql.timestamp  timestamp
                            null                datetime

                            以上三个类型都是java.util.Date子类

                length : 列的长度。默认值:255
                not-null : 是否为null
                unique : 是否唯一
                access:设置映射使用PO类属性或字段
                    property : 使用PO类属性,必须提供setter、getter方法
                    field : 使用PO类字段,一般很少使用。
                insert 生成insert语句时,是否使用当前字段。
                update 生成update语句时,是否使用当前字段。
                    默认情况:hibernate生成insert或update语句,使用配置文件所有项
        注意:配置文件如果使用关键字,列名必须使用重音符    

六、对象状态与一级缓存
①Hibernate三种状态:瞬时态、持久态、托管态

瞬时态:transient,session没有缓存对象,数据库也没有对应记录。
    OID特点:没有值
持久态:persistent,session缓存对象,数据库最终会有记录。(事务没有提交)
    OID特点:有值
脱管态:detached,session没有缓存对象,数据库有记录。
    OID特点:有值

这里写图片描述

②一级缓存

介绍:又称为session级别的缓存。当获得一次会话(session),hibernate在session中创建多个集合(map),用于存放操作数据(PO对象),为程序优化服务,如果之后需要相应的数据,hibernate优先从session缓存中获取,如果有就使用;如果没有再查询数据库。当session关闭时,一级缓存销毁。

2.1一级缓存快照

快照:与一级缓存一样的存放位置,对一级缓存数据备份。保证数据库的数据与 一级缓存的数据必须一致。如果一级缓存修改了,在执行commit提交时,将自动刷新一级缓存,执行update语句,将一级缓存的数据更新到数据库。

这里写图片描述

refresh 保证 一级缓存的数据 与 数据库的数据 保持一致。将执行select语句查询数据库,将一级缓存中的数据覆盖掉。只要执行refresh都将执行select语句。

③PO对象操作

save方法:瞬时态 转换 持久态 ,会初始化OID
    1.执行save方法,立即触发insert语句,从数据库获得主键的值(OID值)
    2.执行save方法前,设置OID将忽略。
    3.如果执行查询,session缓存移除了,在执行save方法,将执行insert
    注意:持久态对象不能修改OID的值

persist方法:瞬时态 转换 持久态 ,不会立即初始化OID
    注意: persist方法不会立即得到ID,所以执行sql语句的时机要靠后.

update:脱管态 转换 持久态
如果OID在数据存放的,将执行update语句
如果OID不存在将抛异常
    注意1:如果数据没有修改,执行save方法,将触发update语句。
    查询速度 比 更新速度快
    通过<class select-before-update> 来设置更新前先查询,如果没有改变就不更新。
    总结:update 之后对象 持久态

saveOrUpdate
    代理主键:
    判断是否有OID
        如果没有OID,将执行insert语句
        如果有OID,将执行update语句。
    自然主键:
    先执行select语句,查询是否存放
    如果不存在,将执行insert
    如果存在,将执行update

delete
    总结:PO对象状态:瞬时态、持久态、脱管态
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
后台采用apache服务器下的cgi处理c语言做微信小程序后台逻辑的脚本映射。PC端的服务器和客户端都是基于c语言写的。采用mysql数据库进行用户数据和聊天记录的存储。.zip C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植性强等特点,被广泛应用于操作系统、嵌入式系统、数据库、编译器等领域的开发。C语言的基本语法包括变量、数据类型、运算符、控制结构(如if语句、循环语句等)、函数、指针等。下面详细介绍C语言的基本概念和语法。 1. 变量和数据类型 在C语言中,变量用于存储数据,数据类型用于定义变量的类型和范围。C语言支持多种数据类型,包括基本数据类型(如int、float、char等)和复合数据类型(如结构体、联合等)。 2. 运算符 C语言中常用的运算符包括算术运算符(如+、、、/等)、关系运算符(如==、!=、、=、<、<=等)、逻辑运算符(如&&、||、!等)。此外,还有位运算符(如&、|、^等)和指针运算符(如、等)。 3. 控制结构 C语言中常用的控制结构包括if语句、循环语句(如for、while等)和switch语句。通过这些控制结构,可以实现程序的分支、循环和多路选择等功能。 4. 函数 函数是C语言中用于封装代码的单元,可以实现代码的复用和模块化。C语言中定义函数使用关键字“void”或返回值类型(如int、float等),并通过“{”和“}”括起来的代码块来实现函数的功能。 5. 指针 指针是C语言中用于存储变量地址的变量。通过指针,可以实现对内存的间接访问和修改。C语言中定义指针使用星号()符号,指向数组、字符串和结构体等数据结构时,还需要注意数组名和字符串常量的特殊性质。 6. 数组和字符串 数组是C语言中用于存储同类型数据的结构,可以通过索引访问和修改数组中的元素。字符串是C语言中用于存储文本数据的特殊类型,通常以字符串常量的形式出现,用双引号("...")括起来,末尾自动添加'\0'字符。 7. 结构体和联合 结构体和联合是C语言中用于存储不同类型数据的复合数据类型。结构体由多个成员组成,每个成员可以是不同的数据类型;联合由多个变量组成,它们共用同一块内存空间。通过结构体和联合,可以实现数据的封装和抽象。 8. 文件操作 C语言中通过文件操作函数(如fopen、fclose、fread、fwrite等)实现对文件的读写操作。文件操作函数通常返回文件指针,用于表示打开的文件。通过文件指针,可以进行文件的定位、读写等操作。 总之,C语言是一种功能强大、灵活高效的编程语言,广泛应用于各种领域。掌握C语言的基本语法和数据结构,可以为编程学习和实践打下坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值