`
xiaozi7
  • 浏览: 854 次
  • 性别: Icon_minigender_1
  • 来自: 济南
文章分类
社区版块
存档分类
最新评论

Hibernate 笔记

阅读更多
第一讲
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)
      ⑹ ???
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics