Hibernate知识整理

上传人:熏** 文档编号:139496874 上传时间:2022-08-22 格式:DOC 页数:17 大小:563KB
收藏 版权申诉 举报 下载
Hibernate知识整理_第1页
第1页 / 共17页
Hibernate知识整理_第2页
第2页 / 共17页
Hibernate知识整理_第3页
第3页 / 共17页
资源描述:

《Hibernate知识整理》由会员分享,可在线阅读,更多相关《Hibernate知识整理(17页珍藏版)》请在装配图网上搜索。

1、Hibernate知识整理Hibernate基础-1-hibernate是什么-2hibernate工作原理是什么-3- Hibernate核心类-4-Hibernate与JDBC的比较-5- Hibernate与iBATIS的比较-6持久化ORM入门基础- 1-ORM简介-2-ORM的概念-3-ORM的优缺点-4-目前流行的 ORM 产品 -LOG4J的配置- 3- Log4j在项目中使用过程-2- Log4j基本使用方法 -1- 什么是log4j-HQL基本语法入门- 1.实体查询-2.属性查询-5.参数邦定-3.实体的更新与删除-4.分组与排序-6.联合查询-Hibernate手动配制-

2、 一、 Hibernate基础1-hibernate是什么 Hibernate是一个ORM(对象/关系映射)框架,目标是将java中的对象与对象之间的关系,对应到关系型数据库中的表格与表格之间的关系 。也可以将关系型数据库中的表格与表格之间的关系对应到java中的对象与对象之间的关系。通过这种对应关系,可以用面向对象的程序撰写方法写程序,而不用特定的转换SQL,所有SQL的转换交由Hibernate进行处理。 2hibernate工作原理是什么Hibernate通过对jdbc进行封装,对java类和关系数据库进行mapping,实现了对关系数据库的面向对象方式的操作,改变了传统的jdbc +

3、sql操作数据的方式,从而使开发人员可以话更多精力进行对象方面的开发,优点并不只是简化了数据库操作,更有价值的事对不同的数据库提供了统一操作的接口,使得Hibernate几乎支持所有的数据库开发,进而可使应用程序的跨数据库开发成为可能。3- Hibernate核心类 1)Configuration类 配置启动Hibernate 将config.xml配置文件提供的配置信息获取数据源等信息 加载Configraction对象 创建SessionFactory对象2)SessionFactory初始化Hibernate 所以由hiberante提供程序与数据之间的会话 就是SessonFactor

4、y创建会话session) 3)创建Session后可对对象进行基于关系型数据的增删查改操作。 4)封装事务控制 由Hibernate使用JDBC Hiberante提供Transcation类 管理事务 Transcation 开始一个事务 提交一个事务 5)Hibernate 提供 HQL语言 Query 和Criteria 工具 根据我们提供的HQL描述转换为SQL 语句的描述 将结果返回完成数据库的操作动作4-Hibernate与JDBC的比较相同点: 两者都是JAVA的数据库操作中间件。 两者对于数据库进行直接操作的对象都不是线程安全的,都需要及时关闭。 两者都可以对数据库的更新操作

5、进行显式的事务处理。不同点: 使用的SQL语言不同:JDBC使用的是基于关系型数据库的标准SQL语言,Hibernate 使用的是HQL(Hibernate query language)语言 操作的对象不同:JDBC操作的是数据,将数据通过SQL语句直接传送到数据库中执行,Hibernate操作的是持久化对象,由底层持久化对象的数据更新到数据库中。 数据状态不同:JDBC操作的数据是“瞬时”的,变量的值无法与数据库中的值保持一致,而Hibernate操作的数据是可持久的,即持久化对象的数据属性的值是可以跟数据库中的值保持一致的。5- Hibernate与iBATIS的比较区别1:Hibern

6、ate 是当前最流行的O/R mapping框架,当前版本是3.05。它出身于,现在已经成为Jboss的一部分了。iBATIS 是另外一种优秀的O/R mapping框架,当前版本是2.0。目前属于apache的一个子项目了。相对Hibernate“O/R”而言,iBATIS 是一种“Sql Mapping”的ORM实现。区别2:Hibernate对数据库结构提供了较为完整的封装,Hibernate的O/R Mapping实现了POJO 和数据库表之间的映射,以及SQL 的自动生成和执行。程序员往往只需定义好了POJO 到数据库表的映射关系,即可通过Hibernate 提供的方法完成持久层操作

