《《hibernate培训》ppt课件》由会员分享,可在线阅读,更多相关《《hibernate培训》ppt课件(54页珍藏版)》请在金锄头文库上搜索。
1、对象/关系映射Hibernate,目录,一、持久化层O/R Mapping 二、Hibernate入门 三、Hibernate映射申明(Mapping declaration) 四、持久化对象的状态和生命周期 五、Hibernate查询 六、Hibernate最佳实践,一、持久化层O/R Mapping,基于B/S的典型三层架构,如何分层? 业务逻辑层和持久化层绝不要依赖于展现层。 使用假设法测试。 例子:1、一个显示课程考试分数的列表。现在要将不及格的分数用红色字体显示(低于60分)。 2、搜索。,如何进行对象关系数据库的匹配,public class User private String
2、 name; private String password; private List address; create table tbl_user ( name varchar(255) not null , password varchar(255), . primary key (name) component ) all-delete-orphan,如何进行对象关系数据库的匹配?,对象关系数据库的不匹配范式,粒度(granularity)的问题 子类型(subtypes)的问题 同一性(identity)的问题 与关联(associations)有关的问题 对象结构导航(naviga
3、tion)的问题 范式不匹配的代价 花费很多时间和精力来手工实现对象和关系的匹配。 甚至要扭曲对象模型直到它与下层的关系技术匹配为止。 JDBC API本身的问题。JDBC和SQL提供了一个面向语句(即命令)的方法从SQL数据库中来回移动数据。至少在三个时刻(Insert,Update,Select)必须指定一个结构化关系,这增加了设计和实现所需要的时间。,基于关系数据库的持久层可选方案,基于关系数据库的持久层可选方案,O/R Mapping -What? Why?,什么是O/R Mapping? 对象-关系映射是一门非常实用的工程技术,它实现了Java应用中的对象到关系数据库中的表的自动的(
4、和透明的)持久化,使用元数据(meta data)描述对象与数据库间的映射。,O/R Mapping的优点 提高生产率(Productivity) 可维护性(Maintainability) 更好性能(Performance) 厂商独立性(Vendor independence),二、Hibernate入门,Hibernate概述 Hibernate是非常优秀、成熟的O/R Mapping框架。它提供了强大的对象和关系数据库映射以及查询功能。 Hibernate优势 开源(LGPL) 成熟 流行(约13 000 downloads/month) 自定义API JBoss 将用Hibernate
5、3实现Entity Beans,Hibernate开发步骤,一、持久化类的设计 二、持久化类和关系数据库的映射 三、应用的开发,持久化Java类必须遵循的原则,为类的持久化类字段申明访问方法(get/set)。Hibernate对JavaBeans风格的属性实行持久化。 实现一个默认的构造方法(constructor)。这样的话Hibernate就可以使用Constructor.newInstance()来实例化它们。 如果是集合类型的属性,它的类型必须定义为集合的接口。例如:List、Set。 提供一个标识属性(identifier property)。如果没有该属性,一些功能不起作用,比如
6、:级联更新(Cascaded updates)Session.saveOrUpdate()。,持久化类和关系数据库的映射,XDoclet:它通过在Java源代码中加入特定的JavaDoc tag,从而为其添加特定的附加语义,之后通过XDoclet工具对代码中JavaDoc Tag进行分析,自动生成与代码对应的配置文件(http:/ XDoclet提供了对Hibernate的支持,这样我们可以直接由Java代码生成Hibernate映射文件。,Middlegen: 从数据库中已有 的表结构中生成Hibernate映射文 件。当前版本是2.1可以去http:/boss.bekk.no/boss/m
7、iddlegen下载。,Configuration,概述:Configuration 类负责管理Hibernate 的配置信息。它包括如下内容: Hibernate运行的底层信息:数据库的URL、用户名、密码、JDBC驱动类,数据库Dialect,数据库连接池等。 Hibernate映射文件(*.hbm.xml)。 Hibernate配置的两种方法: 属性文件(hibernate.properties)。 调用代码:Configuration cfg = new Configuration(); Xml文件(hibernate.cfg.xml)。 调用代码:Configuration cfg
8、= new Configuration().configure();,Configuration例子,数据库连接的配置 hibernate.dialect net.sf.hibernate.dialect.MySQLDialect hibernate.connection.driver_class com.mysql.jdbc.Driver hibernate.connection.url jdbc:mysql:/localhost/hibernate hibernate.connection.username root hibernate.connection.password 数据库连接池
9、的配置DBCP(App Server连接池首选) hibernate.connection.provider_class net.sf.hibernate.connection.DBCPConnectionProvider 配置DBCP连接池 其它 hibernate.show_sql true hibernate.jdbc.fetch_size 50 hibernate.jdbc.batch_size 25,SessionFactory,概述:应用程序从SessionFactory(会话工厂)里获得Session(会话)实例。它在多个应用线程间进行共享。通常情况下,整个应用只有唯一的一个会话
10、工厂例如在应用初始化时被创建。然而,如果你使用Hibernate访问多个数据库,你需要对每一个数据库使用一个会话工厂。 会话工厂缓存了生成的SQL语句和Hibernate在运行时使用的映射元数据。 调用代码: SessionFactory sessionFactory = cfg.buildSessionFactory();,Session(会话),概述: Session不是线程安全的,它代表与数据库之间的一次操作,它的概念介于Connection和Transaction之间。 Session也称为持久化管理器,因为它是与持久化有关的操作接口。 Session通过SessionFactory打
11、开,在所有的工作完成后,需要关闭。 它与Web层的HttpSession没有任何关系。 调用代码 Session session = sessionFactory.openSession();,Transaction(事务),概述: 它将应用代码从底层的事务实现中抽象出来这可能是一个JDBC事务,一个JTA用户事务或者甚至是一个公共对象请求代理结构(CORBA)允许应用通过一组一致的API控制事务边界。这有助于保持Hibernate应用在不同类型的执行环境或容器中的可移植性。 调用代码: Transaction tx = session.beginTransaction(); 注:使用Hibe
12、rnate进行操作时(增、删、改)必须显示的调用Transaction(默认:autoCommit=false)。,Query,概述: Query(查询)接口允许你在数据库上执行查询并控制查询如何执行。查询语句使用HQL或者本地数据库的SQL方言编写。 调用代码: Query query = session.createQuery(“from User”);,用户的例子,持久化类User.java public class User private Long id; private String name; private Date birthday; private String email
13、; public User() public User(String name,Date birthday,String email) .Get/Set ,映射文件User.hbm.xml ,应用UserTest.java,public void testCreate() throws Exception Configuration cfg = new Configuration(); cfg.addURL(UserTest.class.getResource(“/com/test/um/User.hbm.xml“); SessionFactory sessionFactory = cfg.b
14、uildSessionFactory(); Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); SimpleDateFormat format = new SimpleDateFormat(“yyyy-mm-dd“); User user = new User(“Jack“,format.parse(“1980-04-12“),“J“); session.save(user); mit(); assertNotNull(user.getId(); session
15、.clear(); User user_2 = (User)session.get(User.class,user.getId(); assertNotNull(user_2); session.close(); ,应用UserTest.java,保存用户:session.save(user); 修改用户:session.update(user); 保存或修改用户:session.saveOrUpdate(user); 删除用户:session.delete(user); 删除所有用户:session.delete(“from User ”); 查询用户名为“test”的用户: Query q
16、uery = session.createQuery(“from User where user.name = :name“); query.setParameter(“test“,user.getName(); User findUser = (User) query.list().get(0);,三、Hibernate映射申明(Mapping declaration),hibernate-mapping 一、类层次。class 1、主键。id 2、基本类型。property 3、自定义类。many-to-one | one-to-one 4、集合。set | list | map | array 4.1、one-to-many 4.2、many-to-many 5、子类。subclass | joined-subclass 6、其它。component | any等 二、查询语句。Query