Hibernate介绍及入门级应用开发

一、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();
		
		
		
	}
	
}



郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。