第一讲
1 hibernate是基于ORM 对象关系映射
2 vo与po的区别:
Vo是储存值;po是持久化对象,与数据库的每条记录联系,有主键
3 hibernate必须的jar包共10个,分别是:
核心jar包:
antlr-2.7.6.jar
commons-collections-3.1.jar
dom4j-1.6.1.jar
hibernate3.jar
javassist-3.9.0.GA.jar
jta-1.1.jar
slf4j-api-1.5.8.jar
数据库连接jar包:classes12.jar
日志包:slf4j-api-1.6.0.jar slf4j-nop-1.6.0.jar
4 流程
⑴配置hibernate主文件:.cfg.xml
Connection对应jdbc 相当于session对应hibernate
<property>中5个必须属性 + 1个显示 sql属性 = 6个属性
⑵测试session
⑶新建po
⑷建立po的xml关系文件:.hbm.xml
⑸主配置文件加入<mapping:resource=” ”>
⑹测试:增删改查 (例子 Student表)
第二讲
例子:Parent表 Child表
⑴单向一对多 one-to-many :set集合
⑵多对一 many-to-one :parent 对象
⑶lazy延迟加载
True:开启 。Child中包含parId, 查询Child表的时候不会把Parent表查出来。
False:关闭。Child中包含parId,查询Child表的时候就已经把Parent表查询出来了。
在开启状态下,如果查询的数据找不到,报异常:LazyInitializationException
⑷cascade=”all”级联
第三讲
例子:Parent2表 Child2表
⑴双向一对多one-to-many :set集合
<inverse=”true”>(false的一端负责维护主表与从表的关系)
⑵多对一 many-to-one :parent 对象
⑶IDE (必须写主键)
第四讲
1 sequence 自动生成主键
<param name="sequence">qibanseq</param>(qibanseq为序列的名称)
2 数据库连接池
在主配置文件中加入4个属性:
connection.provider_class hibernate.connection.datasource
hibernate.connection.pool_size hibernate.c3p0.min_size
3 多对多
例子:Student2表 Cource表 stu_cou中间表
⑴Student 配置文件
Set cources = new HashSet(); <set name=”cources” table=”stu_cou” cascade=”all”>
<key column=”STUID”></key>
<many-to-many class=”Cource” column=”COUID”/>
</set>
查询出一个学生学的课程。通过中间表中的STUID 可以找到COUID,通过COUID可以找到Cource表
⑵Cource 配置文件
Set students = new HashSet(); <set name=”students” table=”stu_cou” cascade=”all”>
<key column=”COUID”></key>
<many-to-many class=”Student” column=”STUID”/>
</set>
查询学习本课程的有哪些学生。通过中间表的COUID 可以找到STUID,通过STUID可以找到Student表
第五讲
1一对一(公用一个主键)
例子:Student3表 StudentDetail表
⑴Student:private StudentDetail studentDetail
配置文件:<one-to-one name=”studentdetail” class=”StudentDetail” lazy=”false”
cascade=”all” outer-join=”false” />
⑵StudentDetil: private int stuId; private Student student;
配置文件:<id>
<generator class=”foreign”>
<param name=”property”>student</param>
</generator>
<id/>
<one-to-one name=”student” class=”Student” lazy=”false”
cascade=”all” outer-join=”false”/>
outer-join=”true”:
outer-join=”false”:
2 get/load
区别:⑴使用get找不到值时,返回null;使用load找不到值时,报ObjectNotFoundException
⑵get返回类;laod返回代理类;
代理类:
例子:接口Iperson 实现类proson 和smallproson 代理类ProxyPerson 测试Test
⑶load方法可充分利用内部缓存及二级缓存的现有数据;get方法仅在二级缓存中查找,如没有发现数据,跳过二级缓存在sql中找数据。
3 自连接
例子:Emp表
Po 配置文件
Private Emp emp; <!-- 多对一 -->
<many-to-one name="emp"
class="Emp" column="MGR"/>
Private Set emps = new HashSet() <!-- 一对多 -->
<set name="emps">
<key column="MGR"></key>
<one-to-many class="Emp"/>
</set>
单向一对多 双向一对多 多对一
一对一 多对多
第六讲
1 cfg(configuration ) hbm (hibernate mapping) hql(hibernate query language) 等后缀名的缩写要知道全称(面试)
2 ⑴自由:和数据库没有联系
⑵持久化(瞬态):数据在往数据库中进行保存的那一瞬间状态。
⑶游离:数据已经保存在数据库中。
3 测试优先。
建立测试包:右击工程New – Source folder --test
4
5 熟练操作IDE自动生成
6 hibernate查询
⑴Query 分页查询
setFirstResult() setMaxResults() 从0开始取数据
setFetchSize():批量每次取数据
⑵属性查询
◇查询1列。查出的是集合。
◇查询多列。查出的是数组。
---------解决问题:查询1列,我们封装成对象---------
◇封装对象。Sql“new ”; 加构造器;
7截取字符串: toString().subString(0,9)
第七讲
一 object param 对象参数
1 object
⑴查询整张表
⑵查询一个属性 (2种写法)
⑶?:可以像使用preparedstatement一样去使用这个方法
方法: .setString();
2 param
⑴ 一个param 格式::param 方法:.setParameter("param","");
⑵ 两个param 格式::param1 and :param2 方法:.setParameter("param1",""); .setParameter("param2","");
3对象参数
⑴ 新建param类 set属性 .setProperties(param类)
⑵ Map .put属性 .setProperties(map)
二 外置sql
1查询整张表
⑴ 建立xml配置文件 <query > ⑵主配置文件配置映射信息
⑶ 用 . getNamedQuery("a") 找到外置的sql
⑷ 也可以把配置文件和类的配置文件写在一起
2查询一个属性 .setString(0,””)
三 原生SQL
1查询整张表 ⑴ .createSQLQuery(hql)
四 连接
1 like 例:"from Dept d where d.dname like '%S%'"
2整除 例:"from Dept d where mod(d.deptno,3)=0"
原生sql:
3 upper 小写变大写: 例:" select UPPER(d.dname) from Dept d "
lower 大写变小写 例:”select lower (d.danme)from Dept d”
4 distinct 取消重复行: 例:"select distinct d.loc from Dept d"
5 group by 分组: 例:"select d.loc from Dept d group by d.loc "
6 desc 降序 例:"select d.deptNo from Dept d order by d.deptNo desc"
7子查询 例:"select d.deptNo from Dept d where (select count(*) from d.emps )>4"
select d.deptno from dept d where (select count(*)from emp e where e.deptno =d.deptno)>4
8连接
⑴全连 例:”from Dept d join d.emps”
⑵左连接(返回数组) 例:from Dept d left outer join d.emps
⑶fetch (返回对象 ) 例:from Dept d left outer join fetch d.emps
9 过程
⑴ 数据库创建函数 传参数
⑵ 配置文件:<sql-query name="getsql" callable="true" >
1 调用数据库中的函数{? = call 数据库中的函数名(?)} 第一个?是返回一条记录
2 把一条记录封装成对象
⑶ 测试 1 .getNamedQuery("getsql") 根据名字找到sql
2 .setInteger()传参数
第八讲
一HQL
1 工程名单击右键—MyEclipse—Open HQL Editor (前提:自动生成IDE)
二延迟加载
1 实体默认的lazy为“true”; 集合set默认的lazy为“true”
属性默认的lazy为“false”
2 测试
⑴ 测试优先
⑵ 工程右键—new Source Folder—test
⑶ jar包:Add Library—JUnit—JUnit 4
⑷ 版本:1.5 注解:@Test 不执行该方法://@Test
⑸ 断点(调试Debug)
F6单步执行
返回对象 值不存在 延迟加载 查找数据
get 本类 null 不能开启 仅在二级缓存中查找,如没有发现数据,跳过二级缓存在sql中找数据
load 代理对象 ObjectNotFoundException 能开启(true)
1 利用内部缓存及二级缓存的现有数据
代理类:静态 动态(jdk:接口 cglib)
⑹ ???
1 hibernate是基于ORM 对象关系映射
2 vo与po的区别:
Vo是储存值;po是持久化对象,与数据库的每条记录联系,有主键
3 hibernate必须的jar包共10个,分别是:
核心jar包:
antlr-2.7.6.jar
commons-collections-3.1.jar
dom4j-1.6.1.jar
hibernate3.jar
javassist-3.9.0.GA.jar
jta-1.1.jar
slf4j-api-1.5.8.jar
数据库连接jar包:classes12.jar
日志包:slf4j-api-1.6.0.jar slf4j-nop-1.6.0.jar
4 流程
⑴配置hibernate主文件:.cfg.xml
Connection对应jdbc 相当于session对应hibernate
<property>中5个必须属性 + 1个显示 sql属性 = 6个属性
⑵测试session
⑶新建po
⑷建立po的xml关系文件:.hbm.xml
⑸主配置文件加入<mapping:resource=” ”>
⑹测试:增删改查 (例子 Student表)
第二讲
例子:Parent表 Child表
⑴单向一对多 one-to-many :set集合
⑵多对一 many-to-one :parent 对象
⑶lazy延迟加载
True:开启 。Child中包含parId, 查询Child表的时候不会把Parent表查出来。
False:关闭。Child中包含parId,查询Child表的时候就已经把Parent表查询出来了。
在开启状态下,如果查询的数据找不到,报异常:LazyInitializationException
⑷cascade=”all”级联
第三讲
例子:Parent2表 Child2表
⑴双向一对多one-to-many :set集合
<inverse=”true”>(false的一端负责维护主表与从表的关系)
⑵多对一 many-to-one :parent 对象
⑶IDE (必须写主键)
第四讲
1 sequence 自动生成主键
<param name="sequence">qibanseq</param>(qibanseq为序列的名称)
2 数据库连接池
在主配置文件中加入4个属性:
connection.provider_class hibernate.connection.datasource
hibernate.connection.pool_size hibernate.c3p0.min_size
3 多对多
例子:Student2表 Cource表 stu_cou中间表
⑴Student 配置文件
Set cources = new HashSet(); <set name=”cources” table=”stu_cou” cascade=”all”>
<key column=”STUID”></key>
<many-to-many class=”Cource” column=”COUID”/>
</set>
查询出一个学生学的课程。通过中间表中的STUID 可以找到COUID,通过COUID可以找到Cource表
⑵Cource 配置文件
Set students = new HashSet(); <set name=”students” table=”stu_cou” cascade=”all”>
<key column=”COUID”></key>
<many-to-many class=”Student” column=”STUID”/>
</set>
查询学习本课程的有哪些学生。通过中间表的COUID 可以找到STUID,通过STUID可以找到Student表
第五讲
1一对一(公用一个主键)
例子:Student3表 StudentDetail表
⑴Student:private StudentDetail studentDetail
配置文件:<one-to-one name=”studentdetail” class=”StudentDetail” lazy=”false”
cascade=”all” outer-join=”false” />
⑵StudentDetil: private int stuId; private Student student;
配置文件:<id>
<generator class=”foreign”>
<param name=”property”>student</param>
</generator>
<id/>
<one-to-one name=”student” class=”Student” lazy=”false”
cascade=”all” outer-join=”false”/>
outer-join=”true”:
outer-join=”false”:
2 get/load
区别:⑴使用get找不到值时,返回null;使用load找不到值时,报ObjectNotFoundException
⑵get返回类;laod返回代理类;
代理类:
例子:接口Iperson 实现类proson 和smallproson 代理类ProxyPerson 测试Test
⑶load方法可充分利用内部缓存及二级缓存的现有数据;get方法仅在二级缓存中查找,如没有发现数据,跳过二级缓存在sql中找数据。
3 自连接
例子:Emp表
Po 配置文件
Private Emp emp; <!-- 多对一 -->
<many-to-one name="emp"
class="Emp" column="MGR"/>
Private Set emps = new HashSet() <!-- 一对多 -->
<set name="emps">
<key column="MGR"></key>
<one-to-many class="Emp"/>
</set>
单向一对多 双向一对多 多对一
一对一 多对多
第六讲
1 cfg(configuration ) hbm (hibernate mapping) hql(hibernate query language) 等后缀名的缩写要知道全称(面试)
2 ⑴自由:和数据库没有联系
⑵持久化(瞬态):数据在往数据库中进行保存的那一瞬间状态。
⑶游离:数据已经保存在数据库中。
3 测试优先。
建立测试包:右击工程New – Source folder --test
4
5 熟练操作IDE自动生成
6 hibernate查询
⑴Query 分页查询
setFirstResult() setMaxResults() 从0开始取数据
setFetchSize():批量每次取数据
⑵属性查询
◇查询1列。查出的是集合。
◇查询多列。查出的是数组。
---------解决问题:查询1列,我们封装成对象---------
◇封装对象。Sql“new ”; 加构造器;
7截取字符串: toString().subString(0,9)
第七讲
一 object param 对象参数
1 object
⑴查询整张表
⑵查询一个属性 (2种写法)
⑶?:可以像使用preparedstatement一样去使用这个方法
方法: .setString();
2 param
⑴ 一个param 格式::param 方法:.setParameter("param","");
⑵ 两个param 格式::param1 and :param2 方法:.setParameter("param1",""); .setParameter("param2","");
3对象参数
⑴ 新建param类 set属性 .setProperties(param类)
⑵ Map .put属性 .setProperties(map)
二 外置sql
1查询整张表
⑴ 建立xml配置文件 <query > ⑵主配置文件配置映射信息
⑶ 用 . getNamedQuery("a") 找到外置的sql
⑷ 也可以把配置文件和类的配置文件写在一起
2查询一个属性 .setString(0,””)
三 原生SQL
1查询整张表 ⑴ .createSQLQuery(hql)
四 连接
1 like 例:"from Dept d where d.dname like '%S%'"
2整除 例:"from Dept d where mod(d.deptno,3)=0"
原生sql:
3 upper 小写变大写: 例:" select UPPER(d.dname) from Dept d "
lower 大写变小写 例:”select lower (d.danme)from Dept d”
4 distinct 取消重复行: 例:"select distinct d.loc from Dept d"
5 group by 分组: 例:"select d.loc from Dept d group by d.loc "
6 desc 降序 例:"select d.deptNo from Dept d order by d.deptNo desc"
7子查询 例:"select d.deptNo from Dept d where (select count(*) from d.emps )>4"
select d.deptno from dept d where (select count(*)from emp e where e.deptno =d.deptno)>4
8连接
⑴全连 例:”from Dept d join d.emps”
⑵左连接(返回数组) 例:from Dept d left outer join d.emps
⑶fetch (返回对象 ) 例:from Dept d left outer join fetch d.emps
9 过程
⑴ 数据库创建函数 传参数
⑵ 配置文件:<sql-query name="getsql" callable="true" >
1 调用数据库中的函数{? = call 数据库中的函数名(?)} 第一个?是返回一条记录
2 把一条记录封装成对象
⑶ 测试 1 .getNamedQuery("getsql") 根据名字找到sql
2 .setInteger()传参数
第八讲
一HQL
1 工程名单击右键—MyEclipse—Open HQL Editor (前提:自动生成IDE)
二延迟加载
1 实体默认的lazy为“true”; 集合set默认的lazy为“true”
属性默认的lazy为“false”
2 测试
⑴ 测试优先
⑵ 工程右键—new Source Folder—test
⑶ jar包:Add Library—JUnit—JUnit 4
⑷ 版本:1.5 注解:@Test 不执行该方法://@Test
⑸ 断点(调试Debug)
F6单步执行
返回对象 值不存在 延迟加载 查找数据
get 本类 null 不能开启 仅在二级缓存中查找,如没有发现数据,跳过二级缓存在sql中找数据
load 代理对象 ObjectNotFoundException 能开启(true)
1 利用内部缓存及二级缓存的现有数据
代理类:静态 动态(jdk:接口 cglib)
⑹ ???