7、。程序员甚至不需要对SQL 的熟练掌握, Hibernate/OJB 会根据制定的存储逻辑,自动生成对应的SQL 并调用JDBC 接口加以执行。 而iBATIS 的着力点,则在于POJO 与SQL之间的映射关系。也就是说,iBATIS并不会为程序员在运行期自动生成SQL 执行。具体的SQL 需要程序员编写,然后通过映射配置文件,将SQL所需的参数,以及返回的结果字段映射到指定POJO。使用iBATIS 提供的ORM机制,对业务逻辑实现人员而言,面对的是纯粹的Java对象, 这一层与通过Hibernate 实现ORM 而言基本一致,而对于具体的数据操作,Hibernate会自动生成SQL 语句,

8、而iBATIS 则要求开发者编写具体的SQL 语句。相对Hibernate而言,iBATIS 以SQL开发的工作量和数据库移植性上的让步,为系统设计提供了更大的自由空间。 二者的对比: 1 iBATIS非常简单易学,Hibernate相对较复杂,门槛较高。 2 二者都是比较优秀的开源产品 3 当系统属于二次开发,无法对数据库结构做到控制和修改,那iBATIS的灵活性将比Hibernate更适合 4 系统数据处理量巨大,性能要求极为苛刻,这往往意味着我们必须通过经过高度优化的SQL语句(或存储过程)才能达到系统性能设计指标。在这种情况下iBATIS会有更好的可控性和表现。 5 iBATIS需要手

9、写sql语句,也可以生成一部分,Hibernate则基本上可以自动生成,偶尔会写一些Hql。同样的需求,iBATIS的工作量比Hibernate要大很多。类似的,如果涉及到数据库字段的修改,Hibernate修改的地方很少,而iBATIS要把那些sql mapping的地方一一修改。 6 以数据库字段一一对应映射得到的PO和Hibernte这种对象化映射得到的PO是截然不同的,本质区别在于这种PO是扁平化的,不像Hibernate映射的PO是可以表达立体的对象继承,聚合等等关系的,这将会直接影响到你的整个软件系统的设计思路。 7 Hibernate现在已经是主流O/R Mapping框架,从文

