Hibernate基础

Hibernate基础(上)


  分类: Hibernate

Hibernate是一种ORM框架,与各种数据库、SQL语句打交道,是数据持久化的一种解决方案。本章将系统的介绍Hibernate的各种配置方式、ORM Mapping等。这一章中先通过两个简单的例子,直观的了解Hibernate,在后面的章节中会对Hibernate进行详细的讲解。

本章使用的开发工具是MyEclipse5.5,服务器是Tomcat6.0,数据库是MySQL5.1。本章中所有例子的源代码都在光盘第8章。

8.1  Hibernate概述

Hibernate是一种ORM框架,全称Object-Relative Database-Mapping,在Java对象与关系数据库之间建立某种映射,以实现直接存取Java 对象(一般为实体类)。ORM框架是不同于MVC的另一种思想的框架,使用范围也与MVC截然不同。类似功能的框架还有SUNJDOOracle公司的TopLinkApacheiBatisOpenJPA等。

8.1.1  ORM简介

在实际的开发中,数据持久化是核心的技术之一。传统的数据持久化编程中,需要使用JDBC并配合大量的SQL语句。ConnectionStatementResultSetJDBC APISQL夹杂在一起,开发效率都很低下。后来出现了DAO模式,所有的JDBC APISQL语句均移到了DAO层,但是仍然需要编写大量的SQL语句。

DAO层很有规律为:插入数据时,把实体类(有人称为POJO,也有人称为VO)拆分成各种属性然后拼装为SQL语句,保存进数据库;读取数据时,用SQL把实体类的各种属性从数据库读出来,然后拼装为实体类对象返回。而且实体类与数据表、实体类的属性与数据表的列,都存在着某种固定的映射关系。如果能够用程序自动生成SQL语句就好了。

ORM称为对象-关系数据库映射,英文全名为Object/Relation MappingORM就是在JDBC技术的基础上,能够调用程序自动生成的SQL语句。它通过配置文件或者使用Java注解把Java对象映射到数据库上,自动生成SQL语句并执行。ORM技术已经十分成熟,广泛应用于各种大规模的系统中。

8.1.2  Hibernate的概念

Hibernate是一种ORM框架,全称Object-Relative Database-Mapping,在Java对象与关系数据库之间建立某种映射,以实现直接存取Java 对象(一般为实体类)。在现有的ORM框架中,最成功的要数HibernateHibernate使用简单、功能强大、对市面上所有的数据库都有良好的支持。Hibernate能直接操作POJO,并且是一种轻量级的框架,不依赖于任何容器,无论是Tomcat还是JBossResinWebLogicWebSphere下都可以使用。

Hibernate的官方网站为:http://www.hibernate.orgHibernate最早是做Java语言的ORM框架起家的,现在也开始为其他语言提供ORM支持,例如.net版本的NHibernate等。

8.2  MyEclipse中添加Hibernatejar

早期的Hibernate使用xml配置实体类与数据库间的映射。现在,SUN推出了JPAJava Persistence API),目的在于规范了各种ORM的接口,Hibernate也可以使用JPA的注解(Annotation)来配置映射。本节先以Java注解的方式讲解Hibernate的使用。

使用MyEclipse新建Web Project,取名为first_hibernate,选择Java EE5.0规范。可以把从官方下载hibernatejar添加到项目中使用hibernate,也可以使用MyEclipse集成的Hibernate。使用MyEclipse集成的Hibernate步骤为:

1)右击工程名,在弹出的对话框中选择“MyEclipse”选项,如图8.1所示。

Hibernate基础(上)<转载>

8.1  添加Hibernatejar

2)在MyEclipse选项中选择“Add Hibernate Capabilities”选项。弹出如图8.2所示的对话框。

 

Hibernate基础(上)<转载>

8.2  选择Hibenate版本

3)在图8.2所示的对话框中选择Hibernate的版本以及把Hibernatejar包拷贝到/WebRoot/WEB-INF/lib目录下,单击“Next”按钮以后,进入图8.3所示的对话框。

Hibernate基础(上)<转载>

8.3  选择Hibernate的配置

4)在图8.3所示的对话框中选择好Hibernate的配置以后,单击“Next”按钮,进入图8.4所示的对话框。

Hibernate基础(上)<转载>

