Hibernate的手動基本配置和DAO類增刪改查方法的封裝

使用所有的框架都一樣,導jar包和配置相應的文件,以下就是hibernate手動配置的代碼。(熟練之後可以利用MyEclipse的自帶工具直接進行框架的搭建)

一、導入hibernate的基本包

二、文件的配置(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">

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

    <session-factory>
        <property name="dialect">org.hibernate.dialect.Oracle9Dialect</property>
        <property name="connection.url">jdbc:oracle:thin:@127.0.0.1:1521:ORCL</property>
        <property name="connection.username">sa</property>
        <property name="connection.password">sa</property>
        <property name="connection.driver_class">oracle.jdbc.OracleDriver</property>
        <property name="myeclipse.connection.profile">ora</property>
    
    	<mapping resource="com/bean/Teacher.hbm.xml"/>
    	<mapping resource="com/bean/ClassInfo.hbm.xml"/>
    	<mapping resource="com/bean/Student.hbm.xml"/>
    </session-factory>
    

</hibernate-configuration>

三、項目所有包文件截圖

四、配置對應bean 的xml映射文件(com.bean報下)

   1.教師bean類

package com.bean;

import java.math.BigDecimal;

public class Teacher {

	private BigDecimal tid;
	private String tname;
	private BigDecimal tage;
	public BigDecimal getTid() {
		return tid;
	}
	public void setTid(BigDecimal tid) {
		this.tid = tid;
	}
	public String getTname() {
		return tname;
	}
	public void setTname(String tname) {
		this.tname = tname;
	}
	public BigDecimal getTage() {
		return tage;
	}
	public void setTage(BigDecimal tage) {
		this.tage = tage;
	}
	public Teacher(BigDecimal tid, String tname, BigDecimal tage) {
		super();
		this.tid = tid;
		this.tname = tname;
		this.tage = tage;
	}
	public Teacher() {
		// TODO Auto-generated constructor stub
	}
}


       教師bean類對應的xml映射文件配置

(class中的name是bean類,table是數據庫對應的表名,不要寫錯。id爲數據表的主鍵,其餘均爲該表屬性,教師表死最簡單的一個表,不牽扯任何外鍵管理,下一張班級表就會牽扯外鍵關係。)

<?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.bean.Teacher" table="teacher" schema="sa">
<id name="tid" column="tid" type="java.math.BigDecimal">
<generator class="assigned"></generator>
</id>
<property name="tname" column="tname" type="java.lang.String"></property>
<property name="tage" column="tage" type="java.math.BigDecimal"></property>
</class>
</hibernate-mapping>

=============================================================================================================================
  2.班級bean類

package com.bean;

public class ClassInfo {

	public String clid;
	public String cltitle;
	public Teacher teacher;
	public String getClid() {
		return clid;
	}
	public void setClid(String clid) {
		this.clid = clid;
	}
	public String getCltitle() {
		return cltitle;
	}
	public void setCltitle(String cltitle) {
		this.cltitle = cltitle;
	}
	public Teacher getTeacher() {
		return teacher;
	}
	public void setTeacher(Teacher teacher) {
		this.teacher = teacher;
	}
	public ClassInfo(String clid, String cltitle, Teacher teacher) {
		this.clid = clid;
		this.cltitle = cltitle;
		this.teacher = teacher;
	}
	public ClassInfo() {
	}
	
}

班級bena類對應的xml映射文件的配置

(因爲每個班級有一個帶班老師,因此牽扯到了外鍵。xml配置中外鍵用<many-to-one name="teacher" column="tid" class="com.bean.Teacher"></many-to-one>,name爲班級bean類的屬性名稱,coloumn爲對應數據庫的字段名稱)

<?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.bean.ClassInfo" table="classinfo" schema="sa">
<id name="clid" column="clid" type="java.lang.String">
<generator class="assigned"></generator>
</id>
<property name="cltitle" column="cltitle" type="java.lang.String"></property>
<many-to-one name="teacher" column="tid" class="com.bean.Teacher"></many-to-one>
</class>
</hibernate-mapping>


=================================================================================================================================

3.角色權限中間表的配置(因爲實際需求中,很可能會有中間表存在,而中間表該如何配置呢?我先給大家發完bean類再發xml配置)

權限bean類(Pop)

package com.bean;

import java.math.BigDecimal;

public class Pop {

	private BigDecimal pid;
	private String ptitle;
	public BigDecimal getPid() {
		return pid;
	}
	public void setPid(BigDecimal pid) {
		this.pid = pid;
	}
	public String getPtitle() {
		return ptitle;
	}
	public void setPtitle(String ptitle) {
		this.ptitle = ptitle;
	}
	public Pop(BigDecimal pid, String ptitle) {
		super();
		this.pid = pid;
		this.ptitle = ptitle;
	}
	public Pop() {
		// TODO Auto-generated constructor stub
	}
}

角色bean類 (UserType)

package com.bean;

import java.math.BigDecimal;

public class UserType {

	private BigDecimal utid;
	private String utname;
	public BigDecimal getUtid() {
		return utid;
	}
	public void setUtid(BigDecimal utid) {
		this.utid = utid;
	}
	public String getUtname() {
		return utname;
	}
	public void setUtname(String utname) {
		this.utname = utname;
	}
	public UserType(BigDecimal utid, String utname) {
		super();
		this.utid = utid;
		this.utname = utname;
	}
	public UserType() {
		// TODO Auto-generated constructor stub
	}
}

中間表UtAndPopID類(類中屬性爲Pop和UserType)

package com.bean;

import java.io.Serializable;

public class UtAndPopID implements Serializable {

	private UserType ut;
	private Pop p;
	public UserType getUt() {
		return ut;
	}
	public void setUt(UserType ut) {
		this.ut = ut;
	}
	public Pop getP() {
		return p;
	}
	public void setP(Pop p) {
		this.p = p;
	}
	public UtAndPopID(UserType ut, Pop p) {
		super();
		this.ut = ut;
		this.p = p;
	}
	public UtAndPopID() {
	}
}

中間表UtAndPop(屬性爲UtAndPopID)

package com.bean;

public class UtAndPop {

	UtAndPopID utandpopid;

	public UtAndPopID getUtandpopid() {
		return utandpopid;
	}

	public void setUtandpopid(UtAndPopID utandpopid) {
		this.utandpopid = utandpopid;
	}
	public UtAndPop(UtAndPopID utandpopid) {
		this.utandpopid = utandpopid;
	}

	public UtAndPop() {
		// TODO Auto-generated constructor stub
	}
}

Pop和UserType的xml映射文件配置和teacher的差不多我就不發了 ,這裏只發下中間表的配置

<?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.bean.UtAndPop" table="ut_and_pop" schema="sa">
<composite-id name="utandpopid" class="com.bean.UtAndPopID">
<key-many-to-one name="ut" column="utid" class="com.bean.UserType"></key-many-to-one>
<key-many-to-one name="p" column="pid" class="com.bean.Pop"></key-many-to-one>
</composite-id>
</class>
</hibernate-mapping>

*************當你配置完成之後 還需要在hibernate.cfg.xml中進行相關的配置這些映射文件纔會好用(在<mapping />中加入映射文件的路徑)

<?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>
        <property name="dialect">org.hibernate.dialect.Oracle9Dialect</property>
        <property name="connection.url">jdbc:oracle:thin:@127.0.0.1:1521:ORCL</property>
        <property name="connection.username">sa</property>
        <property name="connection.password">sa</property>
        <property name="connection.driver_class">oracle.jdbc.OracleDriver</property>
        <property name="myeclipse.connection.profile">ora</property>
    
    
    	<mapping resource="com/bean/Teacher.hbm.xml"/>
    	<mapping resource="com/bean/ClassInfo.hbm.xml"/>
    	<mapping resource="com/bean/UtAndPop.hbm.xml"/>
    </session-factory>
    

</hibernate-configuration>


五、獲得session操作數據庫(com.sessionmanage包下)

MySessionFactory.java

package com.sessionmanage;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;

public class MySessionFactory {

	public static SessionFactory sft=new Configuration().configure().buildSessionFactory();
	public static Session getSession(){
		//這裏的session和之前的連接池差不多
		Session session=sft.openSession();
		return (session!=null)?session:null;
	}
}

六、編寫工具CriteriaPoJo,爲了實現系統DAO中封裝criteria方式的查詢方法做準備(hibernate中有hql和criteria兩種查詢方式)

CriteriaPoJo.java

package com.tool;

public class CriteriaPoJo {

	//這裏只是寫了幾個方法,當然以後我們可以將其所有的都寫出來,雖然這個類有點麻煩,但是以後子類調用時會簡單很多
	public static final Integer IDEQ=1;
	public static final Integer LIKE=2;
	public static final Integer BETWEEN=3;
	public static final Integer ISNULL=4;
	
	
	private Integer wtd;
	private String property;
	private Object[] values;
	public Integer getWtd() {
		return wtd;
	}
	public void setWtd(Integer wtd) {
		this.wtd = wtd;
	}
	public String getProperty() {
		return property;
	}
	public void setProperty(String property) {
		this.property = property;
	}
	public Object[] getValues() {
		return values;
	}
	public void setValues(Object[] values) {
		this.values = values;
	}
	public CriteriaPoJo(Integer wtd, String property, Object[] values) {
		this.wtd = wtd;
		this.property = property;
		this.values = values;
	}
	public CriteriaPoJo() {
	}
}

七、編寫DAO類(com.dao包下)

SysDAO.java(抽象父類方法,供子類DAO調用)

package com.dao;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Transaction;
import org.hibernate.classic.Session;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Restrictions;

import com.sessionmanage.MySessionFactory;
import com.tool.CriteriaPoJo;
public abstract class SysDAO {
	public static final int ADD=1;
	public static final int DEL=2;
	public static final int UPD=3;
	
	public abstract boolean insert(Object ob);
	public abstract boolean delete(Object ob);
	public abstract boolean update(Object ob);
	public abstract List findAll();
	public abstract Object findById(Object ob);
	
	//封裝Criterion,供Criteria查詢自身調用
	private Criterion getCriterion(CriteriaPoJo cp){
		if(cp.getWtd()==cp.IDEQ){
			return Restrictions.idEq(cp.getValues()[0]);
		}
		if(cp.getWtd()==cp.LIKE){
			return Restrictions.like(cp.getProperty(), "%"+cp.getValues()[0]+"%");
		}
		if(cp.getWtd()==cp.BETWEEN){
			if(cp.getValues().length<2)
				return null;
			return Restrictions.between(cp.getProperty(), cp.getValues()[0], cp.getValues()[1]);
		}
		return null;
	}
	//封裝父類Criteria查詢方法
	public List executeCriteria(Class cl,CriteriaPoJo[] cps){
		Session session=MySessionFactory.getSession();
		if(session==null){
			return null;
		}
		Criteria crt=null;
		try {
			crt=session.createCriteria(cl);
			if(cps!=null&&cps.length>0){
				for (int i = 0; i < cps.length; i++) {
					crt.add(getCriterion(cps[i]));
				}
			}
			return crt.list();
		} catch (Exception e) {
			// TODO: handle exception
		}finally{
			session.close();
		}
		return null;
	}
	//封裝父類模糊查詢方法
	public List getInfoLikePro(String cl,String[] col,String[] colvalue){
		String hql="from "+cl+" where 0=0";
		for (int i = 0; i < col.length; i++) {
			hql+=" and "+col[i]+"like ?";
		}
		return this.executeQuery(hql, colvalue);
	}
	//封裝父類根據屬性多條件查詢方法
	public List getInfoByPro(String cl,String[] col,String[] colvalue){
			String hql="from "+cl+" where 0=0";
			for (int i = 0; i < col.length; i++) {
				hql+=" and "+col[i]+"=?";
			}
		return this.executeQuery(hql, colvalue);
	}
	//封裝父類分頁查詢方法
	public List getInfoByPageSize(String hql,int rowcount,int pagesize){
		Session session=MySessionFactory.getSession();
		if(session==null){
			return null;
		}
		try {
			Query q=session.createQuery(hql);
			int size=rowcount*(pagesize-1);
			q.setFirstResult(size);
			q.setMaxResults(rowcount);
			
			return q.list();
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			session.close();
		}
		return null;
	}
	//封裝父類查詢方法
	public List executeQuery(String hql,String[] args){
		Session session=MySessionFactory.getSession();
		if(session==null){
			return null;
		}
		try {
			Query q=session.createQuery(hql);
			if(args!=null&&args.length>0){
				for (int i = 0; i < args.length; i++) {
					q.setString(i,args[i]);
				}
			}
			return q.list();
		} catch (Exception e) {
			// TODO: handle exception
		}finally{
			session.close();
		}
		return null;
	}
	//封裝父類增刪改方法
	public boolean executeUpdate(Object ob,Integer wtd){
		return this.executeUpdateBatch(new Object[]{ob}, new Integer[]{wtd});
	}
	//封裝父類批處理事務,增刪改方法
	public boolean executeUpdateBatch(Object[] obs,Integer[] wtd){
		Session session=MySessionFactory.getSession();
		if(session==null){
			return false;
		}
		Transaction tran=session.beginTransaction();
		try {
			for (int i = 0; i < obs.length; i++) {
				switch (wtd[i]) {
				case ADD:
					session.save(obs[i]);
					break;
				case DEL:
					session.delete(obs[i]);
					break;
				case UPD:
					session.update(obs[i]);
					break;
				default:
					return false;
				}
				if(i%20==0){
					session.flush();
					session.clear();
				}
			}
			tran.commit();
			return true;
		} catch (Exception e) {
			tran.rollback();
		}finally{
			session.close();
		}
		return false;
	}
}

其他各類的DAO類繼承SysDAO類進行使用,這裏我就只給出TeacherDAO.java的代碼

TeacherDAO.java

package com.dao;

import java.util.List;

public class TeacherDAO extends SysDAO {

	@Override
	public boolean delete(Object ob) {
		return executeUpdate(ob, SysDAO.DEL);
	}

	@Override
	public boolean insert(Object ob) {
		return executeUpdate(ob, SysDAO.ADD);
	}

	@Override
	public boolean update(Object ob) {
		return executeUpdate(ob, SysDAO.UPD);
	}
	//定義批量刪除操作的方法
	public boolean deleteInfos(Object[] obs){
		Integer[] wtd=new Integer[obs.length];
		for (int i = 0; i < wtd.length; i++) {
			wtd[i]=SysDAO.DEL;
		}
		return executeUpdateBatch(obs, wtd);
	}

	@Override
	public List findAll() {
		return this.executeQuery("from Teacher", null);
	}

	@Override
	public Object findById(Object ob) {
		return this.executeQuery("from Teacher where tid=?",new String[]{ob+""} );
	}
}


hibernate就發這些東西了,hibernate主要是輔助M層,他的核心就是對象關係映射,大家根據這些類和配置理解吧,代碼不會學了之後就懂,重要的是思想,雖然我的思想也不怎麼樣,歡迎大家指教。

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