Hibernate框架簡單項目介紹

Hibernate是一個開放源代碼的對象關係映射框架,它對jdbc進行輕量級的對象封裝。不僅提供了從Java類到數據表之間的映射,也提供了查詢和事務機制。相對於使用jdbc和sql操作數據庫,Hibernate大大減少了操作數據庫的工作量。

(一)搭建環境 

  • 導入Hibernate核心jar包及相關的其他jar包(包括數據庫驅動jar包)
  • 安裝Hibernate Tools

(二)例題

eg:將“人員”信息保存到Mysql數據庫中。 人員信息有:id,name,sex, age.

1、分析設計:

建立Java工程,利用Hibernate實現數據庫的連接並向數據庫中添加記錄。

2、實現

  • 建立Java工程,並在該工程的根目錄下,創建lib目錄
  • 將Hibernate核心jar包和MySQL驅動程序jar包複製到lib下
  • 建立對象模型Person類
  • 建立映射文件Person.hbm.xml

注意:映射文件要求與持久化實體類在同一包內。命名爲持久化類類名.hbm.xml。通常一個持久化對象(PO)類對應一個映射文件。該文件給出了“實體類”與“數據庫表”,以及“類屬性”與“表字段”之間的映射關係。

※ 右擊Person.java,在彈出的快捷菜單中選擇New——Other——Hibernate——Hibernate XML Mapping file(hbm.xml)命令,可以快速生成映射文件。

  • 建立數據庫配置文件hibernate.cfg.xml

該文件建立在src目錄下

※ 右擊src選項,在彈出的快捷菜單中選擇New——Other——Hibernate——Hibernate Configuration File(cfg.xml)命令,可以快速生成配置文件框架。

  • 設計主類,完成向數據庫中保存記錄的功能。
  • 運行程序。當運行結束後,自動創建數據表,並在表內添加了一條記錄。當再運行程序時,可繼續向數據庫表內添加記錄。

3、結構圖

 

4、代碼

(1)hibernate.cfg.xml
<?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>
		<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="connection.url">jdbc:mysql:///ch06_db_01</property>
		<property name="connection.username">root</property>
		<property name="connection.password">123456</property>
		<property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
		<property name="hbm2ddl.auto">update</property>
		<property name="show_sql">true</property>
		<property name="format_sql">true</property>
		<mapping resource="com/edu/entity/Person.hbm.xml"/>
	</session-factory>
</hibernate-configuration>

(2)Person.java
package com.edu.entity;

public class Person  {
	private Integer id;
	private String name;
	private String sex;
	private int age;
	
	public Person() {}

	public Person(String name, String sex, int age) {
		super();
		this.name = name;
		this.sex = sex;
		this.age = age;
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

}

(3)Person.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="com.edu.entity.Person" table="PERSON">
        <id name="id" type="java.lang.Integer">
            <column name="ID" />
            <generator class="native" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="NAME" />
        </property>
        <property name="sex" type="java.lang.String">
            <column name="SEX" />
        </property>
        <property name="age" type="int">
            <column name="AGE" />
        </property>
    </class>
</hibernate-mapping>

(4)InsertMain.java
package com.edu.entity;

import java.util.Scanner;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;

public class InsertMain {

	public static void main(String[] args) {
		Scanner cin=new Scanner(System.in);
		SessionFactory sessionFactory = null;
		Session session = null;
		Transaction transaction = null;
		Configuration configuration = new Configuration().configure();
		ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
				.applySettings(configuration.getProperties()).build();
		sessionFactory = configuration.buildSessionFactory(serviceRegistry);
		session = sessionFactory.openSession();
		System.out.println("請依次輸入:姓名   性別  年齡:");
		String name=cin.next();
		String sex=cin.next();
		int age=cin.nextInt();
		Person person = new Person(name,sex,age);		
		transaction = session.beginTransaction();		
		session.save(person);
		transaction.commit();
		session.close();
		sessionFactory.close();
		cin.close();
	}

}