8.4  配置Hibernate连接MySQL数据库

5)在图8.4所示的对话框中设置MySQL的数据源,选择MySQL数据库驱动,输入连接数据的用户名和密码,然后选择MySQL数据库。单击“Next”按钮进入图8.5所示的对话框。

Hibernate基础(上)<转载>

8.6  配置Hibernate工厂类的位置

6)在图8.6的对话框中,选择Hibernate工厂类的包,选择Java 5规范,然后单击“Finish”按钮。这样就完成了Hibernate的配置。

配置完成以后,MyEclipse会添加标准格式的Hibernate配置文件hibernate.cfg.xml,将Hibernate 3jar包导入项目中,并生成一个Hibernate工具类HibernateSessionFactory

说明:某些版本的MyEclipse自带的Hibernatejar有问题。如果出现错误,读者需要从Hibernate官方网站下载官方的Hibernate库,添加到classpath中,并把MyEclipseHibernate库从项目中去掉

8.3  Java程序中使用Hibernate

8.2节中介绍了如何在MyEclipse中添加Hibernatejar包,这一节将介绍如何在MyEclipse中编写一个简单的Hibernate例子。这一节的例子源代码在光盘第8\8-3的工程hibernate_demo

8.3.1  创建Web工程并搭建框架

MyEclipse中创建一个Web Project,起名为hibernate_demo,选择Java EE5.0规范。把MySQL的驱动jar包拷贝到该工程的WebRoot/WEB-INF/lib目录下,MyEclipse会自动编译jar包。然后按照8.2节中的步骤添加Hibernatejar包。

8.3.2  连接数据库

搭建好Hibernate框架以后,需要把Hibernate和数据库建立连接,在MyEclipse提供了Hibernate自动连接数据库,只需要配置还相关参数就可以了,还可以根据数据库表来自动生成实体类和实体类的数据库映射文件。在MyEclipse中使用Hibernate链接数据库步骤如下:

1)在MyEclipse的菜单栏中“Window”菜单中选择“Show View”选项,然后单击“Other”选项,如图8.7所示。

Hibernate基础(上)<转载>  Hibernate基础(上)<转载>

8.7  展示数据库连接

2)在图8.7右图中的对话框中展开“MyEclipse Enterprise Workbench”,然后选择“DB Broeser”,单击“确定”按钮。MyEclipse中会出现图8.8所示的页面。

Hibernate基础(上)<转载>

8.8  连接数据库的窗口

3)在图8.8所示的页面中右击“MyEclipse Derby”,然后选择“New”选项。弹出图8.9所示的对话框。

Hibernate基础(上)<转载>

8.9  配置数据库连接

4)在图8.9所示的对话框中输入数据库驱动、数据库连接地址,连接数据库的用户名和密码,然后单击“Add Jars”按钮添加MySQL的数据库驱动jar包,单击“Next”按钮进入图8.10所示的对话框。

Hibernate基础(上)<转载>

8.10  选择数据库模式

5)在图8.10所示的对话框中单击“Add”按钮选择要连接的数据库模式,单击“OK”按钮,再单击“Finish”按钮完成数据库连接。

8.3.3  创建数据库表

连接好数据库以后,下一步要做的是使用Hibernate操作数据库,先在数据库中创建一张表,建表SQL语句如下:

-- Table "users" DDL

 

CREATE TABLE users (

  id int(11) NOT NULL,

  name varchar(20) DEFAULT NULL,

  age int(11) DEFAULT NULL,

  tel varchar(20) DEFAULT NULL,

  address varchar(50) DEFAULT NULL,

  PRIMARY KEY (id)

ENGINE=InnoDB DEFAULT CHARSET=gb2312;

这张表中有5个字段,字段idint类型,把id设置成主键,不能为空,其他的字段可以为空。表格的编码方式的gb2312

8.3.4  通过表格自动生成实体类和映射文件

MyEclipse开发工具有个好处是:它可以根据数据库表来自动生成实体类和映射文件。在连接好数据库以后,根据数据库表自动生成实体类和映射文件的步骤如下:

1)在“DB Browser”视图中右击“com.mysql.jdbc.Driver”,然后单击“Open connection”,如图8.11所示。

Hibernate基础(上)<转载>

8.11  打开数据库连接

