hibernate 的简单入门


Hibernate- Day01笔记

框架体系结构

hibernate入门
ORM框架
Hibernate是一个数据持久化层的ORM框架.
Object:对象,java对象,此处特指JavaBean
Relational:关系,二维表,数据库中的表。
映射|映射元数据:对象中属性,与表的字段,存在对应关系。

什么是hibernate
  • Hibernate是轻量级JavaEE应用的持久层解决方案,是一个关系数据库ORM框架
    • ORM 就是通过将Java对象映射到数据库表,通过操作Java对象,就可以完成对数据表的操作
  • Hibernate提供了对关系型数据库增删改查操作

主流的ORM框架
  • JPA Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系(只有接口规范)
  • Hibernate 最流行ORM框架,通过对象-关系映射配置,可以完全脱离底层SQL
  • MyBatis 本是apache的一个开源项目 iBatis,支持普通 SQL查询,存储过程和高级映射的优秀持久层框架
  • Apache DBUtils 、Spring JDBCTemplate

优点
Hibernate对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码
Hibernate是一个基于jdbc的主流持久化框架,是一个优秀的orm实现,它很大程度的简化了dao层编码工作 session.save(User);
Hibernate使用java的反射机制
Hibernate的性能非常好,因为它是一个轻量级框架。映射的灵活性很出色。它支持很多关系型数据库,从一对一到多对多的各种复杂关系



入门案例
编写流程
  • 1. 导入jar包
  • 2. 创建数据库和表
  • 3. 编写核心配置文件(hibernate.cfg.xml)--> 配置获得链接等参数
  • 4. 编写映射文件 hibernate mapping(*.hbm.xml)
  • 5 使用api测试

数据库和表
create database h_day01_db;
use h_day01_db;
create table t_user(
id int auto_increment primary key,
username varchar(50),
password varchar(30)
);


导入jar包
  • hibernate必须的jar包
  • 数据库驱动包
编写JavaBean + 映射文件
  • 文件位置:javabean同包
  • 文件名称:javabean同名
  • 扩展名:*.hbm.xml
  • 内容:
添加约束


编写核心配置文件
  • 位置:类路径(classpath、src)-->WEB-INF/classes
  • 名称:hibernate.cfg.xml
  • 内容:
添加约束



测试
@Test
public void demo01 (){
User user = n ew User( );
user.setUsernam e("伟哥 哥" );
user.setPasswor d("123 4" );
//1 加载配置文件获得核心配置对象
Configuration config = n ew 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( );
}

常见异常
解决方案:
将映射文件添加到核心配置文件中 hbm.xml --> hibernate.cfg.xml



api详解
体系结构
PO:persistent object ,用于与数据库交互数据。--dao层 (JavaBean + hbm )
BO:Business object 业务数据对象。--service层
VO:Value Object 值对象。--web层
开发中:直接使用JavaBean 描述三个对象。

Configuration 配置对象
  • hibernate 核心配置文件种类
hibernate.cfg.xml 通常使用xml配置文件,可以配置内容更丰富。
hibernate.properties 用于配置key/value 形式的内容,key不能重复的。配置有很多的局限性。一般不用。
参考文件:hibernate-distribution-3.6.10.Final\project\et c\ hibernate.properti es
提供了核心配置文件常用的配置项,及选择参数。
1.提供构造 new Configuration() hibernate将自动加载 hibernate.properties文件
hibernate.properties文件必须存放在类路径(src)下
2.提供方法 configure() 将加载src下的hibernate.cfg.xml
3.扩展api
configure(String) 加载指定目录下的 xml文件
4.手动加载配置文件
// 手动加载指定的配置文件
config.addResourc e("com/qianfeng/a_hello/User.hbm.xm l" );
// 手动加载指定类,对应的映射文件 User--> User.hbm.xml
config.addClass(Use r.cla ss );

  • 常见异常:
开发中:将hbm.xml映射 配置 hibernate.cfg.xml
学习中:可以使用 addClass 或 addResource

SessionFactory工厂
  • SessionFactory 相当于java web连接池,用于管理所有session
  • 获得方式:config.buildSessionFactory();
  • sessionFactory hibernate缓存配置信息 (数据库配置信息、映射文件,预定义HQL语句 等)
  • SessionFactory线程安全,可以是成员变量,多个线程同时访问时,不会出现线程并发访问问题。
  • 提供api:
//打开一个新的会话 session
factory.openSession( );
//获得当前线程中绑定的会话session
factory.getCurrentSession( );
hibernate支持,将创建的session绑定到本地线程中,底层使用ThreadLocal,在程序之间共享session。
1.必须在hibernate.cfg.xml 配置
<!-- 2 与本地线程绑定 -->
< property name = "hibernate.current_session_context_class" > thread </ property >
2.如果提交或回滚事务,底层将自动关闭session