 (三)Hibernate操作輔助類的設計

1、HibernateUtil類的設計

該類主要提供兩個方法:獲得Session對象和釋放Session對象

package com.edu.db_util;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;

public final class HibernateUtil {
	private static SessionFactory sessionFactory;
	private static ThreadLocal<Session> session = new ThreadLocal<Session>();

	private HibernateUtil() {
	}

	static {
		// 第一步:讀取Hibernate的配置文件 hibernamte.cfg.xml文件
		Configuration configuration = new Configuration().configure();
		// 第二步:創建服務註冊構建器對象,通過配置對象中加載所有的配置信息
		StandardServiceRegistryBuilder regbulider = new StandardServiceRegistryBuilder()
				.applySettings(configuration.getProperties());
		// 創建註冊服務
		ServiceRegistry serviceRegistry = regbulider.build();
		// 第三步:創建會話工廠
		sessionFactory = configuration.buildSessionFactory(serviceRegistry);

	}

	public static Session getThreadLocalSession() {//獲取Session對象的方法
		Session s = (Session) session.get();
		if (s == null) {
			s = sessionFactory.openSession();
			session.set(s);
		}
		return s;
	}	

	public static void closeSession() {//釋放Session對象的方法
		Session s = (Session) session.get();
		if (s != null) {
			s.close();
			session.set(null);
		}
	}

}

2、創建訪問數據庫的通用接口IBaseDao<T>

主要包含了查詢、插入、刪除和修改等有關的方法。

package com.edu.db_util;

import java.util.List;

public interface IBaseDao<T> {
	public int insert(T o); // 將對象o添加到數據庫內

	public int insertList(List<T> list); // 將對象集合添加到數據庫內

	public int update(T o); // 利用對象o修改當前記錄

	public int deleteList(Class<T> c, int... ids); //利用id的集合,刪除該集合中對應id的記錄。

	public int delete(T o);// 從數據庫中刪除一個記錄o

	public int delete(Class<T> c, int id);// 利用關鍵字id 從數據庫中刪除一個記錄

	public T findById(Class<T> c, int id); // 利用id查找一條記錄

	public T findOne(String hql, String[] param); // 查詢單條記錄

	public List<T> find(String hql, String[] param); // 按條件查找多條記錄

	public List<T> findPage(String hql, String[] param, int page, int size); // 分頁查找所有對象

	public int getCount(String hql, String[] pras);// 返回數據個數

	public List<T> findByFields(String hql, String fields[],String condition); //單字段模糊查找滿足條件的所有對象

}

3、DaoHibernate類——IBaseDao<T>的實現類

package com.edu.db_util;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

import com.edu.db_util.HibernateUtil;

public class DaoHibernate<T> implements IBaseDao<T> {

	@Override
	public int insert(T o) {
		Session s = null;
		Transaction tx = null;
		int result = 0;
		try {
			s = HibernateUtil.getThreadLocalSession();
			tx = s.beginTransaction();
			s.save(o);
			tx.commit();
			result=1;
		} catch (Exception e) {
			if (tx != null) {
				tx.rollback();// 事物回滾
			}
		} finally {
			HibernateUtil.closeSession();
		}		
		return result;
	}

	@Override
	public int insertList(List<T> list) {
		for (T t : list) {
			insert(t);
		}
		return list.size();
	}

	@Override
	public int update(T o) {
		Session s = null;
		int result = 0;
		Transaction tx = null;
		try {
			s = HibernateUtil.getThreadLocalSession();
			tx = s.beginTransaction();
			s.update(o);
			tx.commit();
			result = 1;
		} catch (Exception e) {
			if (tx != null) {
				tx.rollback();// 事物回滾
			}
		} finally {
			HibernateUtil.closeSession();
		}
		return result;
	}

	@Override
	public int deleteList(Class<T> c, int... ids) {
		for (int id : ids) {
			delete(c, id);
		}
		return ids.length;
	}