2)打开数据库连接以后,展开“com.mysql.jdbc.Driver”数据库连接,如图8.12所示。

Hibernate基础(上)<转载>

8.12  选择数据库表

3)在图8.12所示的对话框中,右击需要生成实体类和映射文件的表,选择“Hibernate Reverse Engineering”,弹出图8.13所示的对话框。

Hibernate基础(上)<转载>

8.13  选择实体类的路径

 4)在图8.13所示的对话框中,选择生成工程,以及工程下的包路径,选择生成映射文件和实体类,然后单击“Next”按钮进入对话框,继续单击“Next”按钮进入到图8.14所示的对话框。

Hibernate基础(上)<转载>

8.13  配置数据库对应的实体类

5)在图8.13中选中表格,然后输入表格对应的实体类,这里要包括类所在的包和类名。单击“Finish”按钮,这样就完成了实体类和配置文件的生成。

通过上面的步骤,根据数据库表的字段,自动生成了实体类和映射文件按,实体类Users的代码如下(源代码见光盘第8\8-3):

package com.cn.vo;

public class Users implements java.io.Serializable {

// Fields

private Integer id;

private String name;

private Integer age;

private String tel;

private String address;

// Constructors

public Users() {

}

public Users(Integer id) {

this.id id;

}

public Users(Integer id, String name, Integer age, String tel,

String address) {

this.id id;

this.name name;

this.age age;

this.tel tel;

this.address address;

}

// Property accessors

//这里省略了settergetter方法

}

实体类和数据库表通过映射文件联系。在映射文件中,会把实体类的属性名和数据库的字段名一一对应。生成的映射文件UsersVo.hbm.xml代码如下(源代码见光盘第8\8-3):

package com.cn.vo;

 

 

 

public class Users implements java.io.Serializable {

 

// Fields

private Integer id;

private String name;

private Integer age;

private String tel;

private String address;

// Constructors

 

public Users() {

}

 

public Users(Integer id) {

this.id id;

}

 

public Users(Integer id, String name, Integer age, String tel,

String address) {

this.id id;

this.name name;

this.age age;

this.tel tel;

this.address address;

}

 

// Property accessors

//这里省略了settergetter方法

}

实体类和数据库表通过映射文件联系。在映射文件中,会把实体类的属性名和数据库的字段名一一对应。生成的映射文件UsersVo.hbm.xml代码如下(源代码见光盘第8\8-3):

<?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">

<!-- 

    Mapping file autogenerated by MyEclipse Persistence Tools

-->

<hibernate-mapping>

    <class name="com.cn.vo.Users" table="users" catalog="bank">

        <id name="id" type="java.lang.Integer">

            <column name="id" />

            <generator class="assigned" />

        </id>

        <property name="name" type="java.lang.String">

            <column name="name" length="20" />

        </property>

        <property name="age" type="java.lang.Integer">

            <column name="age" />

        </property>

        <property name="tel" type="java.lang.String">

            <column name="tel" length="20" />

        </property>

        <property name="address" type="java.lang.String">

            <column name="address" length="50" />

        </property>

    </class>

</hibernate-mapping>

8.2.5  编辑Hibernate的配置文件

MyEclipse向导会生成一个hibernate.cfg.xml。这是Hibernate默认的配置文件,配置有JDBC连接信息以及Hibernate的一些参数等。在使用的时候需要手动去编辑一些信息。编辑后的hibernate.cfg.xml文件代码为(源代码见光盘第8\8-3):

<?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">

 

<!-- Generated by MyEclipse Hibernate Tools.                   -->

<hibernate-configuration>

 

    <session-factory>

     <!-- JDBC 配置代码 包括数据库驱动,用户名密码还有连接地址 -->

        <property name="connection.username">root</property>

        <property name="connection.url">jdbc:mysql://localhost:3306/bank?characterEncoding=gb2312</property>

        <property name="connection.password">root</property>

        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>        

        <!-- 声明使用的SQL语句是MySQL数据库的SQL语句 -->

        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>

        <!-- 在控制台打印执行的SQL语句 -->

<property name="show_sql">true</property>

 

        <!-- 指定Hibernate启动的时候自动更新表,如果不存在则创建 -->

<property name="hbm2ddl.auto">update</property>

        <!使用线程, 防止遇到异常 -->

<property name="current_session_context_class">thread</property>

 