10、档的丰富性,产品的完善性,版本的开发速度都要强于iBATIS 6持久化持久化(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的数据存储在关系型的数据库中,当然也可以存储在磁盘文件中、XML数据文件中等等。 持久化是将程序数据在持久状态和瞬时状态间转换的机制。 JDBC就是一种持久化机制。文件IO也是一种持久化机制。 怎么理解持久化呢?在一定周期内保持不变就是持久化,持久化是针对时间来说的. 数据库中的数据就是持久化了的数据,只要你不去删除或修改. Session会话中Session对象变量也是不变的,是Session容器中

11、持久化。对象持久化的方式有很多种,根据周期不同有,page,Session,Application, 对象序列化机制对于需要将对象的状态保存到文件中,而后能够通过读入对象状态来重新构造对象,恢复程序状态, 理解持久化的二个层面:应用层和系统层、 应用层:如果关闭(shutdown)你的应用然后重新启动则先前的数据依然存在。 系统层:如果关闭(shutdown)你的系统(电脑)然后重新启动则先前的数据依然存在。二、 ORM入门基础1-ORM简介从上图易知,对象关系映射(Object Relational Mapping,简称ORM)就是完成对象数据到关系型数据映射的机制。一般的ORM包括以下四部

12、分: 一个对持久类对象进行CRUD操作的API; 一个语言或API用来规定与类和类属性相关的查询; 一个规定mapping metadata的工具; 一种技术可以让ORM的实现同事务对象一起进行dirty checking, lazy association fetching以及其他的优化操作。 ORM的方法论基于三个核心原则: 简单:以最基本的形式建模数据。 传达性:数据库结构被任何人都能理解的语言文档化。 精确性:基于数据模型创建正确标准化了的结构。 2-ORM的概念 让我们从O/R开始。字母O起源于对象(Object),而R则来自于关系(Relational)。几乎所有的程序里面,都存在

13、对象和关系数据库。在业务逻辑层和用户界面层中,我们是面向对象的。当对象信息发生变化的时候,我们需要把对象的信息保存在关系数据库中。 当你开发一个应用程序的时候(不使用O/R Mapping),你可能会写不少数据访问层的代码,用来从数据库保存,删除,读取对象信息,等等。你在DAL中写了很多的方法来读取对象数据,改变状态对象等等任务。而这些代码写起来总是重复的。 ORM解决的主要问题是对象关系的映射。域模型和关系模型分别是建立在概念模型的基础上的。域模型是面向对象的,而关系模型是面向关系的。一般情况下,一个持久化类和一个表对应,类的每个实例对应表中的一条记录,类的每个属性对应表的每个字段。 ORM

14、技术特点: 1.提高了开发效率。由于ORM可以自动对Entity对象与数据库中的Table进行字段与属性的映射,所以我们实际可能已经不需要一个专用的、庞大的数据访问层。 2.ORM提供了对数据库的映射,不用sql直接编码,能够像操作对象一样从数据库获取数据。 3-ORM的优缺点 ORM的缺点是会牺牲程序的执行效率和会固定思维模式。 从系统结构上来看,采用ORM的系统一般都是多层系统,系统的层次多了,效率就会降低。ORM是一种完全的面向对象的做法,而面向对象的做法也会对性能产生一定的影响。 在我们开发系统时,一般都有性能问题。性能问题主要产生在算法不正确和与数据库不正确的使用上。ORM所生成的代

15、码一般不太可能写出很高效的算法,在数据库应用上更有可能会被误用,主要体现在对持久对象的提取和和数据的加工处理上,如果用上了ORM,程序员很有可能将全部的数据提取到内存对象中,然后再进行过滤和加工处理,这样就容易产生性能问题。 在对对象做持久化时,ORM一般会持久化所有的属性,有时,这是不希望的。 但ORM是一种工具,工具确实能解决一些重复,简单的劳动。这是不可否认的。但我们不能指望工具能一劳永逸的解决所有问题,有些问题还是需要特殊处理的,但需要特殊处理的部分对绝大多数的系统,应该是很少的。4-目前流行的 ORM 产品 目前众多厂商和开源社区都提供了持久层框架的实现,常见的有: Apache O

16、JB (http:/db.apache.org/ojb/) Cayenne (http:/objectstyle.org/cayenne/) Jaxor () Hibernate (http:/www.hibernate.org) iBatis () jRelationalFramework () mirage (http:/itor.cq2.org/en/oss/mirage/toon) SMYLE (http:/www.drjava.de/smyle) TopLink ( 其中 TopLink 是 Oracle 的商业产品,其他均为开源项目。 其中 Hibernate 的轻量级 ORM 模

17、型逐步确立了在 Java ORM 架构中领导地位,甚至取代复杂而又繁琐的 EJB 模型而成为事实上的 Java ORM 工业标准。而且其中的许多设计均被 J2EE 标准组织吸纳而成为最新 EJB 3.0 规范的标准,这也是开源项目影响工业领域标准的有力见证三、 LOG4J的配制2- 什么是log4jlog4j是一个非常强大的log记录软件,下面我们就来看看在项目中如何使log4j。首先当然是得到log4j的jar档,推荐使用1.2.X版(http:/logging.apache.org/log4j/1.2/download.html ) log4j类图如下:Logger - 日志写出器,供程序

18、员输出日志信息 Appender - 日志目的地,把格式化好的日志信息输出到指定的地方去 ConsoleAppender - 目的地为控制台的Appender FileAppender - 目的地为文件的Appender RollingFileAppender - 目的地为大小受限的文件的Appender Layout - 日志格式化器,用来把程序员的logging request格式化成字符串 PatternLayout - 用指定的pattern格式化logging request的Layout 2- Log4j基本使用方法 Log4j由三个重要的组件构成:日志信息的优先级,日志信息的输出

19、目的地,日志信息的输出格式。日志信息的优先级从高到低有ERROR、WARN、 INFO、DEBUG,分别用来指定这条日志信息的重要程度;日志信息的输出目的地指定了日志将打印到控制台还是文件中;而输出格式则控制了日志信息的显示内容。定义配置文件 其实您也可以完全不使用配置文件,而是在代码中配置Log4j环境。但是,使用配置文件将使您的应用程序更加灵活。Log4j支持两种配置文件格式,一种是XML格式的文件,一种是Java特性文件(键=值)。下面我们介绍使用Java特性文件做为配置文件的方法:1.配置根Logger,其语法为: log4j.rootLogger = level , appender

20、Name, appenderName, 其中,level 是日志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。Log4j建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定义了INFO级别,则应用程序中所有DEBUG级别的日志信息将不被打印出来。 appenderName就是指B日志信息输出到哪个地方。您可以同时指定多个输出目的地。2.配置日志信息输出目的地Appender,其语法为: log4j.appender.app

21、enderName = fully.qualified.name.of.appender.classlog4j.appender.appenderName.option1 = value1log4j.appender.appenderName.option = valueN其中,Log4j提供的appender有以下几种:org.apache.log4j.ConsoleAppender(控制台),org.apache.log4j.FileAppender(文件),org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),org.apache.l

22、og4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)3.配置日志信息的格式(布局),其语法为: log4j.appender.appenderName.layout = fully.qualified.name.of.layout.classlog4j.appender.appenderName.layout.option1 = value1log4j.appender.appenderName.layout.option = valueN其中,L

