1、程序设计实用技术程序设计实用技术 -Hibernate-Hibernate 目标:目标:n深入理解持久层框架深入理解持久层框架n掌握掌握HibernateHibernate配置方法、开发流程配置方法、开发流程n掌握掌握HiberateHiberate性能优化性能优化学习对象:具备一定具备一定JavaJava编程能力的初级程序员。编程能力的初级程序员。预备知识:n了解数据库的基本概念了解数据库的基本概念n熟悉常用熟悉常用SQLSQL语言,具备一定的语言,具备一定的JavaJava编编程能力程能力课程内容:n持久层和持久层和ORMORMnHibernateHibernate基础基础nHiberna
2、teHibernate性能优化性能优化程序设计实用技术程序设计实用技术JAVAJAVA方向方向 第一讲第一讲持久层和ORM章节目标:章节目标:理解持久层和理解持久层和ORMORM持久层概述:持久层概述:什么是什么是持久化持久化?什么是什么是持久层持久层?“持久化持久化”与与“持久层持久层”之间的之间的关系关系?持久层概述:持久层概述:什么是持久化?什么是持久化?将数据保存到物理的储存器(硬盘、磁带将数据保存到物理的储存器(硬盘、磁带等)上的过程叫持久化。等)上的过程叫持久化。什么是持久层?什么是持久层?专门负责处理与物理数据相关操作(持久化专门负责处理与物理数据相关操作(持久化数据,以供日后使
3、用)的独立层次。数据,以供日后使用)的独立层次。之间的关系?之间的关系?持久化是动词,表示将内存中的数据存储到持久化是动词,表示将内存中的数据存储到数据库或其他媒介。数据库或其他媒介。持久层是名词,实现数据持久化的一个相对持久层是名词,实现数据持久化的一个相对独立的领域(层)。独立的领域(层)。消费者消费者/前前端端仓库仓库/数据库系统数据库系统消费者消费者/前前端端仓库仓库/数据库系统数据库系统商场商场/业务类业务类消费者消费者/前前端端仓库仓库/数据库系统数据库系统超市超市/业务类业务类物流公司物流公司/持久层持久层现实模型与持久层现实模型与持久层?Application上层应用层上层应用
4、层Transaction Layer 事务层事务层Data Access Logic 数据访问逻辑数据访问逻辑Persistence Layer 持久层持久层Database 数据层数据层持久层逻辑边界?ViewControlModelModelJSPAction持久层持久层Database业务逻辑业务逻辑持久层在持久层在MVCMVC中:中:持久层解决了持久层解决了MVC什么问题?什么问题?当发生以下三种情况:当发生以下三种情况:(1 1)表示层发生变化)表示层发生变化(2 2)业务逻辑层发生变化)业务逻辑层发生变化(3 3)底层数据格式或持久化机制发生变化)底层数据格式或持久化机制发生变化数
5、据数据持久化代码持久化代码不需要重新编译不需要重新编译 为什么可以达到上述目标?是什么来的?为什么可以达到上述目标?是什么来的?解耦合解耦合持久层概述:持久层概述:什么是解耦合?什么是解耦合?采用某种方法将紧密耦合的关采用某种方法将紧密耦合的关系转换为松散耦合的关系的过程系转换为松散耦合的关系的过程 什么是耦合度?什么是耦合度?两个事物之间的耦合程度两个事物之间的耦合程度什么是耦合度适中?什么是耦合度适中?事物之间的耦合度符合实际情况事物之间的耦合度符合实际情况或要求或要求 紧耦合耦合适中太松耦合持久层概述:持久层概述:现实中还有哪些解耦合的实例?现实中还有哪些解耦合的实例?电脑电脑,各个组件
6、(显示器、,各个组件(显示器、CPUCPU、硬盘、内存)之间、硬盘、内存)之间相互独立,组合在一起又能一起工作,连接它们的是相互独立,组合在一起又能一起工作,连接它们的是共同实现的标准接口;(思考集成显卡、网卡?)共同实现的标准接口;(思考集成显卡、网卡?)电脑上的电脑上的USBUSB接口与原来的串口之间存在耦合度区别;接口与原来的串口之间存在耦合度区别;建筑中的砖混结构、框架结构;建筑中的砖混结构、框架结构;社会上各行各业的产生,也是一种解耦合的过程。发社会上各行各业的产生,也是一种解耦合的过程。发电厂的建立,使工厂不必为了开动机器去发电;电厂的建立,使工厂不必为了开动机器去发电;工程化也可
7、以说就是一个解耦合的过程工程化也可以说就是一个解耦合的过程。现实中的解耦合的实例:现实中的解耦合的实例:持久层概述:持久层概述:软件设计中解耦合的自然进化软件设计中解耦合的自然进化 实例:记录论坛用户登录次数实例:记录论坛用户登录次数public boolean addLoginCount(String id,int count)Connection conn=null;Statement stmt=null;try Class.forName(“oracle.jdbc.driver.OracleDriver”);conn=DriverManager.getConnection(“jdbc:o
8、rcle:thin:dbServer:1521:forum”,“MyUserName”,“MyPassword”);String sqlStr=“update BBSUser set loginCount=loginCount+1”+“where id=”+id+”;stmt=conn.createStatement();return stmt.execute(sqlStr);catch(ClassNotFoundException e)e.printStackTrace();public boolean addLoginCount(String id,int count)Connection
9、 conn=null;Statement stmt=null;try Class.forName(Config.getValue(“JDBC_DRIVER”);conn=DriverManager.getConnection(Config.getValue(“DB_URL”),Config.getValue(“DB_USER”),Config.getValue(“DB_PWD”);String sqlStr=“update BBSUser set loginCount=loginCount+1”+“where id=”+id+”;stmt=conn.createStatement();retu
10、rn stmt.execute(sqlStr);catch(ClassNotFoundException e)e.printStackTrace();实例:记录论坛用户登录次数实例:记录论坛用户登录次数从编写代码的角度看他们的优点:从编写代码的角度看他们的优点:()第一段代码很容易掌握,容易理()第一段代码很容易掌握,容易理解,直截了当,可以很好的执行。解,直截了当,可以很好的执行。()第二段代码要引入一个外部文件,()第二段代码要引入一个外部文件,用来保存数据库连接信息,不大容易实现,用来保存数据库连接信息,不大容易实现,但也比较好理解,也可以很好的执行。但也比较好理解,也可以很好的执行。从
11、耦合度的角度看,比较其优缺点?从耦合度的角度看,比较其优缺点?如数据库密码泄露,管理员要修改数据库如数据库密码泄露,管理员要修改数据库密码密码:第一段代码:第一段代码:()找到所有的与数据库连接相关的代码,修()找到所有的与数据库连接相关的代码,修改密码;改密码;()重新编译修改后的文件;()重新编译修改后的文件;()重新部署软件。()重新部署软件。第二段代码:第二段代码:()修改外部文件中配置的密码;()修改外部文件中配置的密码;()不需要重新编译;()不需要重新编译;()不需要重新部署软件。()不需要重新部署软件。进一步改进的方法?进一步改进的方法?Connection conn=DBHe
12、lper.getConnection();再进一步改进的方法?再进一步改进的方法??软件设计中解耦合的目标软件设计中解耦合的目标 为什么要解耦合?为什么要解耦合?从从MVCMVC理解软件设计中的解耦合理解软件设计中的解耦合软件系统解耦合的目标:软件系统解耦合的目标:数据访问数据访问操作系统操作系统数据库系统数据库系统应用系统应用系统应用逻辑应用逻辑应用程序层内部解耦合?应用程序层内部解耦合?业务逻辑与数据访问逻辑分离业务逻辑与数据访问逻辑分离应用程序与资源层解耦合?应用程序与资源层解耦合?应用层逻辑与底层数据库、操作系统结构分离应用层逻辑与底层数据库、操作系统结构分离程序设计实用技术程序设计实
13、用技术JAVAJAVA方向方向 第二讲第二讲DAO模式解耦合解耦合实例解耦合实例 :DAODAO模式模式 示例:银行转帐示例:银行转帐 现有现有账户账户A A账户账户B B转帐金额转帐金额amountamount由账户由账户A A转给账户转给账户B B。编写一个方法,实现转帐。编写一个方法,实现转帐。public boolean zhuanzhang(String user1,String user2,int amount)Connection conn=DBHelper.getConnection();/获得数据库连接获得数据库连接PrearedStatement stmt=conn.pre
14、pareStatement(“select*from user where username=?”);stmt.setString(1,user1);ResultSet user1_Set=stmt.executeQuery();if(user1_Set.next()/检查账户检查账户A余额是否够转帐,够则减掉要转帐的金额余额是否够转帐,够则减掉要转帐的金额if(user1_Set.getInt(“amount”)=amount)PrearedStatement stmt=conn.prepareStatement(“update user set amount=amount-“&amount
15、&”+“where username=?”);stmt.executeUpdate();elsereturn false;/余额不足余额不足elsereturn false;/找不到账户找不到账户A/将账户将账户B加上转帐金额加上转帐金额PrearedStatement stmt=conn.prepareStatement(“update user set amount=amount+”&amount&”where username=?”);stmt.setString(1,user2);stmt.executeUpdate();return true;示例:银行转帐示例:银行转帐 上例实现了
16、三个操作:上例实现了三个操作:()检查账户()检查账户A A的余额是否够转帐;的余额是否够转帐;()在账户()在账户A A中减掉要转帐的金额;中减掉要转帐的金额;()在账户()在账户B B中加上要转帐的金额。中加上要转帐的金额。最后最后DAODAO模式下的代码:模式下的代码:public boolean zhuanzhang(String user1,String user2,int amount)User userA=UserProxy.getUser(user1);/分离数据访问逻辑分离数据访问逻辑User userB=UserProxy.getUser(user2);return use
17、rA.accord(userB,amount);Factory模式模式Proxy模式模式DAODAO模式:模式:Data Accessor Object(数据访问对象数据访问对象DAO)Data 数据数据Data Accessor 数据访问器数据访问器Domain Object 领域对象领域对象(数据抽象数据抽象)DAO模式分解DAODAO模式解耦合的目标:模式解耦合的目标:Application 应用逻辑应用逻辑Data Accessor 数据访问抽象数据访问抽象Domain Object业务对象业务对象Database Accessor Abstract 数据访问接口数据访问接口Datab
18、ase Accessor Imp 数据访问实现数据访问实现DAO模式实现的层次模式实现的层次数据存储逻辑与业务逻辑分离数据存储逻辑与业务逻辑分离数据存储逻辑与数据底层实现数据存储逻辑与数据底层实现分离(资源层解耦合)分离(资源层解耦合)封装业务对象封装业务对象Database在在DAODAO模式中引入模式中引入FactoryFactory模式:模式:如何理解如何理解FactoryFactory工厂模式?工厂模式?根据给定的模具(根据给定的模具(类名称类名称),),从仓库里取出相应原料(从仓库里取出相应原料(类代码类代码),),加工成产品(加工成产品(类实现或对象类实现或对象)。)。Factor
19、yFactory模式:模式:FactoryFactory模式:模式:UserDAO userDAO=DAOFactory.getDAO(UserDAO.class);User userA=userDAO.getUser(User1);FactoryFactory在在DAODAO的作用?的作用?根据需要加载相应的实现,具体点说就是:根据需要加载相应的实现,具体点说就是:给定给定UserDAO.classUserDAO.class类名,产生类名,产生UserDAOUserDAO类实现。类实现。之前的实现之前的实现完成银行转帐:完成银行转帐:public boolean zhuanzhang(Str
20、ing user1,String user2,int amount)UserDAO userDAO=DAOFactory.getDAO(UserDAO.class);User userA=UserDAO.getUser(user1);User userB=UserDAO.getUser(user2);return userA.accord(userB,amount);最终版本最终版本现实生活中的现实生活中的ProxyProxy代理?代理?软件开发中的软件开发中的ProxyProxy代理?代理?在在DAODAO模式中引入模式中引入ProxyProxy模式模式 在在DAODAO模式中引入模式中引入
21、ProxyProxy模式模式 public class UserProxy public static User getUser(String userid)UserDAO userDAO=(UserDAO)DAOFactory.getDAO(UserDAO.class);return userDAO.getUser(userid);public static void sava(User user)UserDAO userDAO=(UserDAO)DAOFactory.getDAO(UserDAO.class);userDAO.save(user);最终版本最终版本为什么要引入为什么要引入P
22、roxy?、使得代码看起来更整洁、使得代码看起来更整洁、为附加其他功能留接口、为附加其他功能留接口、?、?为什么要引入为什么要引入Proxy?思考类比房屋建筑中的代理层?思考类比房屋建筑中的代理层?最终版本最终版本DAODAO模式总结:模式总结:ClientDAOFactoryUserDAOUserObjectUserProxyUserData/TableDBHelper应用层应用层数据访问层数据访问层数据层数据层对象对象/关系映射关系映射DAODAO模式总结:模式总结:对象对象描述描述Client业务逻辑,相对与数据库层来说是客户UserProxy执行代理,执行业务逻辑需要的针对数据库的操作
23、DAOFactoryDAO工厂,根据配置文件产生DAO对象类UserDAODAO对象,使用DBHelper连接数据库,加载数据/实例化DAODBHelper连接数据库帮助类,使用配置文件连接数据库UserObject数据封装类,具有属性和get/set方法,对表/关系数据进行封装UserDate/Table数据库表,表记录是UserObject的属性,实例化UserObjectDAODAO模式总结:模式总结:Client Object/Client Object/业务逻辑业务逻辑DAOProxyDAOProxy/代理代理DAOFactoryDAOFactory/DAO/DAO工厂工厂Imple
24、mentation/DAOImplementation/DAO实现实现DAOConfiguration调用服务方法获得服务实现接口获得DAO配置获得DAO/服务实现执行方法返回结果(1 1)interfaceinterface接口,在实现解耦合中的作用?接口,在实现解耦合中的作用?(2 2)Java ClassJava Class动态加栽?动态加栽?(3 3)XMLXML配置文件?配置文件?回顾与回顾与DAODAO相关的知识:相关的知识:提升持久层性能提升持久层性能软件系统中有哪些性能指标?软件系统中有哪些性能指标?提升持久层性能:提升持久层性能:数据库容量数据库容量执行某次业务的时间执行某次
25、业务的时间同时并发访问数同时并发访问数等等等等 软件系统中有哪些性能指标?软件系统中有哪些性能指标?系统性能低下有哪些原因?系统性能低下有哪些原因?提升持久层性能:提升持久层性能:硬件环境、网络环境差硬件环境、网络环境差软件配置环境低(操作系统、数据库软件配置环境低(操作系统、数据库系统)达不到系统使用要求系统)达不到系统使用要求设计本身存在缺陷设计本身存在缺陷系统性能低下有哪些原因?系统性能低下有哪些原因?设计本身存在缺陷,主要表现在:设计本身存在缺陷,主要表现在:、算法不科学合理、算法不科学合理、资源的管理和调配失当、资源的管理和调配失当哪一个是最主要因素?哪一个是最主要因素?提升持久层性
26、能:提升持久层性能:从前有一个钢铁工厂,有个车间,每个车间的从前有一个钢铁工厂,有个车间,每个车间的生产效率都很高(工人技能高、生产管理科学、设备生产效率都很高(工人技能高、生产管理科学、设备先进);先进);每个车间都设立有自己的原料采购车队,以保障生产每个车间都设立有自己的原料采购车队,以保障生产所需的原料。所需的原料。(存在的问题?如何解决?)(存在的问题?如何解决?)提升持久层性能:提升持久层性能:从前有一个从前有一个DAODAO模式的系统,有个子过程,每个模式的系统,有个子过程,每个子过程的执行效率都很高(代码非常简练,并经过代子过程的执行效率都很高(代码非常简练,并经过代码优化);码
27、优化);每个子过程都包含有自己的数据库连接,以保障有效每个子过程都包含有自己的数据库连接,以保障有效的数据存取。的数据存取。(存在的问题?如何解决?)(存在的问题?如何解决?)提升持久层性能:提升持久层性能:问题出现的前提:问题出现的前提:“大量大量”提升持久层性能:提升持久层性能:市场对钢铁的需求市场对钢铁的需求“大量大量”增增长长 用户同时登陆的数量用户同时登陆的数量“大量大量”增增长长 会出现什么大问题?会出现什么大问题?提升持久层性能:提升持久层性能:措施:措施:Connection Pool 数据库连接池数据库连接池请求获得连接请求获得连接数据库连接池数据库连接池判 断 是 否判 断
28、 是 否有有有有没有没有创建一个连接创建一个连接移除返回连接移除返回连接提升持久层性能:提升持久层性能:Connection Pool 数据库连接池数据库连接池请求返回连接请求返回连接数据库连接池数据库连接池判断是否满判断是否满满满不满不满加入到池中加入到池中关闭连接关闭连接提升持久层性能:提升持久层性能:数据库连接池技术带来的优势?数据库连接池技术带来的优势?(1 1)资源重用)资源重用(2 2)更快的响应速度)更快的响应速度(3 3)控制资源分配)控制资源分配(4 4)避免连接泄露)避免连接泄露提升持久层性能:提升持久层性能:措施:缓存措施:缓存 计算机领域的缓存有哪些?计算机领域的缓存有
29、哪些?缓存什么东西?为什么要缓存?缓存缓存什么东西?为什么要缓存?缓存到什么地方?到什么地方?软件系统中的缓存主要缓存什么?软件系统中的缓存主要缓存什么?提升持久层性能总结回顾:提升持久层性能总结回顾:、数据库连接池引入的原因?、数据库连接池引入的原因?提升系统性能。提升系统性能。、数据库连接池与持久层的关系?、数据库连接池与持久层的关系?持久层负责数据访问。持久层负责数据访问。数据库连接池负责统一管理和调数据库连接池负责统一管理和调度数据库连接。度数据库连接。有了数据库连接才能访问数据。有了数据库连接才能访问数据。提升持久层性能:提升持久层性能:理解持久层、理解持久层、DAODAO、数据库连
30、接池这些、数据库连接池这些概念的目的是什么?概念的目的是什么?是:是:对现有持久层来历和发展方向有深入的理解,为对现有持久层来历和发展方向有深入的理解,为应用开发打下理论基础。应用开发打下理论基础。不是:不是:使用这些理论知识实现软件项目中的持久层。使用这些理论知识实现软件项目中的持久层。因为:因为:不必为了吃面包,就要去种小麦。无论是商业领不必为了吃面包,就要去种小麦。无论是商业领域还是开源社区,都为我们提供了丰富的、久经域还是开源社区,都为我们提供了丰富的、久经考验的持久层组件,比如考验的持久层组件,比如HibernateHibernate。程序设计实用技术程序设计实用技术JAVAJAVA
31、方向方向 第三讲第三讲Hibernate基础开发回顾回顾现有持久层框架:现有持久层框架:HibernateHibernateApache OJBApache OJBCayenneCayenneJaxorJaxoriBatisiBatisjRelationFrameworkjRelationFrameworkmiragemirageSMYLESMYLETopLinkTopLink(oracleoracle,非,非开开源源产产品)品)HibernateHibernate是什么是什么:持久层框架?持久层框架?ORMORM映射理论?映射理论?提供强大、高性能的对象到关系型数据库持久化服务提供强大、高性
32、能的对象到关系型数据库持久化服务的框架产品(开源)的框架产品(开源)HibernateHibernate的起源的起源:HibernateHibernate的设计者:的设计者:Gavin KingGavin King20012001年末,正式发布第一个版本年末,正式发布第一个版本20032003年中,发布年中,发布Hibernate2Hibernate220032003年末,年末,HibernateHibernate被开源组织被开源组织JBossJBoss收纳收纳20052005年初,发布年初,发布Hibernate3Hibernate3为什么如此快速的成功为什么如此快速的成功:快速发布、即时响
33、应快速发布、即时响应全面的回归测试全面的回归测试避免过渡设计避免过渡设计集权集权文档文档避免标准化避免标准化5 5分钟内成功运行分钟内成功运行HibernateHibernate开发人员的责任感开发人员的责任感快速起步快速起步快速起步准备工作快速起步准备工作:下载:下载:HibernateHibernateHibernate-ExtensionHibernate-ExtensionMiddlegenMiddlegen-Hibernate-HibernateJUnitJUnitMysqlMysql准备开发工具:准备开发工具:EclipseEclipseMyEclipse4MyEclipse4准备
34、数据库环境:准备数据库环境:MysqlMysql/Oracle/OracleHibernateHibernate配置配置:HibernateHibernate日志日志:第一程序第一程序:代码解释代码解释:()初始化()初始化HibernateHibernate配置管理类:配置管理类:ConfigurationConfiguration。()通过()通过ConfigurationConfiguration类实例创建类实例创建SessionSession的工厂类:的工厂类:SessionFactorySessionFactory。()通过()通过SessionFactorySessionFacto
35、ry得到:得到:SessionSession。图释图释:Hibernatehibernate.hbm.xml SessionFactorySessionDatabaseConfiguration理解理解:HibernateHibernate完成了什么配置工作?完成了什么配置工作?如何完成的?如何完成的?HibernateHibernate在数据操作中起到了什么作用?在数据操作中起到了什么作用?如何做的?如何做的?基础语法基础语法 ConfigurationSessionFactorySessionhibernate.hbm.xmlhibernate.properties(myHibernate
36、.hbm.xml)Session.save(user)Session.close()User.hbm.xmlHIBERNATE基础语法基础语法:ConfigurationConfiguration类类 负责管理负责管理HibernateHibernate的配置信息的配置信息 Configuration config=new Configuration().configure();File file=new File(“D:oramyHibernate.hbm.xml”);Configuration config=new Configuration().configure(file);基础语法基
37、础语法:SessionFactory类类 负责创建负责创建SessionSession实例。实例。是线程安全的,可并发同时访问。是线程安全的,可并发同时访问。Configuration config=new Configuration().configure();SessionFactory factory=config.buildSessionFactory();基础语法基础语法:SessionFactory类类 SessionFactorySessionFactory实例是实例是ConfigurationConfiguration实实例例configconfig根据当前的配置信息构造的。根
38、据当前的配置信息构造的。多个数据库就有多个多个数据库就有多个configconfig实例,并构实例,并构造不同的造不同的SessionFactorySessionFactory。SessionFactorySessionFactory中保存着数据库配置的中保存着数据库配置的所有映射关系,也维护缓存等,消耗巨大,所有映射关系,也维护缓存等,消耗巨大,应重点考虑重用策略。应重点考虑重用策略。基础语法基础语法:Session类类 持久化操作的基础持久化操作的基础 Configuration config=new Configuration().configure();SessionFactory f
39、actory=config.buildSessionFactory();Session session=factory.openSession();基础语法基础语法:Hibernate SessionHibernate Session与与HttpSessionHttpSession的区别?的区别?基础语法基础语法:SessionSession数据持久化方法:数据持久化方法:SaveSaveGet/LoadGet/LoadflushflushDeleteDeleteQueryQuery、CriteriaCriteria基础配置基础配置 基础配置基础配置:HibernateHibernate基础配
40、置基础配置主要针对主要针对SessionFactorySessionFactory展开展开 HibernateHibernate内部配置内部配置与应用服务器(或容器)的相关配置与应用服务器(或容器)的相关配置基础配置基础配置:HibernateHibernate配置方法配置方法主要针对主要针对SessionFactorySessionFactory展开展开 使用配置文件使用配置文件(hibernate.hbm.xml/hibernate.propertiehibernate.hbm.xml/hibernate.properties s),在在HibernateHibernate启动时加栽配置属
41、性。启动时加栽配置属性。使用使用ConfigurationConfiguration类在程序中,指定类在程序中,指定配置属性。配置属性。基础配置基础配置:HibernateHibernate配置属性分类:配置属性分类:数据库连接数据库连接数据库连接池数据库连接池事务属性事务属性对象对象/关系映射文件关系映射文件其他属性其他属性Hibernate O/R Mapping Hibernate O/R Mapping?Hibernate O/R Mapper?基本数据类型映射基本数据类型映射:JavaJava数据类型数据类型数据库字段类型数据库字段类型O/RO/R映射定义映射定义HibernateH
42、ibernate类型转换类型转换基本实体映射基本实体映射:JavaJava对象与数据库表关系之间的映射:对象与数据库表关系之间的映射:类名类名表名表名主键映射主键映射字段字段属性属性基本数据类型映射基本数据类型映射:JavaJava对象对象/POJO/POJO数据库表关系数据库表关系O/RO/R映射定义映射定义HibernateHibernate数据交换数据交换基本实体映射基本实体映射:Id int (pk)Name varchar(20)sex varchar(4)group_id int (fk)学生表学生表Id int (pk)Code varchar(50)createTime tim
43、e学生证表学生证表private int id;private String name;private String sex;private int group;Card card;Studentprivate int id;private String code;private time createtimeStudent student;Card自定义数据类型自定义数据类型映射映射:HibernateHibernate自定义数据类型,接口:自定义数据类型,接口:UserTypeUserTypeCompositeUserTypeCompositeUserType将数据库中复杂的数据格式转换成
44、业务层将数据库中复杂的数据格式转换成业务层易于操作的类型对象易于操作的类型对象 复合主键复合主键映射映射:注意:注意:有驳于业务逻辑和数据逻辑分离的原则有驳于业务逻辑和数据逻辑分离的原则 复合主键类:复合主键类:基于实体类属性的复合主键基于实体类属性的复合主键基于主键类的复合主键基于主键类的复合主键需要实现:需要实现:SerializableSerializable接口及接口及equalsequals、hashCodehashCode方法方法BlobBlob、ClobClob字段映射:字段映射:不同的数据库对应的大对象类型不同不同的数据库对应的大对象类型不同 实体映射策略实体映射策略:Comp
45、onentComponent组件映射组件映射继承映射继承映射 ComponentComponent组件映射组件映射:id intfirstName vchar(20)lastName vchar(20)sex intage inthomeAdd vchar(100)officeAdd vchar(100)telZone vchar(4)telPhone vchar(11)telPerson vchar(4)NameName对象对象TelTel对象对象通过将复杂的表字段分类,实现面向对象的领域划分,使通过将复杂的表字段分类,实现面向对象的领域划分,使系统逻辑更加清晰。系统逻辑更加清晰。继承映射继
46、承映射:学生表学生表id姓名姓名性别性别年龄年龄班级班级老师表老师表id姓名姓名性别性别年龄年龄职务职务Person类类Student类类Teacher类类继承映射继承映射:用户表用户表id姓名姓名性别性别年龄年龄班级班级学生表学生表idPerson类类Student类类Teacher类类老师表老师表id职务职务继承映射继承映射:用户表用户表id姓名姓名性别性别年龄年龄班级班级用户类别用户类别Person类类Student类类Teacher类类职务职务级联关系级联关系 关系映射类别关系映射类别:一对一关联一对一关联/one-to-one/one-to-one一对多关联一对多关联/one-to-
47、many/one-to-many多对一关联多对一关联/many-to-one/many-to-one多对多关联多对多关联/many-to-many/many-to-manyORMORM(对象(对象/关系映射),不但包括对单独的数据库表和对象关系映射),不但包括对单独的数据库表和对象的映射,还包括对表之间的关联的影射。的映射,还包括对表之间的关联的影射。一对一关联一对一关联:主键关联主键关联 Id int (pk)Name varchar(20)sex varchar(4)group_id int (fk)学生表学生表Id int (pk)Code varchar(50)createTime t
48、ime学生证表学生证表private int id;private String name;private String sex;private int group;Card card;Studentprivate int id;private String code;private time createtimeStudent student;Card一对一关联一对一关联:外键关联外键关联 Id int (pk)Name varchar(20)sex varchar(4)group_id int (fk)学生表学生表Id int (pk)name varchar(50)组表组表private
49、 int id;private String name;private String sex;private Group group;Studentprivate int id;private String name;GroupStudent.hbm.xmlGroup.hbm.xml一对多关联一对多关联:Id int (pk)Name varchar(20)sex varchar(4)group_id int (fk)学生表学生表Id int (pk)address varchar(50)zipcode varchar(6)userid int地址表地址表private int id;priv
50、ate String name;private String sex;private Group group;private Set address;Studentprivate int id;private String address;private String zipcode;private int userid;private Student student;AddressStudent.hbm.xmlAddress.hbm.xml多对多关联多对多关联:Id int (pk)role varchar(20)角色表角色表Id int (pk)group varchar(20)组组(岗位