使用所有的框架都一樣,導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層,他的核心就是對象關係映射,大家根據這些類和配置理解吧,代碼不會學了之後就懂,重要的是思想,雖然我的思想也不怎麼樣,歡迎大家指教。