Session 会话
  • Session 相当于 JDBC的 Connection -- 会话
  • 通过session操作PO对象 --增删改查
  • session单线程,线程不安全,不能编写成成员变量。
  • session api
save 保存
update 更新
delete 删除
get 通过id查询,如果没有 null
load 通过id查询,如果没有抛异常
createQuery("hql") 获得Query对象
createCriteria(Class) 获得Criteria对象


Transaction 事务
开启事务 beginTransaction()
获得事务 getTransaction()

提交事务:commit()
回滚事务:rollback()

try{
//开启
//session操作
//提交
} catch(e){
//回滚
}
扩展:不需要手动的管理事务,之后所有的事务管理都交予spring。

Query对象
  • hibernate执行hql语句
  • hql语句:hibernate提供面向对象查询语句,使用对象(类)和属性进行查询。区分大小写。
  • 获得 session.createQuery("hql")
  • 方法:
list() 查询所有
uniqueResult() 获得一个结果。如果没有查询到返回null,如果查询多条抛异常。

setFirstResult(int) 分页,开始索引数startIndex
setMaxResults(int) 分页,每页显示个数 pageSize

核心配置文件详解

详细配置

Hibernate中持久化类
编写规则
  • 提供一个无参数 public访问控制符的构造器
  • 提供一个标识属性,映射数据表主键字段
  • 所有属性提供public访问控制符的 set get 方法(javaBean)
  • 标识属性应尽量使用基本数据类型的包装类型
  • 不要用final修饰实体 (将无法生成代理对象进行优化)
持久化对象的唯一标识 OID
  • Java按地址区分同一个类的不同对象.
  • 关系数据库用主键区分同一条记录
  • Hibernate使用OID来建立内存中的对象和数据库中记录的对应关系
结论: 对象的OID和数据库的表的主键对应。为保证OID的唯一性,应该让Hibernate来为OID付值
区分自然主键和代理主键
  • 主键需要具备: 不为空/不能重复/不能改变
自然主键: 在业务中,某个属性符合主键的三个要求.那么该属性可以作为主键列.
代理主键: 在业务中,不存符合以上3个条件的属性,那么就增加一个没有意义的列.作为主键.
基本数据与包装类型
  • 基本数据类型和包装类型对应hibernate的映射类型相同
  • 基本类型无法表达null、数字类型的默认值为0。
  • 包装类默认值是null。当对于默认值有业务意义的时候需要使用包装类。

类型对应
Java数据类型
Hibernate数据类型
标准SQL数据类型
(PS:对于不同的DB可能有所差异)
byte、java.lang.Byte
byte
TINYINT
short、java.lang.Short
short
SMALLINT
int、java.lang.Integer
integer
INGEGER
long、java.lang.Long
long
BIGINT
float、java.lang.Float
float
FLOAT
double、java.lang.Double
double
DOUBLE
java.math.BigDecimal
big_decimal
NUMERIC
char、java.lang.Character
character
CHAR(1)
boolean、java.lang.Boolean
boolean
BIT
java.lang.String
string
VARCHAR
boolean、java.lang.Boolean
yes_no
CHAR(1)('Y'或'N')
boolean、java.lang.Boolean
true_false
CHAR(1)('Y'或'N')
java.util.Date、java.sql.Date
date
DATE
java.util.Date、java.sql.Time
time
TIME
java.util.Date、java.sql.Timestamp
timestamp
TIMESTAMP
java.util.Calendar
calendar
TIMESTAMP
java.util.Calendar
calendar_date
DATE
byte[]
binary
VARBINARY、BLOB
java.lang.String
text
CLOB
java.io.Serializable
serializable
VARBINARY、BLOB
java.sql.Clob
clob
CLOB
java.sql.Blob
blob
BLOB
java.lang.Class
class
VARCHAR
java.util.Locale
locale
VARCHAR
java.util.TimeZone
timezone
VARCHAR
java.util.Currency
currency
VARCHAR
普通属性



主键








Hibernate中持久化类(实体类JavaBean)
编写规则
  • 提供一个无参数 public访问控制符的构造器
  • 提供一个标识属性,映射数据表主键字段
  • 所有属性提供public访问控制符的 set get 方法(javaBean)
  • 标识属性应尽量使用基本数据类型的包装类型
  • 不要用final修饰实体 (将无法生成代理对象进行优化)
持久化对象的唯一标识 OID
  • Java按地址区分同一个类的不同对象.
  • 关系数据库用主键区分同一条记录
  • Hibernate使用OID来建立内存中的对象和数据库中记录的对应关系
结论: 对象的OID和数据库的表的主键对应。为保证OID的唯一性,应该让Hibernate来为OID付值
区分自然主键和代理主键
  • 主键需要具备: 不为空/不能重复/不能改变
