hibernate4快速入门实例详解
Hibernate是什么 Hibernate是一个轻量级的ORMapping框架 ORMapping原理(Object RelationalMapping) ORMapping基本对应规则: 1:类跟表相对应 2:类的属性跟表的字段相对应 3:类的实例与表中具体的一条记录相对应 4:一个类可以对应多个表,一个表也可以对应对个类 5:DB中的表可以没有主键,但是Object中必须设置主键字段 6:DB中表与表之间的关系(如:外键)映射成为Object之间的关系 7:Object中属性的个数和名称可以和表中定义的字段个数和名称不一样 ORMapping的基本实现方式: 使用JDBC,用SQL来操作数据库,只是看动态生成还是人工写代码来实现。 大家想想,我们实现过ORMapping吗? Hibernate能干什么: Hibernate主要用来实现Java对象和表之间的映射,除此之外还提供还提供数据查询和获取数据的方法,可以大幅度减少开发时人工使用SQL和JDBC处理数据的时间。 Hibernate的目标是对于开发者通常的数据持久化相关的编程任务,解放其中的95%。对于以数据为中心的程序来说,它们往往只在数据库中使用存储过程来实现商业逻辑,Hibernate可能不是最好的解决方案;对于那些在基于Java的中间层应用中,它们实现面向对象的业务模型和商业逻辑的应用,Hibernate是最有用的。 Hibernate可以帮助你消除或者包装那些针对特定厂商的SQL代码,并且帮你把结果集从表格式的表示形式转换到一系列的对象去。 一个非常简要的Hibernate体系结构的高层概要图 Hibernate运行时体系结构 “最小”的体系结构方案,要求应用程序提供自己的 JDBC连接并管理自己的事务。这种方案使用了Hibernate API 的最小子集. “全面解决”的体系结构方案,将应用层从底层的JDBC/JTAAPI中抽象出来,而让Hibernate来处理这些细节。
针对单个数据库映射关系经过编译后的内存镜像,是线程安全的(不可变)。 它是生成Session的工厂,本身要用到ConnectionProvider。
表示应用程序与持久储存层之间交互操作的一个单线程对象,此对象生存期很短,隐藏了JDBC连接,也是Transaction的工厂。
应用程序用来指定原子操作单元范围的对象,它是单线程的,生命周期很短。它通过抽象将应用从底层具体的JDBC、JTA以及CORBA事务隔离开。
生成JDBC连接的工厂(有连接池的作用)。它通过抽象将应用从底层的Datasource或DriverManager隔离开。仅供开发者扩展/实现用,并不暴露给应用程序使用。
生成Transaction对象实例的工厂。仅供开发者扩展/实现用,并不暴露给应用程序使用。 HelloWorld 要研究怎么做,先得搞清楚需要做什么 根据刚才的学习,做基本的Hibernate应用程序,要完成下面的工作:Object、数据库的表、两种配置文件、客户端程序来调用Hibernate的接口进行操作。 构建环境 最简单的方法:把hibernate-release-4.0.0.Beta4.zip包里面lib/required下的jar包全部添加到工程的library里面,另外还需添加slf4j的实现包slf4j-log4j12-1.5.8.jar和log4j的实现包log4j-1.2.16.jar,还有别忘了把JDBC的驱动jar包也加入到library里面 Object怎么做 1:就是前面学过的vo的写法(规则同样是那四点) 2:要求必须有一个public为空参的构造方法,现在写vo一般不写构造方法,默认就有一个,但是写构造方法的时候要注意写上一个public为空参的构造方法 3:要求提供一个标识属性(identifier) 4:使用非final的类(因为要使用代理来延迟实体的装载) 5:设若构建一个对象:com.bjpowernode.h4.hello.UserModel,有四个属性:uuid,userId,name,age 在数据库中建表 设若构建一个表为tbl_user,字段:uuid,age 配置xxx.cfg.xml 1:缺省名称为hibernate.cfg.xml 2:存放在当前classes的根目录下,开发的时候在src根下就可以了 3:主要有如下四部分配置 : (1)与DB的连接 (2)可选配置 (3)资源文件注册 (4)二级缓存 4:配置的时候可以到Hibernate发行包里面找个hibernate.cfg.xml的例子,比如可以用“projecthibernate-documentationquickstarttutorialsbasicsrctestresources”下面的hibernate.cfg.xml作例子 5:示例如下: <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property> <property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property> <property name="connection.username">test</property> <property name="connection.password">test</property> <property name="connection.pool_size">2</property> <property name="dialect">org.hibernate.dialect.OracleDialect</property> <property name="show_sql">true</property> <mapping resource="cn/bjpowernode/h4/hello/UserModel.hbm.xml"/> </session-factory> </hibernate-configuration> 配置xxx.hbm.xml 1:与被描述的类同名 ,如:UserModel.hbm.xml 2:存放位置与所描述类存放在同一文件夹下 3:主要有如下四部分配置 : (1)类和表的映射 (2)主键的映射 (3)类的属性和DB中字段的映射 (4)关系的映射 4:配置的时候可以到hibernate发行包里面找个例子,比如可以用“projecthibernate-coresrctestjavaorghibernatetestcid”下面的Customer.hbm.xml作例子 5:示例如下: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC '-//Hibernate/Hibernate Mapping DTD 3.0//EN' 'http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd'> <hibernate-mapping> <class name="com.bjpowernode.h4.hello.UserModel" table="tbl_user"> <id name="uuid"> <generator class="assigned"/> </id> <property name=“userId”></property> <property name=“name”></property> <property name="age"></property> </class> </hibernate-mapping> 客户端文件: package com.bjpowernode.h4.hello; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; public class Client { public static void main(String[] args) { SessionFactory sf = new Configuration().configure().buildSessionFactory(); Session s = null; Transaction t = null; try{ //准备数据 UserModel um = new UserModel(); um.setUuid("1"); um.setUserId("id1"); um.setName("name1"); um.setAge(1); s = sf.openSession(); t = s.beginTransaction(); s.save(um); t.commit(); }catch(Exception err){ t.rollback(); err.printStackTrace(); }finally{ s.close(); } } } 测试:直接在Elipse里面运行Client文件即可,运行结束,你将会看到在console输出:“Hibernate: insert into tbl_user (userId,age,uuid) values (?,?,?)”,打开数据库的数据表,你会看到一条值已经加入了。 说明: 1: 默认是”hibernate.cfg.xml”,不用写出来,如果文件名不是”hibernate.cfg.xml”,那么需要显示指定,如下:
2:Session是应用程序主要使用的Hibernate接口,约相当于JDBC的Connection+Statement/PreparedStatement的功能,是线程不安全的 3:在Hibernate4里面,已经不推荐使用Configuration类了,而改为使用 ServiceRegistryBuilder和MetadataSources来代替,新的写法大致如下: ServiceRegistryBuilder builder = new ServiceRegistryBuilder().configure(); builder.applySetting("connection.driver_class","oracle.jdbc.driver.OracleDriver"); builder.applySetting("connection.url","jdbc:oracle:thin:@localhost:1521:orcl"); builder.applySetting("connection.username","ztb"); builder.applySetting("connection.password","ztb"); builder.applySetting("connection.pool_size","2"); builder.applySetting("hibernate.dialect","org.hibernate.dialect.OracleDialect"); builder.applySetting("show_sql","true"); MetadataSources sources = new MetadataSources( builder.buildServiceRegistry() ); sources.addResource("cn/bjpowernode/h4/hello/UserModel.hbm.xml"); MetadataImpl metadata = (MetadataImpl) sources.buildMetadata(); SessionFactory sf = metadata.getSessionFactoryBuilder().buildSessionFactory(); 这种写法,现在还没有实现完全,不太好用,所以官方给出的示例里面还是采用以前的方式,大家先了解一下。 4:这里使用的事务Transaction是Hibernate的Transaction,需要有,不能去掉。 为什么必须有这个Hibernate的事务呢?以HelloWorld为例来看看: 总结 以上所述是小编给大家介绍的hibernate4快速入门实例详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对编程小技巧网站的支持! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- java – 在默认浏览器中打开本地URL时删除参数
- JavaUrlRewrite实现网站URL重写过程实录
- java – 为什么libgdx SpriteBatch / BitmapFont
- java – 是否可以为~100个常量创建一个位掩码?
- java – 使用NetBeans 8,但低于Lambda表达式的编
- 虚拟机 – 从shell重启VM(在vbox上运行)到特定(已
- java – 悬空元字符
- java – Apache Commons Math 2.2 Percentile bu
- java8 统计字符串字母个数的几种方法总结(推荐)
- java – TestNG – @AfterMethod的优先级