hibernate前2天的简单总结

来源:互联网 发布:c标签和js函数 编辑:程序博客网 时间:2024/05/21 10:09
总结达到的效果:
hibernate框架的目的
简单整理出hibernate框架的主线;
hibernate的一些简单的操作
hibernate的设计思想

对象的状态------数据库的基本配置------------------------简单的增删查改--------------------------缓存----------------hibernate的核心类----------------------关系映射之一对多

-----------------------------------------------------------------状态-----------------------------------------------------------
hibernate框架出现实现的需求:
hibernate框架是一个纯的ORM框架,即Object Relation Mapping,对象与数据库表的映射,使用hibernate可以使我们不必写sql语句,直接通过javabean对象来操作数据库,由hibernate
为我们自动生成sql语句,hibernate的底层是jdbc


究竟我们是如何通过一个javabean来操作数据库的呢?

那么就要涉及到javabean对象在hibernate里面的三种状态了:
瞬时态:就是初始化一个javabean对象,但是不要给它的主键赋值,此时的对象无论怎么操作都不会影响到数据库里面的数据。
脱管状态;主键id有值,和其实和瞬时态差不多,只是在脱管态javabean 对象的id有值而已,它的操作同样 不会影响到数据库
持久态:处于持久态的javabean对象才会影响到数据库的操作,处于持久态的对象,只需调用其set方法,即改变自己的属性,且提交了事务,hibernate就会自己生成sql语句更新数据库里面的对应的数据

如何是一个javabean变成一个持久化对象呢?
一个javabean对象通过与session进行关联,就变成了一持久化的对象了,就说只要一个javabean对象参与了session的操作那么他就是一个持久化对象,什么时间他不在是一个持久化对象了呢,
当一个session关闭时,或者把主键值删除时,即就是由持久化状态变成其余2种状态时。

重点记住:一个对象只要在持久化的状态时的操作才会影响到数据库,反过来说:只要是持久化对象时我们才可以把一个javabean当做一个数据库的表来使用。
  --------------------------------------------------------- 三种状态的转换关系图------------------------------------------------------------------------

 
  --------------------------------------------------------------搭建环境----------------------------------------------------------------------------------
搭建一个hibernate的环境:

1.首先要引入相关的jar包,在hibernate的lib包里面有一个包叫做必须包,
hibernate要自己导入日志的包,所以有日志的配置文件,
配置文件:hibernate.cfg.xml和日志的配置文件,他们都是必须在classpath下,还有一个Javabean.hbm.xml:javabean的映射配置文件,这个文件需要配置在于javabean一个包下

hibernate.cfg.xml配置内容:配置数据库的连接,即使jdbc里面如何连接一个数据库的四个步骤,<mapping>主要的:在这里配置映射的javabean的xml文件。
还可以配置一些其它信息:如答应sql语句,自动建表,自动提交等

javabean.hbm.xml配置信息:在class标签里面配置javabean的对象名字和数据库的表的映射。
配置主键和配置javabean的属性与数据库字段的映射。
还可以配置一些关联;

注意:给配置属性映射时,如果配置type即,字段是什么类型,要注意大小写,要配置小写,如:string。这种配置方式是hibernate类型。

----------------------------------------------------------------end----------------------------------------------------------------------------------------


----------------------------------------------------------------------简单的增删查改-------------------------------------------------------------------------
通过hibernate来实现:增删改查操作

插入操作:插入一个对象;通过session的save方法,把一个javabean对象保存到数据库里面
删除操作:删除一条数据库的数据,通过主键删除:删除的对象要有id即主键的值,通过session.delete(object)就可以删除了。不要忘记我们的目标是删除数据库的数据,手段是通过对象
更新操作:更新操作有2种,通过主键来修改:1.给一个javabean设置主键值,2.这个主键值和我们要更新数据的主键值一致,3.然后设置要修改的属性的值,最后调用session.update(object)提交事务就修改了
                          二:使要删除的数据产生一个对应的持久化对象,通过这个对象的set方法,就可以直接修改数据库了。

                          
