hibernate笔记

=================================

Hibernate
=================================

为什么使用 HIbernate?
------------------------------
* 封装繁琐的jdbc操作
* O-R Mapping 框架
Object-Relation 对象关系映射

hibernate 配置文件
------------------------------
* 映射配置文件

类名.hbm.xml

配置:
1. 类-表 对应关系
2. 属性-字段 对应关系

* hibernate.cfg.xml

1. 配置 jdbc 连接信息
2. 加载的映射配置文件

hibernate 配置步骤
------------------------------------
1. 数据库表
2. 创建封装数据的对象
3. 映射关系配置
4. hibernate.cfg.xml

1.
------------------
drop database if exists hibernate_test;
create database hibernate_test
default character set utf8;
use hibernate_test;

drop table if exists t_xuesheng;
create table t_xuesheng(
id int primary key auto_increment,
name varchar(16),
gender char(1),
birthday date,
is_graduate int(1)
)engine=innodb default character set utf8;

2.
------------------
test.xuesheng.entity.Xuesheng
添加属性:
private int id;
private String name;
private String gender;
private java.util.Date birthday;
private boolean isGraduate;

构造方法:
无参构造
全参构造

3.
------------------
映射配置文件,
配置文件格式参考文档 1.2.2 节

4.
------------------
src\hibernate.cfg.xml

配置 driver、url、username、password
(项目中引入mysql驱动jar文件)

配置文件格式参考文档 1.2.3 节


hibernate 数据存取 API
------------------------------------
Configuration
读取 hibernate.cfg.xml,
并创建 SessionFactory

SessionFactory
* 帮助创建数据库连接
* 可类比为 jdbc 的 DriverManager

Session
* 数据库连接
* 可类比为 jdbc 的 Connection
* 含有所有数据存取 API

Session 存取数据的方法
--------------------------
get(类型, 主键值)
根据主键值查询
* 若主键值不存在,会得到null

load(类型, 主键值)
根据主键值查询
* 延迟加载
* 若主键值不存在,会出现异常

load 方法中,使用CGLIB工具包(字节码增强工具)
动态生成了一个 Xuesheng 的子类: Xuesheng$$EnhancerByCGLIB$$a92a015c
在这个类中,重写了 get非主键属性() 方法:
判断属性是否查询过,
若没有查询过,此时做查询

延迟查询、延迟加载
数据不使用不查询,知道使用时才查询
最大限度的减少 sql 执行

load(空的实体对象, 主键值)
根据主键值查询,
查询结果,放入给定的实体对象

save(实体对象)
insert into

除了 insert 数据,
还会从数据库取出刚刚生成的 id 值放入实体对象
mysql: select last_insert_id()

update(实体对象)
根据主键,修改一条数据

实体对象内,要含有存在的主键值
若主键值不存在,会出现异常

delete(实体对象)
根据主键值删除

实体对象内,要含有存在的主键值
若主键值不存在,会出现异常

saveOrUpdate(实体对象)
判断实体对象内是否有主键值

如果没有,save()
如果有,update() 若主键不存在,会出现异常


Session 一级缓存特性及 API
-------------------------------------
查询的数据会在 Session 内进行缓存
缓存结果,可以提高效率

* Session 内缓存的对象存在副本
* commit 时,会比较session缓存内对象与其副本对象是否一致,
若不一致,执行 update()
* 允许清除副本对象
session.setReadOnly(实体对象, true)


一级缓存控制 API
------------------------------
* 缓存内不能关联两个相同主键值的对象
* 解决方式:
1.清除缓存内对象
2.将数据复制到缓存的对象中

session.evict(已缓存的实体对象)
清除缓存内对象

session.clear()
清空缓存

commit 时对 sql 语句的优化
------------------------------
* hibernate 内部算法会判断所有 sql 优先级,
甚至可以忽略不必要的sql

session.flush()

* 如果不希望操作顺序被 hibernate 改变
或不希望 hibernate 忽略操作
执行 flush()
刷出之前的所有操作



session 特殊 API 小结
------------------------------
session.setReadOnly(实体对象, true) - 移除副本

session.evict(已缓存的实体对象) - 移除指定对象的缓存
session.clear() - 清空缓存

session.flush() - 刷出操作


主键生成方式 5.1.4.1 节
----------------------------------
identity:
自增主键

sequence:
oracle sequence
<generator class="sequence" >
<param name="sequence">sequence名称</param>
</generator>

assigned:
手动赋值

native:
identity, sequence 或者hilo
如果mysql,identity
如果oracle,要配置<param name="sequence">sequence名称</param>
其他,hilo随机生成