<!-- 指定为Hibernate的映射文件 -->

<mapping resource="com/cn/vo/Users.hbm.xml" />

    </session-factory>

 

</hibernate-configuration>

其中,dialect表示使用MySQLSQL语句(各数据库的SQL会有轻微的区别,因此用dialect加以区别)。show_sql表示在控制台显示生成的SQL语句,hbm2ddl.auto表示自动生成数据库语句。current_session_context_class表示为每个线程生成一个Session。参数dialectcurrent_session_context_class是必须的。

最后<mapping resource =”” />告诉Hibernate,实体类对应的映射文件。Hibernate将管理Users映射文件与对应的数据库表和实体类。

hbm2ddl.auto不是必须的,如果不设置hbm2ddl属性,需要用SQL初始化数据库表结构。hbm2ddl.auto取值与作用如下:

create:加载SessionFactory时创建表结构。如果原表结构存在,则先删除原表结构。如果classpath根目录有import.sql文件,创建表结构后会执行import.sql里的SQL语句。

create-drop:加载SessionFactory时创建表结构,卸载SessionFactory时(一般为程序退出时)删除表结构。如果classpath根目录有import.sql文件,创建表结构后会执行import.sql里的SQL语句。

update:加载SessionFactory时检查表结构,如果与Entity不一致,则更新表结构。

validate:加载SessionFactory时检查表结构。

8.2.6  编辑HibernateSessionFactory

在使用MyEclipse想到自动导入Hibernatejar包的时候,生成了HibernateSessionFactory类,这个类是原来初始化Hibernate的,一个有用程序如果只连接一个数据库,那么有一个HibernateSessionFactory类就足够了,关于HibernateSessionFactory的详细语法在以后的章节中会有介绍,这里不做详细介绍了。编辑后的HibernateSessionFactory类的代码如下:

package com.cn.hibernate;

import org.hibernate.*;

import org.hibernate.cfg.Configuration;

public class HibernateSessionFactory {

 

    private static String CONFIG_FILE_LOCATION "/hibernate.cfg.xml";

private static final ThreadLocal<Session> threadLocal new ThreadLocal<Session>();

    private  static Configuration configuration new Configuration();

    private static org.hibernate.SessionFactory sessionFactory;

