Hibernate学习总结(1)

来源:互联网 发布:淘宝买东西扣银行卡吗 编辑:程序博客网 时间:2024/06/06 08:55

刚刚学习了Hibernate,总结一下,请各位前辈指导指导哈!!

1.Hibernate优势

1.1JDBC的缺点

在我们使用JDBC时,虽然能执行sql语句,将数据从内存存储到持久化设备(例如磁盘)中。但JDBC有以下缺点:

(1)JDBC无法直接面向对象;
(2)开发效率低;
(3)代码冗余: pstmt的setXX方法,方法参数冗余的getXX方法,如果POJO的属性很多,代码增加;
(4)重复性工作多。

1.2Hibernate的优势

而Hibernate是一个开发源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装, 简化了JDBC 繁琐的编码,将JavaBean对象和数据库的表建立对应关系。

Hibernate实现了面向对象的持久化操作。

1.3持久化与ORM

持久化就是数据模型(内存)与存储模型(持久化设备)的相互转换。在Java中说持久化,通常指的是使用SQL将数据存储在关系型数据库中。

ORM(对象关系映射)是持久化的一种解决方案,主要是把对象模型和关系型数据库关系模型映射起来,并且使用元数据对这些映射进行描述。其中包含三个方面的映射:

(1)实体类的定义与表的定义映射,

(2)类的属性与表主键的映射;

(3)类的属性与表的字段映射。

内存中的一个实体对象代表一行已经存在的数据或者即将插入的数据。这样映射起来之后,通过某种自动化的SQL生成机制便可达到“操作对象就是操作数据库”的目标。

Hibernate就是这样的工具,利用ORM,其中自身带有某种自动化的SQL生成机制,就可以通过查找映射自动生成sql语句、生成setter/getter语句。

2.Hibernate框架搭建

Hibernate框架搭建准备工作有三步:

(1)创建并导入jar包:

下载Hibernate:可以在http://sourceforge.net/projects/hibernate/files/hibernate4/页面找到下载链接,在页面下方选择要下载的版本,我们需要下载的是Hibernate-release-4.2.0.Final.zip。
解压后,展开“lib”目录——展开“required”目录,这里面的jar包,需要导入到工程中。
导入数据库的JDBC驱动包,本书采用oracle10g作为数据库,使用ojdbc14.jar(也可以使用Oracle11g的驱动包ojdbc6.jar,该包支持JDK6.0)。
如Hibernate官方文档所说,Hibernate的连接池不能应用于产品环境(可用于开发和测试环境),建议我们使用第三方的更为优秀的连接池。我们采用c3p0最新版本c3p0-0.9.2.1.jar和mchange-commons-Java-0.2.3.4.jar。
考虑到JSP中要使用JSTL,所以jstl.jar和standard.jar也是需要的。

(2)创建Hibernate主配置文件:默认文件名为“hibernate.cfg.xml”

主配置文件中主要包含有1)数据库连接信息(数据库的驱动、URL、用户名、密码);

                                             2)Hibernate的相关特性(数据库方言、是否输出SQL、是否对输出SQL进行格式化);

                                             3)连接池的配置;

                                             4)注册ORM实体类映射文件路径。

其中代码如下:

<?xml version='1.0' encoding='utf-8'?><!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"><hibernate-configuration> <session-factory>  <!-- 数据库连接URL -->  <property name="connection.url">jdbc:oracle:thin:@localhost:1521:XE</property>  <!-- 数据库用户名  -->  <property name="connection.username">oa</property>  <!-- 数据库密码 -->  <property name="connection.password">oa123</property>  <!-- 数据库JDBC驱动类名 -->  <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>  <!-- 数据库方言 -->  <property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>  <!-- ddl语句自动建表 -->  <property name="hbm2ddl.auto">none</property>  <!-- 是否输出Hibernate生成的SQL语句,开发阶段一般需要开启 -->  <property name="show_SQL">true</property>  <!-- 是否对输出SQL进行格式化 -->  <property name="format_SQL">true</property>  <!-- 连接池配置 -->  <property name="hibernate.connection.provider_class">   org.hibernate.service.jdbc.connections.internal.C3P0ConnectionProvider  </property>  <!-- 这是C3P0随时准备好的最少的JDBC连接数量 -->  <property name="hibernate.c3p0.min_size">5</property>  <!-- 连接池中JDBC连接的最大数量 -->  <property name="hibernate.c3p0.max_size">20</property>  <!-- 超时周期,在它之后,闲置连接将从池中移除 -->  <property name="hibernate.c3p0.timeout">300</property>  <!-- 最多高速缓存100个预编译语句,该属性是使Hibernate获得较好性能的要素。 -->  <property name="hibernate.c3p0.max_statements">100</property>  <!-- 连接被自动验证前,以秒为单位的闲置时间 -->  <property name="hibernate.c3p0.idle_test_period">3000</property>  <!-- 注册ORM实体类映射文件-->  <mapping resource="实体类映射文件路径" />  … </session-factory></hibernate-configuration>

 