重点是查询:查询有3种方式:1.根据主键来查询,session.get(Object.class,主键值); session.load(Object.class,主键值);这样获取的对象都是持久太的。
                              2者的区别,使用get方式是直接就生成查询语句了,使用load方式是一个javabean的代理,没有生产查询语句,只要在访问数据时才会生成。
            通过createQuery(hql):hql语句是hibernate语句,语句的格式和sql语句相似,只是它的from后面跟的是类的名字,几种形式
                                   1.查询所有表中的对象,查询结果是对象,from User;返回值是一个Query,调用list()方法获取结果
                                   2.带有条件的查询 from User where name=? and age =: kkkk这种可以设置参数的查询:"?"的设置方式是:query.setParameter(0,"值"); "=:" :方式使用query.setParameter("kkkk","值")kkkk是=:后面那个值。name和age都是类的属性而不是数据库的字段
                                   2.1返回唯一的结果集,通过调用query.uniqueResult()就会返回一个javabean对象而不是一个list集合,而在2里面的操作就会返回一个list集合
                                   3.查询某些字段的值:select name,age from User;当查询的字段值超过2个时那么返回的结果集就需要使用list<Object[]>来保存了,而只是查询一个属性值就可以用一个List<object>
                                   
                    
            通过createSqlQuery(sql)这种方式就是以前的sql查询了,就违反了hibernate的orm原则了。

可变查询条件:实现可变查询条件的javabean要实现 Criteria接口

-----------------------------------------------------------------------END-------------------------------------------------------------------------------------

--------------------------------------------------------------------一级缓存-----------------------------------------------------------------------------------
持久化的对象:都会子啊缓存里面保存一个这个持久化的对象,用于再次访问时不需要通过数据库获取了,而是直接在缓存里面取,就可以了。
一般应用的场景:通过session的get或者load方式,获取了一个对象,那么这个对象的应用就被放到缓存里面了,在这个session没关闭的前提下,在get同一个对象时候就会子啊缓存里面取值而不是
在访问数据库了。
一个对象的在缓存里的声明周期是它对应的session的生命周期。

缓存的好处:当多次访问数据库的同一对象时,可以减少对数据库的访问,减轻数据库的压力。


缓存一个对象,同时有一个数据库的快照,当2者不一致时就会改变数据库的值。



------------------------------------------------------------------------——-----END---------------------------------------------------------------------------------------



-------------------------------------------------------------------------------------hibernate的核心类--------------------------------------------------------------------
 Configuration:这个类是用来加载配置文件的:
 SessionFactory相当于一个连接池,用来获取session的工厂
 Session对象:这是核心操作类,这个类用来和javabean对象进行关联;
 开启事务
 关闭事务
 --------------------------------------------------------------------------END-----------------------------------------------------------------------------------



  ----------------------------------------------------------------------关系映射---------------------------------------------------------------------------------                                                                   

 
  首先:要了解对象与对象之间的关系要先弄清数据库的表与表之间的关系:
 
  数据库的表与表之间的关系:一对一;一对多;多对多
 
  具体解析一对多:
 
  模型:客户与订单的关系:
 
  一个客户可以有多个订单,而一个订单只对应一个客户
 
  如何在客户表里面体现他的多个订单呢?要是在客户里面表示订单,不好表示,那么就把订单单个抽取成一个数据库的表,这个表有id号和一些订单的信息,
  那么如何表现订单表和客户表的关系呢?在订单表里面设置一个外键,这个外键的值是客户表的主键值,那么这样就把这2者关联起来了。只要是外键值相等的都是一个客户的订单。
 
 如何用javabean的方式表现出2者的关系:
 
 在客户类里面添加一个属性(是一个集合的属性,可以保存多个订单的值,list,set,Object[]),属性的类型是订单类型的
 在订单的对象里面添加一个客户的属性,类型是客户的类,用来保存是这个订单属于哪个对象。
 如何做关联映射:
 在Customer.hbm.xml的配置
 <set name="Customer里面的保存Order的集合对象的名字">
 <key column="orders表外键的名字"/>
 <one-to-many class="cn.itcast.one2many.Order"/>
 </set>
 
 在Order.hbm.xml的配置
 <many-to-one name="customer" class="cn.itcast.one2many.Order" column="customer_id">
 在没有配置cascade="save-update,delete"时,哪个类的对象映射管理其对应的表,大家互不干扰,当配置了cascade="save-update,delete"在配置的一段就会影响没有配置的一段。
 重点突出在插入时:只需操作一面就可以实现2面的徒步保存,对于其他的操作,由于大家是独立的,对于update操作不会有影响,而对于delete操删除客户时有2种情况:
 配置delete级联时,会连客下面的订单一起删除,而没有级联的会只是把订单的外键设置成null.
 
 
 客户表和订单表是2张独立的表,他们之间的关系,只是通过一个外键来联系的。
 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 






原创粉丝点击