23、og4j提供的layout有以e几种:org.apache.log4j.HTMLLayout(以HTML表格形式布局),org.apache.log4j.PatternLayout(可以灵活地指定布局模式),org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,打印参数如下: %m 输出代码中指定的消息%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL%r 输出自应用

24、启动到输出该log信息耗费的毫秒数%c 输出所属的类目,通常就是所在类的全名%t 输出产生该日志事件的线程名%n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%dyyy MMM dd HH:mm:ss,SSS,输出类似:2002年10月18日 22:10:28,921%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)在代码中使用Log4j 1.得到记录器 使用Log4j,第一步就是获取日志记

25、录器,这个记录器将负责控制日志信息。其语法为:public static Logger getLogger( String name)通过指定的名字获得记录器,如果必要的话,则为这个名字创建一个新的记录器。Name一般取本类的名字,比如:static Logger logger = Logger.getLogger ( ServerWithLog4j.class.getName () )2.读取配置文件 当获得了日志记录器之后,第二步将配置Log4j环境,其语法为:BasicConfigurator.configure (): 自动快速地使用缺省Log4j环境。PropertyConfigur

26、ator.configure ( String configFilename) :读取使用Java的特性文件编写的配置文件。DOMConfigurator.configure ( String filename ) :读取XML形式的配置文件。3.插入记录信息(格式化日志信息) 当上两个必要步骤执行完毕,您就可以轻松地使用不同优先级别的日志记录语句插入到您想记录日志的任何地方,其语法如下:Logger.debug ( Object message ) ;Logger.info ( Object message ) ;Logger.warn ( Object message ) ;Logger.

27、error ( Object message ) ;3- Log4j在项目中使用过程1.将log4j-1.2.14.jar加入你的项目中;2.在src/下创建log4j.properties|log4j.xml文件;3.在web.xml中配置log4j的信息,如下: log4jConfigLocation /WEB-INF/classes/log4j.properties org.springframework.web.util.Log4jConfigListener 4.在项目webroot下创建你想要保存日志文件的文件夹及文件,如webroot/logs/web_app.log;具体log

28、4j.properties文件示例如下:log4j.rootLogger=INFO, stdout, logfilelog4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.layout=org.apache.log4j.PatternLayout#log4j.appender.stdout.layout.ConversionPattern=%d %p %c - %m%nlog4j.appender.stdout.layout.ConversionPattern=- %m%nlog4j.appende

29、r.logfile=org.apache.log4j.RollingFileAppenderlog4j.appender.logfile.File=$webapp.root/logs/webapp.loglog4j.appender.logfile.MaxFileSize=512KB# Keep three backup files.log4j.appender.logfile.MaxBackupIndex=3# Pattern to output: date priority category - messagelog4j.appender.logfile.layout=org.apache

30、.log4j.PatternLayoutlog4j.appender.logfile.layout.ConversionPattern=%d %p %c - %m%n.opensymphony.xwork2=ERROR # Control logging for other open source packageslog4j.logger.org.springframework=ERRORlog4j.logger.org.quartz=ERROR.sf.ehcache=ERROR.sf.navigator=ERRORmons=ERRORlog4j.logger.org.apache.strut

31、s=ERROR# Struts OgnlUtil issues unimportant warnings .opensymphony.xwork2.util.OgnlUtil=error .opensymphony.xwork2.ognl.OgnlValueStack=error 4网上找的一个实例配制 log4j文件 一、配置文件xmllog4jconfig.xml如下,放到工程的根目录Xml代码 1. 2. 3. 4. 5. 6. 7. !- 8. 9. 10. 11. 12. 13. - 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26

