介绍Hibernate之前,先了解一下为什么Hibernate会出现。一个技术的出现都是因为当前技术满足不了需求。在Hibernate出现之前,对数据库进行操作都是使用JDBC。但是JDBC有哪些优缺点呢?下面我们来详细分析。
优点:速度快;
SQL 语句自己写,把控性好。
缺点:代码冗余,频繁的trycatch操作
查询代码特别繁琐
不同的数据库SQL语句有差异,代码的可移植性差
没有数据缓存
不是面向对象
就是因为JDBC的这些缺点,导致Hibernate诞生。
2.Hibernate优缺点分析
优点:简单
有数据缓存:一级缓存、二级缓存、查询缓存
SQL语句由Hibernate内部生成,可移植性好
缺点:sql语句不是自己写,不可控
数据库特别大时,不识货使用hibernate
分层结构是软件设计中的一种重要设计思想。持久层是在软件的三层体系结构的基础上发展起来的,它以解决对象和关系这两大领域之间存在的不匹配问题为目标,为对象-关系数据库之间提供了一个成功的映射解决方案。
ORM说白了就是让关系型数据库和对象发生关联,解决数据库中的表格到java中的Class对象之间的转换问题。
通过配置映射问题***.hbm.xml来完成转化。
映射文件的作用主要是完成以下几个方面的转化:
1.类与表的对应关系
2.类中的属性名称和表中的字段名称的对应关系
3.类中的属性类型和表中的字段类型的对应关系
4.把一对多和多对多的关系转换成面向对象的关系
笔者用的hibernate版本为hibernate3,所需要的jar包名称为:
antlr-2.7.6.jar
backport-util-concurrent.jar
c3p0-0.9.1.jar 数据库连接池包
commons-collections-3.1.jar 集合帮助工具包
commons-logging-1.1.1.jar 日志包
dom4j-1.6.1.jar 解析XML包
ehcache-1.5.0.jar 缓冲框架包
hibernate3.jar hibernate核心包
javassist-3.9.0.GA.jar 代理模式包,解决懒加载问题
jta-1.1.jar
log4j.jar
mysql-connector-java-5.1.10-bin.jar 数据库连接包
slf4j-api-1.5.8.jar 帮助工具
slf4j-log4j12.jar 帮助工具
并通过build path 把刚才拷贝的jar包添加到项目中去,如图所示。
在src目录下新建com.hibernateTest.domain包,并在该包中建立Person类,Person类即为POJO类(Plain OldJava Objects,持久化类)。这里对POJO类做一下介绍,POJO类很想javaBean,类中包含于数据库表中相对应的各个属性,这些属性通过getter和setter方法来访问,对外部因此了内部的实现细节。
Person类代码为:
package com.hibernateTest.domain; import java.io.Serializable; /** * @author zhuwei * */ //让对象是实现Serializable,对象序列化的作用是让对象可以在网络上传输 //有java虚拟机实现 public class Person implements Serializable { private Long pid; public Long getPid() { return pid; } public void setPid(Long pid) { this.pid = pid; } public String getPname() { return pname; } public void setPname(String pname) { this.pname = pname; } private String pname; }
在com.hibernateTest.domain中新建Person.hbm.xml映射文件。右键Person.hbm.xml,选择打开方式为MyeclipseHibernate Mapping Editor,复制下面的代码到文件中,该代码可以认为是模板代码,。
<?xml version="1.0"encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/HibernateMapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
</hibernate-mapping>
添加Person类和数据库中相应表之间的映射代码:
<!-- 用来描述一个持久化类
name 类的全名
table 表名,可以不写,默认值和类名一样
catalog 数据库名称,一般不写
-->
<class name="com.hibernateTest.domain.Person"table="Person">
<!-- 标示属性,和数据库主键对应 ,将Person类的pid映射为表中的主键pid
column 列名称
length 数据库的字段长度,默认数据库最高的长度
type 类型
-->
<id name="pid"column="pid" length="5"type="java.lang.Long">
<!-- 主键产生器
告诉hibernate容器用什么样的方式产生主键
-->
<generator class="increment"></generator>
</id>
<!-- 映射person类的pname属性 -->
<property name="pname" column="pname"length="20" type="java.lang.String"></property>
</class>
完成后,这个Person.hbm.xml的代码为:
<?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> <!-- 用来描述一个持久化类 name 类的全名 table 表名,可以不写,默认值和类名一样 catalog 数据库名称,一般不写 --> <class name="com.hibernateTest.domain.Person" table="Person"> <!-- 标示属性,和数据库主键对应 ,将Person类的pid映射为表中的主键pid column 列名称 length 数据库的字段长度,默认数据库最高的长度 type 类型 --> <id name="pid" column="pid" length="5" type="java.lang.Long"> <!-- 主键产生器 告诉hibernate容器用什么样的方式产生主键 --> <generator class="increment"></generator> </id> <!-- 映射person类的pname属性 --> <property name="pname" column="pname" length="20" type="java.lang.String"></property> </class> </hibernate-mapping>
在src目录下新建hibernate配置文件:好hibernate.cfg.xml,并选择用Myeclipse hibernate config editor打开。
这一部分的配置文件也是之间拷贝现成代码,修改其中的登录名、密码和数据库名部分即可。
代码为:
<?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只能连接一个数据库 --> <session-factory> <!-- 数据库的用户名 --> <property name="connection.username">root</property> <!-- 密码 --> <property name="connection.password">340621</property> <!-- url --> <property name="connection.url"> jdbc:mysql://localhost:3306/hibernateTest </property> <!-- 作用:根据持久化类和映射文件生成表 validate 只验证不生成 create-drop 当hibernate启动时生成表,hibernate结束时删除表 create 只要启动hibernate时生成表 update 在启动hibernate容器时检查持久化类和映射文件是不是对应,不对应则创建 --> <property name="hbm2ddl.auto">update</property> <!-- 显示hibernate内部生成的sql语句 --> <property name="show_sql">true</property> <mapping resource="com/hibernateTest/domain/Person.hbm.xml" /> </session-factory> </hibernate-configuration>
其中语句<mapping resource="com/hibernateTest/domain/Person.hbm.xml"/>
要特别注意,在语句描述的是加载映射文件,设置方式为选择用Myeclipse hibernate config editor打开,删除原有映射,重新加载即可。如下图所示。
在工程根目录下新建名为test的文件,并在文件中新建con.hibernateTest.test包,在保重新建CreateTable的测试类,类代码为:
package com.hibernateTest.test; import org.hibernate.cfg.Configuration; import org.junit.Test; public class CreateTable { @Test public void testCreateTable() { //加载配置文件 Configuration configuration = new Configuration(); configuration.configure(); configuration.buildSessionFactory(); } }
在con.hibernateTest.test包中新建PersonTest类,代码为:
package com.hibernateTest.test; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.junit.Test; import com.hibernateTest.domain.Person; public class PersonTest { @Test public void testSavePerson() { Configuration configuration = new Configuration(); configuration.configure(); SessionFactory sessionfactory = configuration.buildSessionFactory(); Session session = sessionfactory.openSession(); Transaction transaction = session.beginTransaction(); Person persion= new Person(); persion.setPname("xiaobai"); session.save(persion) ; transaction.commit(); session.close(); } }
运行该测试类,可以发现数据库表中多了一条记录。
看第7步的代码hibernate配置部分是重复的,而且每一次对数据库进行操作都要写这部分代码,可以考虑将这部分代码放在一个专门的类中,操作数据库的类继承该类即可。
在src目录下新建com.hibernateTest.util包,在该包中新建Hibernate类,让hibernate加载部分在该类中完成,代码为:
package com.hibernateTest.utils; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class HibernateUtils { public static SessionFactory sessionfactory; static { Configuration configuration = new Configuration(); configuration.configure(); sessionfactory = configuration.buildSessionFactory(); } }
PersonTest类的代码可以改为:
package com.hibernateTest.test; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.junit.Test; import com.hibernateTest.domain.Person; import com.hibernateTest.utils.HibernateUtils; public class PersonTest extends HibernateUtils { @Test public void testSavePerson() { Session session = sessionfactory.openSession(); Transaction transaction = session.beginTransaction(); Person persion= new Person(); persion.setPname("xiaobai"); session.save(persion) ; transaction.commit(); session.close(); } }
原文地址:http://blog.csdn.net/longshengguoji/article/details/41683663