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

一、实验步骤

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;
	}
	
}

 

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
 4 <hibernate-mapping package="sise.ye.domain">
 5  <!-- name指定持久化类的类名,table指定数据表的表名 -->
 6  <class name="Student" table="student">
 7   <!-- 将Student类中的id属性映射为数据表Student中的主键id -->
 8   <id name="id" type="int" column="id">
 9     <generator class="increment"></generator>
10   </id>
11   <!-- 映射Student类的sno属性 -->
12   <property name="sno" type="java.lang.String" column="sno" length="20"></property>
13   <!-- 映射Student类的name属性 -->
14   <property name="name" type="java.lang.String" column="name" length="20"></property>
15   <!-- 映射Student类的sex属性 -->
16   <property name="sex" type="character" column="sex" length="2"></property>
17   <!-- 映射Person类的age属性 -->
18   <property name="age" type="int" column="age"></property>
19  </class>
20 </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

 

 

 

 

 

 

 

 

 

 

 

posted @ 2014-04-20 16:38  SeatonYexd  阅读(870)  评论(0编辑  收藏  举报