您的位置:首页 > 其它

Hibernate学习1之基于持久层框架DAO模式应用

2014-04-20 16:38 423 查看
一、实验步骤

1、建立数据库



2、新建java项目

3、导入Hibernate需要的架包和数据库驱动类库,下载地址:http://download.csdn.net/detail/yy228313/7212241

4、编写Hibernate配置文件Hibernate.cfg.xml,该文件在src目录下

5、编写持久化类,即POJO映射类

6、编写映射文件xxx.hbm.xml,该文件和持久化类在用一个目录下

7、编写一个工具类,用于获取Session实例

8、编写DAO接口

9、使用Hibernate API实现DAO接口

10、编写测试类。

二、原理分析

1.Hibernate简要的体系架构分析:



DataBase:数据库

Hibernate.cfg.xml:Hibernate配置文件,配置数据库的连接信息,如使用的数据库类型、数据库名、密码等等。

XML Mapping:映射文件,将数据库表和持久化类对应起来。

Persistent Objects:持久化类。

2.Hibernate核心API与工作原理



Hibernate.properties:与Hibernate.cfg.xml的作用相同,但一般用Hibernate.cfg.xml。因为在Hibernate.properties中不能配置被映射的类,如果使用Hibernate.properties配置Hibernate,那么需要在源文件中配置。具体请看:http://qinchaoyong.iteye.com/blog/642369

*.hbm.xml:映射文件,跟持久化类保存在同一个包目录下。

工作原理:

a、Hibernate的初始化,创建Configuration对象。将配置文件和映射文件的信息存放到Configuration对象中。

b、创建SessionFactory实例。通过Configuration对象读取到的配置信息创建SessionFactory,即将Configuration对象内的配置信息存入SessionFactory的内存(属性)中。SessionFactory充当数据存储源的代理,并负责创建Session对象。得到SessionFoctory对象后,Configuration对象的使命就结束了

c、创建Session实例,创建数库连接。Session通过SessionFactory打开,创建一个Session对象就相当于数据库建立了一个新的连接。Session对象用来操作实体对象,并把这些操作转换成对应数据库中数据的增加、删除、查询、修改操作。

d、创建Transaction实例,开始一个事务Transaction用于事务管理,一个Transaction对象对应的事务可以包含多个操作。在使用Hibernate进行增加、删除、修改操作室必须先创建Transaction对像。

e、利用Session的方法进行持久化操作,将实体对象持久化到数据库中。

f、提交操作结果并结束事务。对实体对象的持久化操作结束后,必须提交事物。

g、关闭Session,与数据库断开连接。

三、代码分析:

1.Hibernate配置文件:hibernate.cfg.xml

<?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">
<!-- Generated by MyEclipse Hibernate Tools.                   -->
<hibernate-configuration>

