`

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 文件
分享到:
评论

相关推荐

    hibernate笔记.txt

    在深入探讨《hibernate笔记.txt》所提及的关键知识点前,我们先来解析一下标题和描述中的核心概念。“自上而下的依赖,单向依赖,层与层之间最好依赖抽象”,这一描述实际上触及了软件架构设计中的关键原则,特别是...

    韩顺平.2011版.hibernate笔记.zip

    《韩顺平.2011版.hibernate笔记》是一份针对Hibernate框架的详细学习资料,由知名IT讲师韩顺平在2011年编撰而成。Hibernate是Java开发领域中广泛使用的对象关系映射(ORM)框架,它极大地简化了数据库操作,使开发者...

    传智播客 hibernate笔记(word+pdf+源码)

    【传智播客 Hibernate 笔记】是一份深入学习 Hibernate ORM 框架的资源集合,包括了 word 笔记、pdf 讲义、源代码以及相关分析图表和 jar 包,旨在帮助开发者全面理解并掌握 Hibernate 的核心概念与实际应用。...

    Hibernate笔记完整版

    《Hibernate笔记完整版》 在Web开发领域,Hibernate作为三大框架之一,扮演着至关重要的角色。本文将全面介绍Hibernate,包括其数据持久化的概念、优缺点对比,以及Hibernate的核心概念和编程步骤。 对象持久化是...

    韩顺平hibernate笔记

    《韩顺平Hibernate笔记》是一份详尽记录了著名IT讲师韩顺平关于Hibernate框架讲解内容的资料集合。Hibernate作为Java领域中广泛使用的对象关系映射(ORM)框架,极大地简化了数据库操作,使得开发者可以更加专注于...

Global site tag (gtag.js) - Google Analytics