uuid.hex:
32个16进制字符

foreign:
one-to-one 中使用

increment:
查询 id 的最大值,加一生成新的主键值
线程安全有问题



数据类型 5.2.2 节
----------------------------------
1. java对象类型
java.lang.Integer
java.lang.String
java.lang.Double
java.sql.Date
java.sql.Time
java.sql.Timestamp

2. 基本类型
int
double

3. hibernate 的类型别名
string
integer
double
date
time
timestamp


HQL - Hibernate Query Language
------------------------------------------
面向对象的 SQL

示例:
* select name, isGraduate from test.hibernate.xuesheng.Xuesheng
返回集合, 集合内是 Object[] 数组

* from Xuesheng
* from Xuesheng where name like '%zhang%'

* from Xuesheng x
where x.name like '%zhang%'
and x.isGraduate=false

* select new Xuesheng(x.name,x.isGraduate)
from Xuesheng x
学生类内必须存在相应的构造方法

* select x
from
Xuesheng x,
Banji b
where
x.banjiId=b.id

* 关联关系映射查询
* from Xuesheng where banji.id=?
* select banji from Xuesheng where name=?

* from Xuesheng x join fetch x.banji
fetch: 将 banji 抓到学生对象内








执行 HQL API
----------------------------------
1. Query q = session.createQuery("...where name=?, gender=:g")
2. q.setParameter(0, 数据类型自动辨别)
q.setString(1, "ffff")
q.setInteger(2, 3453)
q.setDouble(3, 3.14)
q.setParameterList(占位符名, 数组或集合)
3. 获得查询结果
a. q.list()
b. q.uniqueResult()

========================================================
========================================================

Log4j
-------------------------------------
输出调试信息
替代 System.out.println()

日志信息级别:
debug info warn error fatal

日志输出位置:
Appender
控制台
文件

名字空间:
test.hibernate.xuesheng.DEBUG_MESSAGE
debug:"hello"
warn: "1111"
error: "2222"

test.hibernate.Test1
"world"

log4j.rootLogger=所有名字空间的通配,配置输出级别和位置
log4j.logger.test.hibernate.xuesheng.DEBUG_MESSAGE=warn
log4j.logger.test.hibernate=off


hibernate 的 log4j 名字空间:
-----------------------------------------
输出 sql 语句
log4j.logger.org.hibernate.SQL=debug

输出事务信息
log4j.logger.org.hibernate.transaction=debug

输出二级缓存信息
log4j.logger.org.hibernate.cache=debug



hibernate 关联映射 (映射外键关系)
----------------------------------------------
一对多 | 多对一
--------------------------------------------
<many-to-one name="banji"
column="banji_id"
class="test.xuesheng.entity.Banji"
/>
lazy="false" 查询学生的同时,也立即查询学生关联的班级
fetch="join" 可用表连接的方式同时查询两张表的数据

* 绝大多数情况下都应该采用延迟加载

<bag name="xueshengList">
<key column="banji_id" />
<one-to-many
class="test.xuesheng.entity.Xuesheng" />
</bag>

一对一
--------------------------------------------
1. 主键关联

drop table if exists t_lianxi;
create table t_lianxi(
xuesheng_id int primary key,
email varchar(255),
qq varchar(20),
mobile varchar(20),
foreign key(xuesheng_id)
references t_xuesheng(id)
)engine=innodb default character set utf8;

* 创建 Lianxi 类
* 创建 Lianxi.hbm.xml 映射配置文件
* 主键生成方式: assigned
* hibernate.cfg.xml 中添加一行<mapping ...

<one-to-one name="" class="" />

2. 具有唯一约束的外键字段关联

alter table t_user add(
xuesheng_id int unique,
foreign key(xuesheng_id)
references t_xuesheng(id)
);

User 设置:
--------------------------
<many-to-one name="xuesheng"
column="xuesheng_id"
class="Xuesheng"
unique="true"
/>

通过 unique="true" 设置为一对一关系

Xueshkeng 设置:
--------------------------
<one-to-one name="user"
class="User"
property-ref="xuesheng"
/>

通过property-ref="xuesheng"设置,
hibernate 可以知道:
学生表主键 id,关联 user 中 xuesheng_id


多对多
--------------------------------------------
drop table if exists t_kecheng;
create table t_kecheng(
id char(32) primary key,
name varchar(32)
)engine=innodb default character set utf8;

drop table if exists t_xs_kc_link;
create table t_xs_kc_link(
xs_id int,
kc_id char(32),
primary key(xs_id,kc_id),
foreign key(xs_id)
references t_xuesheng(id),
foreign key(kc_id)
references t_kecheng(id)
)engine=innodb default character set utf8;

