- 浏览: 23652 次
- 性别:
文章分类
最新评论
=================================
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 文件
相关推荐
在深入探讨《hibernate笔记.txt》所提及的关键知识点前,我们先来解析一下标题和描述中的核心概念。“自上而下的依赖,单向依赖,层与层之间最好依赖抽象”,这一描述实际上触及了软件架构设计中的关键原则,特别是...
《韩顺平.2011版.hibernate笔记》是一份针对Hibernate框架的详细学习资料,由知名IT讲师韩顺平在2011年编撰而成。Hibernate是Java开发领域中广泛使用的对象关系映射(ORM)框架,它极大地简化了数据库操作,使开发者...
【传智播客 Hibernate 笔记】是一份深入学习 Hibernate ORM 框架的资源集合,包括了 word 笔记、pdf 讲义、源代码以及相关分析图表和 jar 包,旨在帮助开发者全面理解并掌握 Hibernate 的核心概念与实际应用。...
《Hibernate笔记完整版》 在Web开发领域,Hibernate作为三大框架之一,扮演着至关重要的角色。本文将全面介绍Hibernate,包括其数据持久化的概念、优缺点对比,以及Hibernate的核心概念和编程步骤。 对象持久化是...
《韩顺平Hibernate笔记》是一份详尽记录了著名IT讲师韩顺平关于Hibernate框架讲解内容的资料集合。Hibernate作为Java领域中广泛使用的对象关系映射(ORM)框架,极大地简化了数据库操作,使得开发者可以更加专注于...