尚学堂hibernate学习笔记原版整理Word文件下载.docx
《尚学堂hibernate学习笔记原版整理Word文件下载.docx》由会员分享,可在线阅读,更多相关《尚学堂hibernate学习笔记原版整理Word文件下载.docx(41页珍藏版)》请在冰豆网上搜索。
12建立能力7
建立Annotation版本的HelloWorld7
1创建teacher表,createtableteacher(idintprimarykey,namevarhcar(20),titlevarchar(lO));
7
2创建Teacher类7
3在hibernatelib中加入annotation的jar包7
4参考Annotaion文档建立对应的注解7
5在hibernate.cfg.xml中建立映射<
mappingclass:
.../〉7
6参考文裆进行测试(注意文裆中缺少configure()的小bug)7
7FAQ:
@不给提示7
WhatisandWhy0/RMapping7
1JDBC操作数据库很繁琐7
2Sql语句编写并不是面向对象的7
3可以在对象和关系表之间建立关联来简化编程7
40/RMapping简化编程7
50/RMapping跨越数据库平台7
6Hibernate_0200_OR_Mapping_Simulation7
0/RMappingFrameworks7
1hibernate7
2toplink8
3jdo8
4JPA8
Hibernate基础配置8
1对应项目:
Hibernate_0300_BasicConfiguration8
2介绍MSQL的图形化客户端8
3hibernate.cfg.xml:
hbni2ddl.auto8
4搭建日志环境并配置显示DDL语句8
5搭建jUnit环境8
6hibernate.cfg.xml:
show_sql8
7hibernate.cfg.xml:
format_sql8
8表名和类名不同,对表名进行配置8
9字段名和属性相同8
10字段名和属性名不同8
11不需要psersistence的字段(不用列)8
12映射日期与时间类型,指定时间精度8
13映射枚举类型(比较少用)9
14字段映射的位置(field或者get方法)9
15@Lob9
16课外:
CLOBBLOB类型的数据存取9
17课外:
Hibernate自定义数据类型9
18hibernate类型9
ID生成策略9
hibernate_0400_ID9
2注意:
9
3xml生成id9
4注解方式:
@GeneratedValue9
5FAQ;
10
6联合主键10
核心幵发接口介绍12
1hibernate_0500_CoreAPI12
2HibernateAPI文档需要单独下载12
3Configuration12
4SessoinFactor12
5Session12
6SchemaExport(自动建表)13
7Query接口13
8Note:
13
三种对象状态14
1上一个project14
2三种状态的区分关键在于14
3三种状态:
14
4对这三种状态需要关注的问题是在该状态下如果进行数据库的操作会发生什么结果,比如改变属性的14
关系映射(重要)15
对象之间的关系15
1这里的关系映射指的是对象之间的关系,并不是指数据库的关系,本章解决的问题是当对象之间处于15
2简化问题:
15
3—对一15
4—对多15
5组件映射15
一对一关联16
1一对一单向外键关联16
2一对一双向外键关联16
3一对一单向主键关联(不重要)17
4一对一双向主键关联(不重要)17
5联合主键17
组件映射17
1项目:
hibernate_1100_component17
2对象关系:
一个对象是另外一个对象的一部分17
3数据库表:
一张表17
4annotation:
@Embeddable@Embbeded17
5xml:
使用<
component,例如:
18
多对一与一对多18
1多对一单向关联18
2一对多单向关联19
3一对多(多对一)双向关联19
多对多20
1单向关联:
20
2双向关联:
关联关系中的CRUD_Cascade_Fetch21
1hibernate_1700_one2many_many2one_bi_crud21
2设定cascade以设定在持久化时对于关联对象的操作(CUD,R归Fetch管)21
3cascade仅仅是帮我们省了编程的麻烦而已,不要把它的作用看的太大21
4铁律:
双向关系在程序中要设定双向关联21
5铁律:
双向mappedBy21
6fetch21
7Update时@ManyToOne()中的cascade参数关系22
8Delete时@ManyToOne()中的cascade关系22
9O/RMapping编程模型23
10要想删除或者更新先做load,除了精确知道ID之外23
11如果想消除关联关系,先设定关系为null.再删除对应记录,如果不删记录,该记录变成垃圾数据23
12练习:
多对多的CRUD23
关系映射总结24
1什么样的关系,设计什么样的表,进行什么样的映射24
2CRUD,按照自然的理解即可(动手测试)24
集合映射(不太重要)24
1项目名称:
hibernate_1800_Collections_Mapping24
2Set24
3List(与Set差不多多个@OrderBy)24
4Map24
继承映射(不太重要)24
1三种方式24
作业:
24
1学生课程、分数的设计(重要)24
2设计:
3树状结构的设计(至关重要)25
Hibernate查询(QueryLanguage)26
HQLvsEJBQL26
1NativeSQL>
HQL.>
EJBQL(JPQL1.0)>
QBC(QueryByCriteria)>
QBE(QueryByExample)"
26
2总结:
QL应该和导航关系结合,共同为査询提供服务。
性能优化26
1注意session.clear()的运用,尤其在不断分页循环的时候26
21+N问题(典型的面试题)(详见hibernate_2800_Hibernate_1+N项目)26
3list和iterate不同之处(//主要为了面试详见hibernate_2900_Hibernate_list_iterate)26
4一级缓存和二级缓存和査询缓存(面试题)(详见hibernate_3000_Hibernate_3KindsOf_Cache)26
5事务并发处理(面试的意义更大)27
课程内容
1HelloWorld
a)Xml
b)annotation
2Hibernate原理模拟-什么是O/RMapping以及为什么要有O/RMapping
3常见的0/R框架(了解)
4hibernate基础配置(重点)
5ID生成策略(重点AUTO)
6Hibernate核心开发接口介绍(重点)
7对象的三种状态(了解)
8关系映射(重点)
9Hibernate査询(HQL)
10在Struts基础上继续完善BBS200
11性能优化(重点)
12补充话题
风格
1先脉络,后细节
2先操作,后原理
3重Annotation,轻xml配置文件
a)JPA
b)hibernate–extension
资源
//www.hibernate.org
2hibernatezh_CN文档
3hibernateannotationreferences
环境准备
1下载hibernate-distribution-3.3.2.GA-dist
2下载hibernate-annotations-3[1].4.0.GA
3注意阅读hibernatecompatibilitymatrix(hibernate网站download)
4下载slf4jl.5.8
HibernateHelloWorld
1建立新java项目,名为hibernate_0100_HelloWorld
2学习建User-library-hibernate,并加入相应的jar包
a)项目右键-buildpath-configurebuildpath-addlibrary—
b)选择User-library,在其中新建libraray,命名为hibernate
c)在该library中加入hibernate所需jar包
i.hibernatecore
ii./required
iii.slf-nopjar
3引入mysql的JDBC驱动包
4在mysql中建立对应的数据库以及表
a)createdatabasehibernate;
b)usehibernate;
c)createtableStudent(idintprimarykey,namevarchar(20),ageint);
5建立hibernate配置文件hibernate.cfg.xml
a)从参考文档中copy
b)修改对应的数据库连接
c)注释掉暂时用不上的内容
6建立Student类
7建立Student映射文件Student.hbm.xml
a)参考文档
8将映射文件加入到hibernate.cfg.xml中
9写测试类Main,在Main中对Student对象进行直接的存储测试
a)参考文挡
a)要调用newConfiguration().configure().buildSessionFactory(),而不是
要省略configure,否则会出hibernatedialectmustbeset的异常
a)请务必建立自己动手査文挡的能力
b)重要的是:
i.要建立自己动手查一手文档的信心
ii.还有建立自己动手查一手文档的习惯!
iii.主动学习,砍弃被动接受灌输的习惯!
12建立能力
a)错误读完整
b)读—昔误的关键行
c)排除法
d)比较法
e)google
建立Annotation版本的HelloWorld
2创建Teacher类
3在hibernatelib中加入annotation的jar包
a)hibernateannotaionjar
b)ejb3persistencejar
c)hibernatecommon-annotations.jar
d)注意文裆中没有提到hibernate-common-annotations.jar文件
4参考Annotaion文档建立对应的注解
.../〉
6参考文裆进行测试(注意文裆中缺少configure()的小bug)
@不给提示
a)配置eclipse属性信息contentassist-activation--加上@
WhatisandWhy0/RMapping
1JDBC操作数据库很繁琐
2Sql语句编写并不是面向对象的
3可以在对象和关系表之间建立关联来简化编程
40/RMapping简化编程
50/RMapping跨越数据库平台
6Hibernate_0200_OR_Mapping_Simulation
0/RMappingFrameworks
1hibernate
2toplink
3jdo
4JPA
a)意愿统一天下
Hibernate基础配置
Hibernate_0300_BasicConfiguration
2介绍MSQL的图形化客户端
hbni2ddl.auto
a)先建表还是先建实体类
4搭建日志环境并配置显示DDL语句
a)slf4j与log4j的关系:
slf4j像是一个大管家,可以管理许多的日志框架,log4j是其中之一
b)加入slf4j-log4j.jar,加入log4j的jar包,去掉slf4-nop.jar
c)从hibernate/project/etc目录copylog4j.properties
d)査询hibernate文裆,日志部分,调整日志的输出策略
5搭建jUnit环境
a)需要注意jUnit的Bug
show_sql
format_sql
<
!
--格式化显示输出sql-->
propertyname="
format_sql"
>
true<
/property>
8表名和类名不同,对表名进行配置
a)Annotation:
@Table
b)xml:
自己査询
9字段名和属性相同
a)不用写@column与默认的@Basic效果一样
b)Xml中不用写column
10字段名和属性名不同
@Column
11不需要psersistence的字段(不用列)
a)Annotation:
@Transient
b)xml不写
12映射日期与时间类型,指定时间精度
@Temporal(参数)参数有3种只显示时间,只显示日期,时间日期都显示
//@Temporal(TemporalType.DATE)只显示日期
//@Temporal(TemporalType.TIME)只显示时间
//@Temporal(TemporalType.TIMESTAMP)显示日期与时间
指定type
<
classname="
Teacher"
table="
>
<
idname="
id"
column="
<
/id>
name"
type="
time"
/>
/class>
13映射枚举类型(比较少用)
a)@Enumerated
@Enumerated(EnumType.ORDINAL)枚举类型按位置数,如:
0,1,2...存储
@Enumerated(EnumType.STRING)枚举类型按设定值存储
麻烦
14字段映射的位置(field或者get方法)
a)bestpractice:
保持field(变量定义)和getset方法的一致
15@Lob
CLOBBLOB类型的数据存取
Hibernate自定义数据类型
18hibernate类型
ID生成策略
hibernate_0400_ID
a)我们观察hibernate生成表的结构并不是为了将来就用它生成,(可能还有自己的扩展,比如index等)而是为了明白我们应该建立什么样的表和实体类映射
3xml生成id
a)generator
<
generatorclass="
native"
/generator>
b)常用四个:
nativeidentitysequenceuuid
@GeneratedValue
a)自定义ID
b)AUTO(直接写@GeneratedValue相当如native)
i.默认:
对MySQL,使用auto_increment
ii.对Oracle使用hibernate_sequence(名称固定)
c)IDENTITY(@GeneratedValue(strategy=GenerationType.IDENTITY))
d)SEQUENCE(@GeneratedValue(strategy=GenerationType.SEQUENCE))
i.@SequenceGenerator(可自定义在数据库生成指定的sequence名)
@Id
//在@GeneratedValue中增加generator="
teacherSEQ"
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="
)
//"
为@SequenceGenerator的标识名
teacherSEQ_DB"
为指定到数据库生成的Sequence名
@SequenceGenerator(name="
sequenceName="
)
publicintgetId(){
returnid;
}
e)TABLE(可以忘记)
i.@TableGenerator
@TableGenerator(name="
teacherID"
table="
teacherID_DB"
pkColumnName="
key_value"
pkColumnValue="
pk_value"
valueColumnName="
teacher"
allocationSize=1)
注:
如果使用注解方式的uuid如下:
@Id
@GeneratedValue(generator="
teacherUUID"
@GenericGenerator(name="
strategy="
uuid"
a)用Junit测试时HibernateSessionFactory初始化异常不提示.疑似一个bug
b)用main来做测试
6联合主键
a)Xml方式:
composite-id
i.将联合主键的属性提取出来,重新编写一个pojo类(原pojo类中的id,name要删除并新加入属性“StudentPK”)
publicclassStudentPKimplementsSerializable{
privateStringid;
privateStringname;
……
ii.新建pojo类必须实现java.io.Serializable序列化接口
iii.新pojo类要重写equals和hashCode方法
@Override
publicbooleanequals(Objecto){
if(oinstanceofStudentPk){
StudentPkpk=(StudentPk)o;
if(this.id==pk.getId()&
&
this.name.equals(pk.getName())){
returntrue;
}
}
returnfalse;
publicinthashCode(){
returnthis.name.hashCode();
iv.联合主键生成策略XML配置方法
hibernate-mapping>
com.bjsxt.pojo.Student"
composite-idname="
studentPK"
class="
com.bjsxt.pojo.StudentPK"
key-propertyname="
/key-property>
/composite-id>
age"
sex"
pr