* 创建 Kecheng 类
* 创建 Kecheng.hbm.xml
* 主键生成方式: uuid.hex
* 修改 hibernate.cfg.xml 添加一条 <mapping...

<set name="kechengSet" table="t_xs_kc_link">
<key column="xs_id" />
<many-to-many
column="kc_id"
class="Kecheng" />
</set>




关联关系4个属性
-----------------------------------
lazy
-many: true|false
-one: proxy|false

fetch
select|join
立即加载时,设置为join,减少 sql 语句

inverse
true
放弃外键字段控制权,控制权交给对方

* 通常在“一方”设置

cascade
all|delete|save-update|delete-orphan

* delete-orphan 只能在 one-to-many 中使用
* 通常从“一方”向“多方”级联



hibernate 组件映射
----------------------------------------------
drop table if exists t_user;
create table t_user(
id int primary key,
username varchar(32),
password varchar(32),
street varchar(255),
city varchar(32),
country varchar(32)
)engine=innodb default character set utf8;

* 创建 Address 类
属性: street,city,contry
* 创建 User 类
属性: id,username,password,address
* 创建 User.hbm.xml
* 主键生成方式: increment
* 修改 hibernate.cfg.xml 添加 <mapping...

<component name="address">
<property ...
</component>




hibernate 继承映射
----------------------------------------------
1. 单表 -》 类继承结构
-----------------------------------
drop table if exists t_product;
create table t_product(
id int primary key auto_increment,
name varchar(64),
price numeric(8,2),
amount int,
type varchar(16),

author varchar(255),
pages int,

singer varchar(32),
style varchar(32)
)engine=innodb default character set utf8;




多个框架中 jar 文件版本冲突
------------------------------------------
XML11....
----------------------

hibernate
xerces-x.x.x.jar
tomcat 中也有这个 jar 文件,版本不一致

移除 hibernate 中携带的 jar 文件
window->preferences->检索 hibernate
->找到 myeclipse/project capabilities/hibernate
->hibernate 3.1、3.2、3.3
->找到xerces-x.x.x.jar,移除

如果要恢复,右下角点 restore default

antlr... 方法找不到
-----------------------------
hibernate
antlr-2.7.6rc1.jar
struts2
antlr-2.7.2.jar

移除 struts2 的低版本 jar 文件
数据治理是确保数据准确性、可靠性、安全性、可用性和完整性的体系和框架。它定义了组织内部如何使用、存储、保护和共享数据的规则和流程。数据治理的重要性随着数字化转型的加速而日益凸显,它能够提高决策效率、增强业务竞争力、降低风险,并促进业务创新。有效的数据治理体系可以确保数据在采集、存储、处理、共享和保护等环节的合规性和有效性。 数据质量管理是数据治理中的关键环节,它涉及数据质量评估、数据清洗、标准化和监控。高质量的数据能够提升业务决策的准确性,优化业务流程,并挖掘潜在的商业价值。随着大数据和人工智能技术的发展,数据质量管理在确保数据准确性和可靠性方面的作用愈发重要。企业需要建立完善的数据质量管理和校验机制,并通过数据清洗和标准化提高数据质量。 数据安全与隐私保护是数据治理中的另一个重要领域。随着数据量的快速增长和互联网技术的迅速发展,数据安全与隐私保护面临前所未有的挑战。企业需要加强数据安全与隐私保护的法律法规和技术手段,采用数据加密、脱敏和备份恢复等技术手段,以及加强培训和教育,提高安全意识和技能水平。 数据流程管理与监控是确保数据质量、提高数据利用率、保护数据安全的重要环节。有效的数据流程管理可以确保数据流程的合规性和高效性,而实时监控则有助于及时发现并解决潜在问题。企业需要设计合理的数据流程架构,制定详细的数据管理流程规范,并运用数据审计和可视化技术手段进行监控。 数据资产管理是将数据视为组织的重要资产,通过有效的管理和利用,为组织带来经济价值。数据资产管理涵盖数据的整个生命周期,包括数据的创建、存储、处理、共享、使用和保护。它面临的挑战包括数据量的快速增长、数据类型的多样化和数据更新的迅速性。组织需要建立完善的数据管理体系,提高数据处理和分析能力,以应对这些挑战。同时,数据资产的分类与评估、共享与使用规范也是数据资产管理的重要组成部分,需要制定合理的标准和规范,确保数据共享的安全性和隐私保护,以及建立合理的利益分配和权益保障机制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值