    private static String configFile CONFIG_FILE_LOCATION;

 

static {//静态代码块,用于初始化Hibernate

     try {

configuration.configure(configFile);//加载配置文件hibernate.cfg.xml 

sessionFactory configuration.buildSessionFactory();

catch (Exception e) {//抛出异常后 输出异常信息

System.err

.println("%%%% Error Creating SessionFactory %%%%");

e.printStackTrace();

}

    }

    private HibernateSessionFactory() {

    }

public static Session getSession() throws HibernateException {

        Session session (Session) threadLocal.get();

 

if (session == null || !session.isOpen()) {//判断session为空或者已经关闭

//创建或者打开session

session (sessionFactory != null) sessionFactory.openSession()

null;

threadLocal.set(session);

}

        return session;

    }

}

8.2.6  使用Hibernate添加数据

HibernateORM框架,与数据库打交道,它即可用于普通的Java程序,又可以用于Java Web程序。Hibernate保存数据时,先通过HibernateSessionFactory开启一个Session会话(作用相当于JDBC中的Connection),然后开启一个Transaction事务(相当于跟JDBC中的事务),然后执行保存代码,然后提交事务、关闭Session。因为Hibernate所做的工作与JDBC一样,因此基本操作流程也一样。

Hibernate保存实体类对象时十分简单,一句代码session.persist(objest)即可。例如,在普通的Java程序中使用Hibernate,代码如下(这里省略了import的内容,源代码见光盘第8\8-3)

package com.cn.test;

public class TestHibernate {

public static void main(String[] args) {

//Users对象中添加数据

Users users new Users();

users.setId(12354);

users.setAddress("北京海淀");

users.setName("王五");

users.setAge(22);

users.setTel("010-12345678");

//Users对象中添加数据

Users users2 new Users();

users2.setId(12154);

users2.setAddress("北京海淀");

users2.setName("孙钱");

users2.setAge(23);

users2.setTel("010-12345878");

//Users对象中添加数据

Users users3 =new Users();

users3.setId(12164);

users3.setAddress("北京海淀");

users3.setName("孙李");

users3.setAge(24);

users3.setTel("010-12345578");

 

Session session  // 开启一个 Hibernate 会话

HibernateSessionFactory.getSession();

Transaction trans session.beginTransaction(); // 开启一个事务

session.persist(users);

session.persist(users2);

session.persist(users3);

trans.commit();//提交事务

 

// 输出添加的数据结果

StringBuffer result new StringBuffer();

result.append("添加成功!往数据库中添加了如下数据:\n");

result.append("编号    "+"地址                "+"姓名        "

+"年龄    "+"联系电话\t\r\n\r\n");

result.append(users.getId()+"    ");

result.append(users.getAddress()+"    ");

result.append(users.getName()+"    ");

result.append(users.getAge()+"    ");

result.append(users.getTel()+"\t\n\r");

result.append(users2.getId()+"    ");

result.append(users2.getAddress()+"    ");

result.append(users2.getName()+"    ");

result.append(users2.getAge()+"    ");

result.append(users2.getTel()+"\t\n\r");

result.append(users3.getId()+"    ");

result.append(users3.getAddress()+"    ");

result.append(users3.getName()+"    ");

result.append(users3.getAge()+"    ");

result.append(users3.getTel()+"\t\n\r");

session.close();//关闭会话

//  用 Swing 显示查询结果

JOptionPane.getRootFrame().setFont(new Font("Arial", Font.BOLD, 14));

JOptionPane.showMessageDialog(null, result.toString());

}

}

代码演示了用Hibernate插入数据库与查询数据库。先session.persist()方法插入3条数据,并用Swing输出添加的数据。Swing显示的效果如图8.14所示。

Hibernate基础(上)<转载>

8.14  显示添加的数据

控制台会打印出所有的SQL语句,本例子中是执行了插入数据的SQL语句,插入了3挑数据,所以有3SQL语句执行了,在控制台中输出的SQL语句信息如下:

Hibernate: insert into bank.users (name, age, tel, address, id) values (?, ?, ?, ?, ?)

Hibernate: insert into bank.users (name, age, tel, address, id) values (?, ?, ?, ?, ?)

Hibernate: insert into bank.users (name, age, tel, address, id) values (?, ?, ?, ?, ?)

说明:可以使用Hibernate来自动创建数据库表。过程是通过在MyEclipse中配置还实体类和映射文件以后,根据实体类和映射文件来创建数据库表。这种方法对初学者来说,难度很大。在这里就不做介绍了。

8.4  Java Web程序中使用Hibernate

Java Web中使用Hibernate与普通Java程序一样。这一小节中将使用SerlvetJSP结合Hibernate实现数据库表的增删改查操作。

Web程序中,hibernate.cfg.xml中必须配置current_session_context_class参数。如果是使用JBoss等内置Hibernate的容器,参数值要配置为jta,其他容器如Tomcat等需要配置为thread

这一节的所有例子都在Web工程hibernate_web中,所有例子源代码在光盘第8\8-4\hibernate_web中。

8.4.1  创建工程并搭建Hibernate框架

MyEclipse中创建一个Web工程,工程名为hibernate_web,把MySQL数据库驱动包和JSTL需要的jar包拷贝到WebRoot/WEB-INF/lib目录下。然后使用MyEclipse向导把Hiibernatejar包导到工程中。搭建Hibernate框架再前面的章节中已经做作了介绍,这里就不做详细介绍了。然后使用Hibernate链接数据库,并通过数据库表自动生成数据库对应的实体类和实体类映射文件。这一节中使用的数据库表是users表,该表在8.3节的例子中创建的。

数据库表users对应的实体类中是自动生成的,它包括数据库表字段对应的变量名,以及这些变量的settergetter方法,UsersVo类的代码如下(这里省略了settergetter方法,源代码见光盘第8\8-4):

package com.cn.vo;

 

public class UsersVo implements java.io.Serializable {

// Fields

private Integer id;

private String name;

private Integer age;

private String tel;

//这里省略了settergetter方法

}

实体类对应的映射文件UsersVo.hbm.xml中,包含了实体类的变量名以及变量数据类型,变量名对应的数据库字段名,映射文件UsersVo.hbm.xml的代码如下(源代码见光盘第8\8-4):

<?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">

<!-- 

