一、Hibernate出现背景
介绍Hibernate之前,先了解一下为什么Hibernate会出现。一个技术的出现都是因为当前技术满足不了需求。在Hibernate出现之前,对数据库进行操作都是使用JDBC。但是JDBC有哪些优缺点呢?下面我们来详细分析。
1.JDBC优缺点分析:
优点:速度快;
SQL 语句自己写,把控性好。
缺点:代码冗余,频繁的trycatch操作
查询代码特别繁琐
不同的数据库SQL语句有差异,代码的可移植性差
没有数据缓存
不是面向对象
就是因为JDBC的这些缺点,导致Hibernate诞生。
2.Hibernate优缺点分析
优点:简单
有数据缓存:一级缓存、二级缓存、查询缓存
SQL语句由Hibernate内部生成,可移植性好
缺点:sql语句不是自己写,不可控
数据库特别大时,不识货使用hibernate
二、持久层概述及ORM介绍
1、持久层概述
分层结构是软件设计中的一种重要设计思想。持久层是在软件的三层体系结构的基础上发展起来的,它以解决对象和关系这两大领域之间存在的不匹配问题为目标,为对象-关系数据库之间提供了一个成功的映射解决方案。
2.ORM(Object/RelationMapping)对象-关系映射
ORM说白了就是让关系型数据库和对象发生关联,解决数据库中的表格到java中的Class对象之间的转换问题。
通过配置映射问题***.hbm.xml来完成转化。
映射文件的作用主要是完成以下几个方面的转化:
1.类与表的对应关系
2.类中的属性名称和表中的字段名称的对应关系
3.类中的属性类型和表中的字段类型的对应关系
4.把一对多和多对多的关系转换成面向对象的关系
三、基于hibernate的入门应用
1、myeclipse中创建java项目,命名为HibernateDemo
2、拷贝相关的jar包到WEB-INF目录下的lib文件夹中。
笔者用的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包添加到项目中去,如图所示。
3.编写POJO映射类
在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;
}
4.映射文件编写
在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>
5.编写hibernate.cfg.xml配置文件
在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打开,删除原有映射,重新加载即可。如下图所示。
6.编写测试文件
在工程根目录下新建名为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();
}
}
7.往表中插入记录测试
在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();
}
}
运行该测试类,可以发现数据库表中多了一条记录。
8.对第7步进行优化
看第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();
}
}