(3)可以用以下代码测试连接是否成功:

public class HibernateTest { public static void main(String[] args) {  //获取配置,默认读取classpath根目录下名为hibernate.cfg.xml的文件  Configuration cfg = new Configuration().configure();ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(cfg.getProperties()).buildServiceRegistry();  //创建SessionFactory  SessionFactory factory = cfg.buildSessionFactory(serviceRegistry);   //获取session  System.out.println(factory.openSession()); }}


 

2.Hibernate的简单应用

2.1创建实体类

实体类(也称持久化类)是一个带有一些属性的JavaBean类,实体类对属性的存取方法(getter and setter method)使用了标准JavaBean命名约定,同时把类属性的访问级别设成私有的。
为了通过反射机制来实例化类的对象,我们需要提供一个无参的构造器,所有的实体类都要求有无参的构造器,因为Hibernate需要使用Java反射机制来为你创建对象。
最后要为实体类实现Java.io.Serializable 接口,以便Hibernate能更好的缓存实体对象。

2.2创建和配置映射文件

通过实体映射文件,Hibernate知道怎样去加载和存储实体类的对象,知道应该访问数据库里面的哪个表及应该使用表里面的哪些字段。代码例子如下:

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC     "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping> <class name="org.ijob.bean.Seeker" table="ijob_seeker">  <!-- 主键映射 -->  <id name="id" type="string">   <column name="id" length="32"></column>   <generator class="uuid" />  </id>      <!—属性映射 -->  <property name="email" type="string">   <column name="email" length="100"></column>  </property>  <property name="password" type="string">   <column name="password" length="20"></column>  </property>    <property name="name" type="string">   <column name="name" length="10"></column>  </property>  <!—此处省略系列属性映射 --> </class></hibernate-mapping>

其中要重点注意:

(1)主键映射

在实体类映射文件中,被映射的类必须定义对应数据库表的主键字段的属性。映射文件的<id>元素定义了该属性到数据库表主键字段的映射。

(2)主键生成器generator是可选的,它用于指定实体对象的标识符(在表中称之为主键)生成策略。其中包括:

increment:类似于数据表中的自增列,往数据库插入一个新的实体对象时,其标识符(主键)为上一次插入对象的标识符加1。
identity:每次新增对象时,调用数据库本身的“identity”生成器产生标识符。
sequence:每次新增对象时,调用数据库的sequence对象产生标识符。
配置举例:
<generator class="sequence" >
<param name="sequence">sequence_name</param><!--sequence对象的名字 -->
</generator>
这样配置之后,每次往数据库中插入新对象,都调用数据库的“sequence_name”所指定的sequence对象来产生其标识符。
uuid:每次新增对象时,用一个128-bit的UUID算法生成长度为32的字符串类型的标识符。这是本书实际采用的主键生成方式。
assigned:不提供主键自动生成支持,而是让应用程序在save()之前手动为对象分配一个标识符,这是没有<generator>元素时的默认生成策略。

2.3将实体映射文件路径添加到主配置文件中

2.4可以测试一下以上配置是否成功

2.5数据库操作

其中包含7个步骤:如一下代码

// 1、获取配置 Configuration cfg = new Configuration().configure(); ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()   .applySettings(cfg.getProperties()).buildServiceRegistry(); // 2、创建SessionFactory SessionFactory factory = cfg.buildSessionFactory(serviceRegistry); // 3、获取session Session session = factory.openSession(); Transaction tx = session.getTransaction(); try {  // 4、开启事务  tx.begin();  Seeker seeker = new Seeker();  seeker.setEmail("abc@163.com");  seeker.setPassword("abc");  // 5、保存seeker对象  session.save(seeker);  // 6、提交事务  session.getTransaction().commit(); } catch (Exception e) {  tx.rollback();  e.printStackTrace(); } finally {  // 7、关闭session  session.close(); }}
其中第五个步骤就是对数据的一些持久化操作:session是持久化管理器,可以对数据进行增删改查。包括:session。save()、session。get()、session。delete()、session。update()。
原创粉丝点击