    Mapping file autogenerated by MyEclipse Persistence Tools

-->

<hibernate-mapping>

    <class name="com.cn.vo.UsersVo" table="users" catalog="bank" lazy="false">

        <id name="id" type="java.lang.Integer">

            <column name="id" />

            <generator class="assigned" />

        </id>

        <property name="name" type="java.lang.String">

            <column name="name" length="20" />

        </property>

        <property name="age" type="java.lang.Integer">

            <column name="age" />

        </property>

        <property name="tel" type="java.lang.String">

            <column name="tel" length="20" />

        </property>

        <property name="address" type="java.lang.String">

            <column name="address" length="50" />

        </property>

    </class>

</hibernate-mapping>

Hibernate的配置文件hibernate.cfg.xml,需要编写数据库连接、和MySQL方言,为了方便测试,

设置在MyEclipse的控制台中输出SQL语句,同时还需要把映射文件UsersVo.hbm.xml配置到配置文件hibernate.cfg.xml中,代码如下(源代码见光盘第8\8-4):

<?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">

 

<!-- Generated by MyEclipse Hibernate Tools.                   -->

<hibernate-configuration>

 

<session-factory>

     <!-- JDBC 配置代码 包括数据库驱动,用户名密码还有连接地址 -->

        <property name="connection.username">root</property>

        <property name="connection.url">jdbc:mysql://localhost:3306/bank?characterEncoding=gb2312</property>

        <property name="connection.password">root</property>

        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>

        

        <!-- 声明使用的SQL语句是MySQL数据库的SQL语句(MySQL方言) -->

        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>

        

        <!-- 在控制台打印执行的SQL语句 -->

<property name="show_sql">true</property>

 

        <!-- 指定Hibernate启动的时候自动更新表,如果不存在则创建 -->

<property name="hbm2ddl.auto">update</property>

       

        <!-- 使用线程,防止遇到异常 -->

<property name="current_session_context_class">thread</property>

 

<!-- 指定Hibernate的映射文件 -->

<mapping resource="com/cn/vo/UsersVo.hbm.xml"/>

    </session-factory>

 

</hibernate-configuration>

初始化Hibernate需要用到HibernateSessionFactory,该类中初始化Hibernate,并且提供了开启和关闭Session的方法,该类是在使用MyEclipse向导自动生成的,可以根据需要自行修改该类中的方法,HibernateSessionFactory类的代码如下(源代码见光盘第8\8-4):

package com.cn.factory;

import org.hibernate.*;

import org.hibernate.cfg.Configuration;

public class HibernateSessionFactory {

 

    private static String CONFIG_FILE_LOCATION "/hibernate.cfg.xml";

private static final ThreadLocal<Session> threadLocal new ThreadLocal<Session>();

    private  static Configuration configuration new Configuration();

    private static org.hibernate.SessionFactory sessionFactory;