<session-factory>
<!-- 数据库连接设置 -->
<!-- 配置数据库JDBC驱动 -->
<property name="hibernate.connection.driver_class">
com.mysql.jdbc.Driver</property>
<!-- 配置数据库连接URL -->
<property name="hibernate.connection.url">
<![CDATA[jdbc:mysql://localhost:3306/testHibernate?useUnicode=true&characterEncoding=utf8]]>
</property>
<!-- 配置数据库用户名 -->
<property name="hibernate.connection.username">
root</property>
<!-- 配置数据库密码 -->
<property name="hibernate.connection.password">
1</property>
<!-- 配置JDBC内置连接池 -->
<property name="connection.pool_size">1</property>
<!-- 配置数据库方言 -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 配置session的运行环境,在web中使用jta,在java application中使用thread -->
<property name="current_session_context_class">thread</property>
<!-- 输出运行时生成的SQL语句 ps:在控制台显示 -->
<property name="show_sql">true</property>
<!-- 列出所有的映射文件 -->
<mapping resource="sise/ye/domain/Student.hbm.xml"/>
</session-factory>

</hibernate-configuration>


hibernate-configuration为跟元素,session-factory为其子元素。

2.持久化类Student.java与映射文件Student.hbm.xml

package sise.ye.domain;
/*
* 项目名称:java-7
* 包名:sise.ye.domain
* 类名:Student
* 创建人:叶晓东
* 创建时间:2014.4.11
* 描述:持久化类Persion
* 备注:
* @version 1.0
*/
public class Student {
private int id;
private String sno;
private String name;
private char sex;
private int age;
//======set/get=====
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getSno() {
return sno;
}
public void setSno(String sno) {
this.sno = sno;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}

}


 

<?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 package="sise.ye.domain">
<!-- name指定持久化类的类名,table指定数据表的表名 -->
<class name="Student" table="student">
<!-- 将Student类中的id属性映射为数据表Student中的主键id -->
<id name="id" type="int" column="id">
<generator class="increment"></generator>
</id>
<!-- 映射Student类的sno属性 -->
<property name="sno" type="java.lang.String" column="sno" length="20"></property>
<!-- 映射Student类的name属性 -->
<property name="name" type="java.lang.String" column="name" length="20"></property>
<!-- 映射Student类的sex属性 -->
<property name="sex" type="character" column="sex" length="2"></property>
<!-- 映射Person类的age属性 -->
<property name="age" type="int" column="age"></property>
</class>
</hibernate-mapping>


第一行:说明使用的版本号、编码。

<hibernate-mapping>是根元素,属性package声明持久化类所在的包。

<class>设置类-表之间的映射,属性name对应着持久化类的类名,table对应着数据库中的表名。

<id>设置的主键映射,其他非主键的映射使用property。

generator说明了主键生成方式,increment代表主键按数值顺序递增,native代表自行判断。

name对应着持久化类的属性,type数据类型,column对应着表的字段名。

<one-to-one> 、<many-to-one> 、<many-to-many> :设置关联映射

3.工具类HibernateUtil

package sise.ye.util;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;

/*
* 项目名称:java-7
* 包名:sise.ye.util
* 类名:HibernateUtil
* 创建人:叶晓东
* 创建时间:2014.4.11
* 描述:工具类
* 备注:
* @version 1.0
*/
public class HibernateUtil {
private static ServiceRegistry serviceRegistry;//服务注册
private static SessionFactory sessionFactory;//会话工厂
//==========默认的构造方法=======
private HibernateUtil(){}
static {
Configuration cfg=new Configuration().configure();//获取配置信息
serviceRegistry=new ServiceRegistryBuilder().applySettings(
cfg.getProperties()).build();
sessionFactory=cfg.buildSessionFactory(serviceRegistry);
}
public static Session getSession(){
Session session=sessionFactory.getCurrentSession();
return session;
}
}


4.接口和接口实现类

package sise.ye.dao;

import sise.ye.domain.Student;
/*
* 项目名称:java-7
* 包名:sise.ye.dao
* 类名:HibernateDao
* 创建人:叶晓东
* 创建时间:2014.4.11
* 描述:接口
* 备注:
* @version 1.0
*/
public interface HibernateDao {
public void addStudent(Student student);
public void updateStudent(Student student);
public void deleteStudent(Student student);
public Student getStudentById(int Id);
}


package sise.ye.dao.impl;
/*
* 项目名称:java-7
* 包名:sise.ye.dao.impl
* 类名:HibernateDaoImpl
* 创建人:叶晓东
* 创建时间:2014.4.11
* 描述:接口的实现类
* 备注:
* @version 1.0
*/
import org.hibernate.Session;
import org.hibernate.Transaction;

import sise.ye.dao.HibernateDao;
import sise.ye.domain.Student;
import sise.ye.util.HibernateUtil;

public class HibernateDaoImpl implements HibernateDao{
//=======添加=======
public void addStudent(Student student){
Session session=HibernateUtil.getSession();
Transaction tx=session.beginTransaction();
try{
session.persist(student);//保存student
tx.commit();
}catch(Exception e){
if(null!=tx) tx.rollback();
e.printStackTrace();
}
}
//=======删除=========
public void deleteStudent(Student student){
Session session=HibernateUtil.getSession();
Transaction tx=session.beginTransaction();
try{
session.delete(student);
tx.commit();
}catch(Exception e){
if(null!=tx) tx.rollback();
e.printStackTrace();
}
}
//========查找=========
public Student getStudentById(int id){
Session session=HibernateUtil.getSession();
Transaction tx=session.beginTransaction();
Student student=(Student)session.get(Student.class, id);
tx.commit();
return student;
}
///========更新=========
public void updateStudent(Student student){
Session session=HibernateUtil.getSession();
Transaction tx=session.beginTransaction();
try{
session.update(student);
tx.commit();
}catch(Exception e){
if(tx!=null) tx.rollback();
e.printStackTrace();
}
}
}


代码下载:http://download.csdn.net/detail/yy228313/7222661
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: