1、hibernate 运用的总结Hibernate 的准备:Hibernate 官网主页:下载 Hibernate 需要的包推荐下载 hibernate-distribution-3.3.2.GA-dist.zipHibernate 简介:一个开发源代码的对象关系映射框架对 JDBC 进行了非常轻量级的对象封装将 JavaBean 对象和数据库的表建立对应关系Hibernate 的优势:Hibernate 是一个优秀的 java 持久化层的解决方案。持久化的含义:JDBC 就是一种持久化机制将程序数据直接保存成文本文件也是持久化机制的一种实现在分层结构中,DAO 层(数据访问层)也被称为持久化层
2、Hibernate 简化了繁琐的编码Hibernate 将数据库的连接信息都存放在配置文件中Hibernate 包目录结构:部署 jar 包:hibernate3.jarrequired 目录下的 jar 包Oracle 数据库驱动 jar 包使用 Hibernate 操作数据库需要七个步骤:、 读取并解析配置文件Configuration conf = newConfiguration().configure();、 读取并解析映射信息,创建 SessionFactorySessionFactory sf = conf.buildSessionFactory();、 打开 SessionSe
3、ssion session = sf.openSession();、 开始一个事务(增删改操作必须,查询操作可选)Transaction tx = session.beginTransaction();、 数据库操作session.save(user);/或其它操作、 提交事务(回滚事务)mit();(tx.rollback();)、 关闭 sessionsession.close();注意:如果 Hibernate 配置文件中,current_session_context_class 参数设置为thread 并采用 SessionFactory 的 getCurrentSession()方
4、法获的 Session 实例则不需要此步Hibernate 的配置:用于配置数据库连接运行时所需的各种属性默认文件名为“hibernate.cfg.xml”例如:org.hibernate.dialect.Oracle9Dialectjdbc:oracle:thin:10.0.0.188:1521:ORCLjbitbdqntrue oracle.jdbc.driver.OracleDriver实体类的配置文件:hibernate-mappingSEQ_IDproperty 元素常用属性name 表示实体类属性的名字type 表示实体类属性的类型column 表示数据库字段的名字column 元
5、素常用的属性name 表示字段的名字length 表示字段的长度not-null 舍得是否可以为 nullHibernate 中实体对象的三种状态瞬时状态(Transient)刚用 new 语句创建,还没有被持久化,且不处于 Session 的缓存中持久状态(Persistent)已经被持久化,且加入到 Session 的缓存中游离状态(Detached)已经被持久化,但不再处于 Session 的缓存中对数据的操作:对数据执行增,删,改 的时候必须要在事务中执行,在执行事务之前,要开启事务,在事务执行之后要提交或者回滚事务。否则此操作没有任何的效果。同时:在对数据进行修改的时候,要先查出数据
6、,然后对要修改的字段进行重新赋值。最后要提交事务。实体间的关系:关联关系:例如,用户可以发布多条信息,这就表明用户和信息之间存在关联关系泛华关系: 例如,老虎是动物,就表示老虎和动物之间存在这泛化关系实体间的关联关系:关联是指不同表之间的数据彼此联系的方法。数据库表与表之间的关联关系,以外间的形式体现注意:数据关联关系是 ORM 的一个重要特征,但往往也是导致系统性能低下的原因。不良的关联设计会对系统的性能表现产生致命的影响,在十几开发中我们要需要特别注意着一点。单向一对多关联例如:街道对区 配置文件:注意:在多的一方(区中)定义一个街道的集合,对应数据库中的字段就是一的一方的主键public
7、 class District implements java.io.Serializable private int id;private String name;private Set street= new HashSet();public Set getStreet() return street;public void setStreet(Set street) this.street = street;/* default constructor */public District() /* full constructor */public District(int id, St
8、ring name) this.id = id;this.name = name;/ Property accessorspublic int getId() return this.id;public void setId(int id) this.id = id;public String getName() return this.name;public void setName(String name) this.name = name;单向多对一:例如:街道对区 创建的实体类和配置文件public class Street implements java.io.Serializabl
9、e private int id;private String name;private District district;public District getDistrict() return district;public void setDistrict(District district) this.district = district;public Street() public Street(int id) this.id = id;public int getId() return this.id;public void setId(int id) this.id = id
10、;public String getName() return this.name;public void setName(String name) this.name = name;注意:在多对一的时候,在多的一方的实体类中,创建一的一方的一个属性,类型为多的一方的类型多对多:在多对多的关系中,在数据库中,有一个关系表,但是这个关系表在实体类中没有对应的实体类,在实体类中,每个实体类中都有一个与其关联的实体类的类型的一个集合,而这个集合在数据库中对应的字段是中间关系表中的字段例如学生和科目:Cascade 的用法:Cascade 是一个级联操作的设置关键Cascade 的常用属性值属性 含义
11、和作用all 对所有的操作都进行级联操作save-update 执行保存和更新操作时进行级联操作delete 执行删除操作的时候进行级联操作none 对所有的操作都不级联注意:由于 cascade 级联操作,对数据进行操作的时候,会影响于其有关系的数据,所有在使用 cascade 的时候谨慎使用inverse: 指定关联关系中的方向学生类的配置文件:科目类中的配置文件:在关联关系中,inverse=true 时,就说明关系有对方来维护。Inverse=false 的为主动方,关系有主动方来维护注意:在开发过程中,为了提高程序执行速度和性能,一般关系都是交给多的一方来维护。HQL 查询:使用 H
12、QL 查询需要四步:(1) 得到 session(2) 编写 HQL 语句(3) 创建 Query 对象(4) 执行查询,得到结果使用 HQL 查询的好处不需要编写复杂的 sql 语句,是针对实体类及其属性的查询。查询的结果是直接存放在 list 中的对象,不需要再次封装,而且 HQL 还独立于数据库,对不同的数据库更具 Hibernate dialect 属性的配置,自动生成不同的 sql 语句执行占位符“?“:和 sql 中的占位符的用法差不多,不过着里的赋值为 Query 的对象.setXX(位置,值 );注意,这的位置是从 0 开始的,与 jdbc 中有小小的差异分页操作:在执行完 q
13、uery 操作以后,由 query 的对象调用系统自带的方法setFirstResult(起始位置)这是设置分页中的起始位置,接着用 query 对象调用setMaxResuly(每页显示的行数). 然后由 query 对象调用 list()的方法,保存在一个集合中。HQL 查询性能的优化、 避免使用 or,如果 where 子句中的条件包含了 or 的话,在一定的情况下,可以使用 in 来替代、 避免使用 not ,在使用 not 的地方,条件允许的情况下可以采取取反的操作、 避免 like 的特殊形式、 避免 having 子句,在分组查询中,有两个地方可能出现条件,一个是 where 子
14、句中,另一个就是 having 子句中,一般尽可能的在where 子句中出现筛选条件,而不是在 having 中出现条件、 避免使用 distinct,在不要求去掉重复的数据的时候,尽量不使用数据的加载方式:(lazy)即时加载:lazy=false,在执行查询的时候,不管使不使用查询的结果,都将执行查询延迟加载:lazy=true,在执行 query 查询的时候,当不使用查询的结果的时候,是不会执行查询的,只是系统给一个查询代理。注意:延迟加载和即时加载,只是对 get 的查询方式起作用。对实体类实行延迟加载的时候,在的标签中设置 lazy当对实体类中的属性设置,直接在配置文件中字段的那一项
15、设置 lazy当懒加载时,使用懒加载加载的对象的时候,需要在 session 关闭之前查找的结果初始化,不然在 session 关闭后使用 query 的查询结果的时候结果为空的。List() 方法和 iterate()的区别List()总是一次性的从数据库中直接查询所有符合条件的数据,然后写入缓存,每执行一次查找操作的时候,都将对数据库执行一次查找操作。Iterate()是 第一次从数据库中查找数据的时候,执行 n+1 次 sql 语句然后存入缓存,在第二次查询的时候首先根据 id 在缓存中查找符合条件的数据,若缓存中没有的话,再去数据库中查找。HQL 连接查询:连接类型 HQL 语法 适用
16、范围内连接 Inner join 或 join迫切内连接 Innet join fetch 或 join fecth左外连接 left outer join 或 left join迫切左外连接 left outer join fetch 或 left join fetch右外连接 Right outer join 或 right join 适用于有关联关系的持久类,并且在映射文件中对这种关联关系中做了映射在查询的时候是以左表为主的命名查询:将 sql 代码保存在配置文件中,语法注意: 标签是和标签是同级的,执行 sql 的时候要使用Query 的接口,然后要用 query 对象.setProp
17、erties(实体类对象),添加绑定实体类的对象本地 sql 查询在配置文件中的语法:标签和 标签也是同级的,但是执行本地 sql 的时候使用的不是 Query 接口了,而是 SQLQuery 接口。然后使用 SQLQuery对象的 addEntity(“”,类名.class) ,将别名和实体类绑定在一起。使用 criteria 查询:使用 criteria 的时首先要创建 criteria 对象(与创建 Query 对象的方法相似),但是要传入的参数是实体类在使用 criteria 查询的时候如果需要添加查询的限制条件的时候,直接调用 add的方法,在 add 中添加 restrictions 的各种方法。