自然主键: 在业务中,某个属性符合主键的三个要求.那么该属性可以作为主键列.
代理主键: 在业务中,不存符合以上3个条件的属性,那么就增加一个没有意义的列.作为主键.
基本数据与包装类型
  • 基本数据类型和包装类型对应hibernate的映射类型相同
  • 基本类型无法表达null、数字类型的默认值为0。
  • 包装类默认值是null。当对于默认值有业务意义的时候需要使用包装类。

类型对应
Java数据类型
Hibernate数据类型
标准SQL数据类型
(PS:对于不同的DB可能有所差异 )
byte、java.lang.Byte
byte
TINYINT
short、java.lang.Short
short
SMALLINT
int、java.lang.Integer
integer
INGEGER
long、java.lang.Long
long
BIGINT
float、java.lang.Float
float
FLOAT
double、java.lang.Double
double
DOUBLE
java.math.BigDecimal
big_decimal
NUMERIC
char、java.lang.Character
character
CHAR(1)
boolean、java.lang.Boolean
boolean
BIT
java.lang.String
string
VARCHAR
boolean、java.lang.Boolean
yes_no
CHAR(1)('Y'或'N')
boolean、java.lang.Boolean
true_false
CHAR(1)('Y'或'N')
java.util.Date、java.sql.Date
date
DATE
java.util.Date、java.sql.Time
time
TIME
java.util.Date、java.sql.Timestamp
timestamp
TIMESTAMP
java.util.Calendar
calendar
TIMESTAMP
java.util.Calendar
calendar_date
DATE
byte[]
binary
VARBINARY、BLOB
java.lang.String
text
CLOB
java.io.Serializable
serializable
VARBINARY、BLOB
java.sql.Clob
clob
CLOB
java.sql.Blob
blob
BLOB
java.lang.Class
class
VARCHAR
java.util.Locale
locale
VARCHAR
java.util.TimeZone
timezone
VARCHAR
java.util.Currency
currency
VARCHAR
普通属性



主键

主键生成策略:
每次插入记录时,主键的生成规则(7个)
(1)identity:主键自增,由数据库来维护,在插入数据库时不需要写主键,由数据库手动生成。
(2)increment(了解):主键自增,由hibernate来维护,每次插入数据时会从数据库中查找最大的id值,再+1作为新主键的值,在开发中不建议使用,因为会有线程安全的问题,比如多人同时访问。
(3)sequence(了解):oracle中主键自增
(4)hilo:与incement相似(开发中不适用),由hibernate来维护,是一种高低位算法。
其实:数据库来维护主键就行,不需要hibernate来维护
(5)native:自动三合一:hilo+sequence+identity
hibernate会去检测数据库是支持哪种主键维护策略,如果是mysql就用identity,如果是oracle,就采用sequence.
(6)uuid:产生随机字符串,作为主键,使用时注意主键必须是string类型
(7)assigned:自然主键生成策略,即没有策略,由用户自己输入,hibernate不会管理主键。此时主键就必须手动输入
对象状态与一级缓存
状态介绍
  • hibernate 规定三种状态:瞬时态、持久态、脱管态
  • 状态
瞬时态:transient,session没有缓存对象,数据库也没有对应记录。
OID特点:没有值
持久态:persistent,session缓存对象,数据库最终会有记录。(事务没有提交)
OID特点:有值
脱管态:detached,session没有缓存对象,数据库有记录。
OID特点:有值
转换
瞬时态/临时态
  • 获得:一般都只直接创建(new)
  • 瞬时态 转换 持久态
一般操作:save方法、saveOrUpdate
  • 瞬时态 转换 脱管态
一般操作:通过setId方法设置数据

例如:
User user = new User(); //瞬时态
user.setUid(1); //脱管态

持久态
  • 获得:
查询操作:get、loat、createQuery、createCriteria 等 获得都是持久态
执行save之后持久态
执行update之后持久态
  • 持久态 转换 瞬时态
执行delete() -
  • 持久态 转换 脱管态
session没有记录
session.close () 关闭

脱管态/游离态
  • 获得:
创建、并设置OID的
通过api获得
  • 脱管态 转换 持久态
一般操作:update()、saveOrUpdate



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

一级缓存操作
证明一级缓存


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

hibernate的事务
事务的特性
hibernate中使用事务
hibernate中的批量查询
HQL查询
Criteria查询
原生sql查询

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕业设计,基于SpringBoot+Vue+MySQL开发的公寓报修管理系统,源码+数据库+毕业论文+视频演示 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本公寓报修管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。此公寓报修管理系统利用当下成熟完善的Spring Boot框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的MySQL数据库进行程序开发。公寓报修管理系统有管理员,住户,维修人员。管理员可以管理住户信息和维修人员信息,可以审核维修人员的请假信息,住户可以申请维修,可以对维修结果评价,维修人员负责住户提交的维修信息,也可以请假。公寓报修管理系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。 关键词:公寓报修管理系统;Spring Boot框架;MySQL;自动化;VUE
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值