32、. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. !- 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. - 98. 99. 1

33、00. !- 101. 102. 103. 104. 105. - 106. 107. 108. !- 109. 110. - 111. 112. 113. 114. 115. 116. 117. 118. 二、新建Simpandfile.java如下Java代码 1. importjunit.framework.Test; 2. importorg.apache.log4j.Level; 3. importorg.apache.log4j.Logger; 4. importorg.apache.log4j.PropertyConfigurator; 5. importorg.apache.l

34、og4j.xml.DOMConfigurator; 6. publicclassSimpandfile 7. 8. staticLoggerlogger=Logger.getLogger(Test.class); 9. 10. publicstaticvoidmain(Stringargs) 11. 12. /以property方式读到配置文件。 13. for(inti=0;i100;i+) 14. 15. /PropertyConfigurator.configure(simple.properties); 16. DOMConfigurator.configure(xmllog4jcon

35、fig.xml); 17. logger.debug(HereissomeDEBUG); 18. logger.info(HereissomeINFO); 19. logger.warn(HereissomeWARN); 20. logger.error(HereissomeERROR); 21. logger.fatal(HereissomeFATAL); 22. 23. 24. Java代码 1. importjunit.framework.Test; 2. importorg.apache.log4j.Level; 3. importorg.apache.log4j.Logger; 4.

36、 importorg.apache.log4j.PropertyConfigurator; 5. importorg.apache.log4j.xml.DOMConfigurator; 6. publicclassSimpandfile 7. 8. staticLoggerlogger=Logger.getLogger(Test.class); 9. 10. publicstaticvoidmain(Stringargs) 11. 12. /以property方式读到配置文件。 13. for(inti=0;i100;i+) 14. 15. /PropertyConfigurator.conf

37、igure(simple.properties); 16. DOMConfigurator.configure(xmllog4jconfig.xml); 17. logger.debug(HereissomeDEBUG); 18. logger.info(HereissomeINFO); 19. logger.warn(HereissomeWARN); 20. logger.error(HereissomeERROR); 21. logger.fatal(HereissomeFATAL); 22. 23. 24. 四、 HQL基本语法入门1. 实体查询String hql = from TUs

38、er; 执行这条语句会返回TUser以及TUser子类的纪录。注: 如果 TUser 类具有外键, 查询会报错!解决方法:select 别名.属性 from 类 as 别名. 没有别名.属性仍然报错!hql = from java.lang.Object会返回数据库中所有库表的纪录。where 语句hql = from TUser as user where user.name=yyy;其中,as可以省略也一样hql = from TUser user where user.name=yyy;where子句中,我们可以通过比较运算符设定条件,如:=, , , =, =, between, no

39、t between, in, not in, is, like等。模糊查询 /HQL语言实现模糊查询 public List findLikeName(String username) List list=new ArrayList(); String hql=from LpkUser as user where USERNAME like %+username+%; SessionFactory sessionFactory =new Configuration().configure().buildSessionFactory(); Session session=sessionFacto

40、ry.openSession(); Transaction transaction=session.beginTransaction(); Query query=session.createQuery(hql); list=query.list(); mit(); session.close(); return list; 2.属性查询List list = session.createQuery(select user.name, user.age from TUser as user).list();还可以在HQL中动态构造对象实例的方法,将数据封装。List list = sessio

41、n.createQuery(select new TUser(user.name, user.age) from TUser as user).list();Iterator it = list.iterator();while(it.hasNext() ) TUser user = (TUser)it.next();System.out.println(user.getName();但是要注意这里的TUser对象只是对name和age属性的封装,其他状态均未赋值,所以不能用它来进行更新操作。也可以在HQL的Select子句中使用统计函数select count(*) ,min(user.ag

42、e) from TUser as user也可以使用distinct关键字来删除重复纪录。select distinct user.name from TUser as user;3.实体的更新与删除hibernate 2中需要先查询出实体,设置属性后再保存。hibernate 3中,提供了更灵活的方式(bulk delete/update)更新:Query query = session.createQuery(update TUser set age=18 where id=1);query.executeUpdate();删除:session.createQuery(delete TUser where age=18);query.executeUpdate();4.分组与排序Order by子句:from TUser user order by user.name, user.age descGroup by子句和Having子句select count(user), use

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!