    private static String configFile CONFIG_FILE_LOCATION;

 

static {

     try {

configuration.configure(configFile);

sessionFactory configuration.buildSessionFactory();

catch (Exception e) {

System.err

.println("%%%% Error Creating SessionFactory %%%%");

e.printStackTrace();

}

    }

    private HibernateSessionFactory() {

    }

    public static Session getSession() throws HibernateException {

        Session session (Session) threadLocal.get();

 

if (session == null || !session.isOpen()) {

if (sessionFactory == null) {

rebuildSessionFactory();

}

session (sessionFactory != null) sessionFactory.openSession()

null;

threadLocal.set(session);

}

        return session;

    }

public static void rebuildSessionFactory() {

try {

configuration.configure(configFile);

sessionFactory configuration.buildSessionFactory();

catch (Exception e) {

System.err

.println("%%%% Error Creating SessionFactory %%%%");

e.printStackTrace();

}

}

    public static void closeSession() throws HibernateException {

        Session session (Session) threadLocal.get();

        threadLocal.set(null);

 

        if (session != null) {

            session.close();

        }

    }

public static org.hibernate.SessionFactory getSessionFactory() {

return sessionFactory;

}

public static void setConfigFile(String configFile) {

HibernateSessionFactory.configFile configFile;

sessionFactory null;

}

public static Configuration getConfiguration() {

return configuration;

}

}

Hibernate基础(下)


标签: 

hibernate

 

jsp

 

servlet

 

it

分类: Hibernate

由于文字字数限制,因此hibernate基础分开成上、下篇。接上一篇《Hibernate基础(上)》博文,

8.4.2  编写数据持久层

为了是程序结构清晰,数据持久层独立出来放在DAO层中,在DAO层的类中编写数据的增删改查方法,通过这些方法去操作数据。在使用时,只需要根据实际情况来调用DAO层中的方法就可以了。这个例子中DAO层只有一个类,类名为HibernateDaoHibernateDao类的代码如下(这里省略了import的内容,源代码见光盘第8\8-4):

package com.cn.dao;

public class HibernateDao {

public void add(UsersVo usersVo) { // 添加数据的方法

Session session = // 调用HibernateSessionFactory的会话

HibernateSessionFactory.getSession();

try {

session.beginTransaction(); // 开启事务

session.persist(usersVo); // 将对象添加到数据库

session.getTransaction().commit(); // 提交事务

catch (Exception e) {

session.getTransaction().rollback();// 回滚事务

finally {

session.close(); // 关闭session

}

}

public void modifyUsers(UsersVo usersVo) { // 修改数据的方法

Session session HibernateSessionFactory.getSession();

try {

session.beginTransaction(); // 开启事务

session.update(usersVo);  // 修改数据

session.getTransaction().commit(); // 提交事务

catch (Exception e) {

session.getTransaction().rollback();// 回滚事务

finally {

session.close(); // 关闭session

}

}

// 从数据库中删除数据

public void delete(int id) {

Session session HibernateSessionFactory.getSession();

try {

session.beginTransaction(); // 开启事务

UsersVo users (UsersVo) session.get(UsersVo.class, id);

session.delete(users); // 删除删除数据行

session.getTransaction().commit(); // 提交事务

catch (Exception e) {

session.getTransaction().rollback(); //回滚事务

finally {

session.close(); // 关闭session

}

}

@SuppressWarnings("unchecked") // 根据ID查找数据

public UsersVo queryUsersById(int id) {

Session session HibernateSessionFactory.getSession();

UsersVo users (UsersVo) session.get(UsersVo.class, id);

return users;

}

 

@SuppressWarnings("unchecked")

public List showlist(String hql) { // 查找多挑数据

Session session  HibernateSessionFactory.getSession();

try {

session.beginTransaction(); // 开启事务

return session.createQuery(hql).list(); // 使用hql查询结果,返回List对象

finally {

session.getTransaction().commit(); // 提交事务

session.close(); // 关闭session

}

}

}

该类中接受UsersVo类。Hibernate能够判断实体类的类型,决定操作哪个数据表。HibernateDao封装了最基本的CRUD操作。

8.4.3  查询所有数据

由于在DAO层已经把增删改查的方法都封装了,查询全部数据的时候,只需要在Servlet中调用DAO层中的查询全部的方法即可,把查询到的数据放在List集合中,再把List集合放入request对象中,在页面横纵把数据遍历输出。查询全部数据的Servlet——ShowListServlet类代码如下(这里省略了import内容,源代码见光盘第8\8-4):

package com.cn.servlet;

public class ShowListServlet extends HttpServlet {

 

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

 

response.setContentType("text/html");

request.setCharacterEncoding("gb2312"); // 设置request编码

response.setCharacterEncoding("gb2312");// 设置response编码

PrintWriter out response.getWriter();

this.doPost(request, response);//调用doPost方法

out.flush();

out.close();

}

 

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

 

response.setContentType("text/html");

request.setCharacterEncoding("gb2312"); // 设置request编码

response.setCharacterEncoding("gb2312");// 设置response编码

PrintWriter out response.getWriter();

 

HibernateDao hibernateDao new HibernateDao();

List usersList new ArrayList();

//使用HQL语句查询全部数据,并放入List集合中

usersList hibernateDao.showlist("FROM UsersVo");  request.setAttribute("usersList",usersList );

request.getRequestDispatcher("/showList.jsp").forward(request, response);// 跳转到JSP

 

out.flush();

out.close();

}

}

查询结果将被转发到showList.jsp显示。查询结果为List对象。JSP中遍历List里的所有UsersVo对象并输出showList.jsp代码如下(源代码见光盘第8\8-4

 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值