hibernate 谦老师
():对数据库的操作.就是对jdbc的封装.运行速度偏弱.
()
()hibernate叫做ORM映射框架,对实体类的对象(Object)的操作,直接映射(M)对应表.(r是关系模型)
()o-->Object(实体类对象). m-->Mapping 映射 r-->表
()hibernate就是面向对象的方式来操作数据库.
()
()因为使用hibernate操作的是po类的对象,底层调用jdbc,对于程序员来说,hibernate是完全面向对象,底层运行还是jdbc,简化程序员的工作.
()
()hibernate也叫持久层框架
()
()hibernate3.2文件
()doc:说明文档,api
()eg:案例,包含User.hbm.xml(映射文件:实体类跟数据库表关联的桥梁)
()etc:hibernate所有的配置文件.最重要的是hibernate.cfg.xml(hibernate核心配置文件,运行必要的文件),包括一些缓存文件:ehcache.xml
()lib:第三方jar.
()src:hibernate所有的源代码,开源的框架.
()hibernate3.jar:hibernate核心jar
()
()hibernate特点:
()简单
()开源
()orm框架,持久层框架
()可以兼容所有的主流数据库
()完全面向对象
()性能不是很好.
()
()步骤:
(1)导包
(2)复制两个配置文件:hibernate.cfg.xml(链接数据库),User.hbm.xml
(3)User.hbm.xml中配置 po类与table中的关联.
(4)hibernate.cfg.xml中mapping导入User.hbm.xml.
(5)
()
()hibernate核心
()hibernate.cfg.xml:
()链接数据库:Driver,url,用户名,密码
()dialect(方言):通过配置方言可以帮我们操作任何的数据库.对数据库的操作的语句会自动转化为对应数据的sql.
()hibernate自身的属性:
()show_sql:把hibernate底层执行jdbc的sql语句,打印控制台上,使用hibernate必须配置该属性.
()配置ORM映射文件:hibernate执行的时候,会读取hibernate.cfg.xml文件.只有把ORM映射文件配置到hibernate.cfg.xml,才能加载到hibernate当中.
()
()ORM映射文件:
()po类跟数据库中表之间映射的桥梁.
()<id name="id"> 主键的设置.
()<generator> 是主键的生成策略.
()
()常用方法:
()Configuration:
()读取配置文件:hibernate.cfg.xml(核心配置文件)
xxx.hbm.xml(映射文件)
()hibernate程序只要一启动,立刻就会调用configuration.
()SessionFactory:重量级对象(资源):大量侵占内存资源.功能强大.
()获取对象方法:sessionFactory.buildSessionFactory.
()创建Session(SessionFactory是产生Session的工厂)
()管理hibernate二级缓存.
()一个项目/数据库中对应一个SessionFactory.生命周期很长,跟整个系统的生命周期一致.
()线程安全.
()Session
()Hibernate当中最核心的功能类.hibernate堆数据库的操作都依赖与Session来实现的.
()通过Session:可以实现增删查改.
()session的生命周期较短.代表一个用户对数据库的一个链接.
()每次堆数据库的操作都要使用session,最好能把session跟当前访问的用户绑定在一起.
()sessionFactory.openSession();//每次都会创建一个新的session
()session.save(对象);//存储对象.
()
()hibernate是手动提交事物,如果要使用增删改,必须要开启事物,提交事物.
()Transaction:session.getTransaction
()在hibernate中管理事物
()hibernate的事物是手动提交的,必须要开启事物,并提交才可以改变表中的数据,jdbc是自动提交的.
()transaction.begin(),transaction.commit(),transaction.rollback().
()
()session的方法
()get和load的区别:
()查询不存在的数据时,load抛出的是异常(ObjectNotFoundException),get返回的是null;
()当调用get方法时立刻发送sql语句向数据库中查询数据.get方法不延迟加载.
()load方法支持延迟加载,当访问该对象的属性,才发出sql对数据库查询.是因为load方法返回的不是emp对象,它返回的是一个代理对象(代替要查询的对象);
()该代理对象来暂时代理emp对象.该代理对象是emp中的子类对象.(是hibernate内部自动生成的.)
()这是一种cglib代理:能提高hibernate性能,减少堆数据库的访问次数.它可以提供所有类的子类对象.
()延迟加载:需要才发出sql,去数据库中查询.
()hibernate底层怎么实现延迟加载的:
()
()session中的方法:
()update:要先从数据库中找到数据,然后通过set方法修改指定数据,然后执行session.update方法.
()session.merge(Object):目前比较常用的跟新数据的方法.
()delete:先使用load/get获取对象,然后直接使用session.delete()删除.或者定义一个新Emp,然后设置一个主键属性,然后session.delete()这个新类.
()get:session.get(class,id);//class是指定的类.class,id是主键.
()load:session.load(class,id)//通上
()save:session.save(emp);
()
()异常:TransactionObjectException----->是指有些数据还在瞬时状态,没有保存.
()
()第二天
()
(1)主键生成策略
1)依靠数据库底层生成组件id*****
()identity:适合MySql,SqlServer 每次插入数据就会自增一.
()sequence:适合Oracle DB2;
()native:智能选项,可以匹配后台任意的数据库,如果是MySql,SqlServer ,它就是identity.是Oracle DB2时,它就是sequence.
()如果是oracle,DB2的时候,一定要加序列:<param name="sequence">序列值(随便)</param>
2)依靠hibernate来生成组件id
()uuid:生成一个32位的不重复的随机字符串.一般是不会重复的.进行唯一标示的.
3)依靠程序员来维护组件id
()assigned:主键hibernate不维护的,需要用户自己手动维护的.
()
(2)hibernate中的数据类型
()boolean类型
()yes_no:把true存储到数据库时转换成y,false存储到数据库时转换成n
()true_false:把true存储到数据库时转换成T,false存储到数据库时转换成F
()日期(yyyy-MM-dd)
()date
()日期+时间(yyyy-MM-DD HH:mm:ss)
()timestamp:年月日时分秒.(数据库中是datetime)
()
(3)ORM的基本属性
()<property name="name" type="string" length="10" unique="true" column="t_name" not-null="true" lazy="false"></property>
()length是约束,不能超过10.
()unique是唯一约定.默认是false
()column是在数据库中的列名.
()lazy是指是否延迟加载.默认是false
()not-null是否可以为空. 默认是true
()
(4)hibernate中对象的三个状态
()hibernate:把数据库中的数据到对象之间转化.数据<<------->>对象
1)瞬时状态(transient);
()直接new出来的对象.
()数据库中没有与之匹配的数据(没有唯一标识)
()没有纳入session管理
()运行结束之后,就会垃圾回收拉.
2)持久状态(persistent)
()纳入session的管理
()在数据库中有与之匹配的数据(唯一标识)
()当清理缓存的时候(脏数据的检查) 与数据库的同步.在持久层的修改会直接影响到数据库中的数据.(commit之前通过set方法可以修改数据)
3)托管状态(detached) commit之后
()在数据库中有与之匹配的数据(唯一标识)
()没有纳入session管理,数据进入托管状态,
()此时修改数据时,不会根改数据库中的数据.
()
()企业开发的时候,一般都是用session.saveOrUpdate() 来替代save和update方法,因为save和update会先判断状态再执行操作.
()
(5)类与类之间关系 以及 表与表之间的关系.
1)类与类之间的关系
()o 对象 处理有关联关系的实体对象.
()关系属性:把关系的一方,作为一个自己的属性存储.从而表达出两个对象之间的关联关系.
()方向性:单行关系:只能从关系的一方找到另一方.
双向关系:关系的双方都能找到彼此.
()传递的持久性(级联操作):保存一方时会同时保存另一方.
2)表和表之间的关系
()o 数据库中的处理表和表之间的关联关系.
()外键:一张表的主键 是另外一个表的外键.从而保证两张表之间的关联关系.
()
()多对一:
()<many-to-one name="属性名" column=""></many-to-one>
()column是存储在数据库中的列名.
()在数据库中,虽然在'属性名'是对象,但是存在数据库中是 '属性名' 对应表的 主键值.
()在类中,可以直接获取 '属性名' 对应的对象.
()
()
()第三天
()
(1)一对多:
()"一"的一方可以看到"多"中所有的数据,应该在"一"的一方加上Set集合,只能使用util包提供的集合,不能使用hibernate提供的set集合,不然会报错.
()<set name="students">
<key column="cid"></key> //加入外键的名字,key的值是当前主键的值Classes的id, 'cid'加入到student对应的表中,作为外键.
<one-to-many class="Student"/>
</set>
()在数据库中,在"多"的一方默认加入一个外键.但是"多"对应的类没有该属性.
()
(2)多对一双向关联(映射)
()彼此都能看到对方.
()要注意:两个定义column定义的值一定要一样.
()
(3)级联操作(cascade)
()定义:一对多中,当set集合存储之后,而集合中的对象还处理瞬时状态,可以不用通过saveOrUpdate来保存,只要设置级联操作就可以了.(一般定义在一的一方,set的属性.)
(默认)none :不执行级联操作.只会删除关联关系.
()save-update :在保存或修改当前对象的时候,与之关联的对象也执行相应的操作.
()delete:当删除"一"的一端,会同时删除"多"的一端中对应的数据.
()all:包含所有情况下都进行级联操作.可以进行delete和save-update操作.但是在"一"中元素--集合中删除元素,默认情况下,只是删除与之关联关系,外键的值设置为null.
()all-delete-orphan:在"一"中元素--集合中删除元素时,会同时删除与之关联的关联表中的对象.
()
(4)inverse属性(set属性)
()是否放弃维护关联关系.一对多,多对多.
()false:本端维护关联关系.
()true:本端不维护关联关系.
()
(5)延迟加载(只在load方法中)
()只有在真正使用实例对象的时候,才会发送sql语句取数据库中真实的查询,真正俄使用指定调用了该实体对象的属性(get方法),其中getId和getClass不算.
()优点:避免无谓的性能开销,减少不必要堆数据库的优点.
()延�
评论0
最新资源