	@Override
	public int delete(T o) {
		Session s = null;
		Transaction tx = null;
		int result = 0;
		try {
			s = HibernateUtil.getThreadLocalSession();
			tx = s.beginTransaction();
			s.delete(o);
			tx.commit();
			result = 1;
		} catch (Exception e) {
			if (tx != null) {
				tx.rollback();// 事物回滾
			}
		} finally {
			HibernateUtil.closeSession();
		}
		return result;
	}

	@Override
	public int delete(Class<T> c, int id) {
		Session s = null;
		Transaction tx = null;
		int result = 0;
		try {
			s = HibernateUtil.getThreadLocalSession();
			tx = s.beginTransaction();
			s.delete(s.load(c, id));
			tx.commit();
			result = 1;
		} catch (Exception e) {
			if (tx != null) {
				tx.rollback();// 事物回滾
			}
		} finally {
			HibernateUtil.closeSession();
		}
		return result;
	}

	@SuppressWarnings("unchecked")
	@Override
	public T findById(Class<T> c, int id) {
		Session s = null;
		T t = null;
		try {
			s = HibernateUtil.getThreadLocalSession();
			t = (T)s.get(c, id);
		} finally {
			HibernateUtil.closeSession();
		}
		return t;
	}

	@SuppressWarnings("unchecked")
	@Override
	public T findOne(String hql, String[] param) { // 查詢單條記錄
		T t = null;
		Session s = null;
		try {
			s = HibernateUtil.getThreadLocalSession();
			Query query = s.createQuery(hql);
			if (param != null) {
				for (int i = 0; i < param.length; i++) {
					query.setParameter(i, param[i]);
				}				
			}
			t = (T) query.uniqueResult();
		} finally {
			HibernateUtil.closeSession();
		}
		return t;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<T> find(String hql, String[] param) {
		List<T> list = null;
		Session s = null;
		try {
			s = HibernateUtil.getThreadLocalSession();
			Query query = s.createQuery(hql);
			if (param != null) {
				for (int i = 0; i < param.length; i++) {
					query.setParameter(i, param[i]);
				}				
			}
			list = query.list();
		} finally {
			HibernateUtil.closeSession();
		}
		return list;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<T> findPage(String hql, String[] param, int page, int size) { // 分頁查找所有對象
		List<T> list = null;
		Session s = null;
		try {
			s = HibernateUtil.getThreadLocalSession();
			Query query = s.createQuery(hql);
			if (param != null) {
				for (int i = 0; i < param.length; i++) {
					query.setParameter(i, param[i]);
				}
			}
			// 篩選條數
			query.setFirstResult((page - 1) * size);
			query.setMaxResults(size);
			list = query.list();
		} finally {
			HibernateUtil.closeSession();
		}
		return list;
	}

	@Override
	public int getCount(String hql, String[] param) {// 返回數據個數
		int resu = 0;
		Session s = null;
		try {
			s = HibernateUtil.getThreadLocalSession();
			Query q = s.createQuery(hql);
			if (param != null) {
				for (int i = 0; i < param.length; i++) {
					q.setString(i, param[i]);
				}
			}
			resu = Integer.valueOf(q.iterate().next().toString());
		} finally {
			HibernateUtil.closeSession();
		}
		return resu;
	}

	@Override
	//單字段模糊查詢
	public List<T> findByFields(String hql, String fields[], String condition) {
		Session s = null;
		String findhql=hql;
		if(fields!=null && condition!=null && fields.length>0 && !condition.equals("") ){
			findhql =findhql + " where 1=1 and (";
			for(int i=0;i<fields.length-1;++i){			
				findhql +=  fields[i]+" like '%" + condition + "%' or ";				
			}
			findhql += fields[fields.length-1]+" like '%" + condition + "%') ";	
		}	
		try {
			s = HibernateUtil.getThreadLocalSession();		
			 Query query=s.createQuery(findhql);
			 @SuppressWarnings("unchecked")
			List<T> list=query.list();			
			return list;
		} finally {
			HibernateUtil.closeSession();
		}		
	}

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章