<!--
Title:Spring&Hibernate增刪改方法總結,版本號V1.0.0(獻給糾結於SSH框架的學子們)
Author:Lovingshu
Date:2012-1-5 18:00
Tip:將被源碼複製到Dao類,然後其他dao類繼承這個dao類,然後採用super.或者this.調用裏面我總結的方法!
Remark:這篇文章主要是源碼,總結了8個查詢方法,3個修改方法,3個添加方法,詳見參考圖,都是最常見的,
我只是對其進行了總結和整理,還有就是避免了糾結於到底使用Hibernate還是Spring中的方法的問題!
但是這個版本也許存在一定的問題,我寫好後沒有經過嚴格的測試,嘿嘿~但願以後有時間改進!
附帶:本來這篇文章應該提前完成的,但是由於我去體驗了一下<<上古5>>的MOD去了,結果就忘記放下手柄了,然後文章就被推遲了~Sorry啦
最後:希望有用到的同學指出裏面的不足,以及各種提議和意見,以便修正和進步~O(∩_∩)O~
-->
/************************code begin*************************/
package com.shu.dao.impl;
import java.util.List;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
public class BaseDao<T> extends HibernateDaoSupport{
//一個session對象
Session se=null;
/**
* 根據hql進行查詢
* @param 需要執行的hql語句
* @return 查詢後的List集合(泛型)
*/
public List<T> queryHql(String hql){
//採用自帶的方法
return getHibernateTemplate().find(hql);
}
/**
* 根據sql語句進行查詢
* @param 要執行的sql語句
* @param 集合的類型所在的類的全名,如java.lang.Integer或com.shu.model.User;
* @return
*/
public List<T> querySql(String sql,String fullClassName){
try{
//得到session對象
se=getHibernateTemplate().getSessionFactory().openSession();
//調用session中的查詢方法
return se.createSQLQuery(sql).addEntity(fullClassName).list();
}catch(Exception e){
e.printStackTrace();
return null;
}finally{
//關閉該關閉的
se.clear();
se.close();
}
}
/**
* 根據一個對象查詢該類對象的集合
* @param 需要查詢的一個具體對象類型
* @return 查詢到的集合(泛型)
*/
public List<T> queryHql(Object obj){
//調用自帶方法
return getHibernateTemplate().findByExample(obj);
}
/**
* 帶分頁查詢的hql查詢
* @param hql
* @param 本次查詢最多需要查詢多少條記錄
* @param 第一條記錄的下標
* @return
*/
public List<T> queryHql(String hql,int maxResult,int firstResult){
try{
//得到session對象
se=getHibernateTemplate().getSessionFactory().openSession();
//得到並返回集合對象
return se.createQuery(hql).setMaxResults(maxResult).setFirstResult(firstResult).list();
}catch(Exception e){
e.printStackTrace();
return null;
}finally{
//關掉該關閉的
se.clear();
se.close();
}
}
/**
* 根據實體對象進行分頁查詢
* @param obj
* @param maxResult
* @param firstResult
* @return
*/
public List<T> queryHql(Object obj,int maxResult,int firstResult){
//調用自帶方法
return getHibernateTemplate().findByExample(obj, firstResult, maxResult);
}
/**
* 帶分頁查詢的sql語句查詢
* @param sql
* @param maxResult
* @param firstResult
* @return
*/
public List<T> querySql(String sql,int maxResult,int firstResult){
try{
//得到session對象
se=getHibernateTemplate().getSessionFactory().openSession();
//得到並返回集合
return se.createSQLQuery(sql).setMaxResults(maxResult).setFirstResult(firstResult).list();
}catch(Exception e){
e.printStackTrace();
return null;
}finally{
//關閉該關閉的
se.clear();
se.close();
}
}
/**
* 根據hql查詢單個對象(這個方法偷了一下懶,呵呵,其實就是在原來的基礎上處理了一下)
* @param hql
* @return
*/
public T querySingleHql(String hql){
//調用的方法~嘿嘿~大家懂得
List<T> list=queryHql(hql);
//判斷是否有值
if(list!=null&&list.size()>0){
return list.get(0);
}
return null;
}
/**
* 根據sql查詢單個對象(偷懶方法如上)
* @param sql
* @return
*/
public T querySingleSql(String sql,String fullClassName){
//調用的方法~嘿嘿~大家懂得
List<T> list=querySql(sql,fullClassName);
//判斷是否有值
if(list!=null&&list.size()>0){
return list.get(0);
}
return null;
}
/**
* 採用hql語句進行刪除,修改操作
* @param hql
* @return
*/
public boolean updateHql(String hql){
try{
//得到session對象
se=getHibernateTemplate().getSessionFactory().openSession();
//開啓事物
se.beginTransaction();
//執行hql查詢並判斷是否操作成功(這裏有個小小自我矛盾:0行受影響暫且歸爲修改失敗)
if(se.createQuery(hql).executeUpdate()>0){
//成功操作後則提交事物
se.getTransaction().commit();
return true;
}
//無用操作總歸爲錯誤操作,其實這裏不需要回滾的,但是又必須要進行事務操作,所以還是回滾吧
se.getTransaction().rollback();
return false;
}catch(Exception e){
//報錯則回滾事物
se.getTransaction().rollback();
return false;
}finally{
se.clear();
se.close();
}
}
/**
* 根據實體進行修改操作
* @param obj
* @return
*/
public boolean updateHql(Object obj){
try{
//調用自帶的修改方法
getHibernateTemplate().update(obj);
return true;
}catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 根據sql語句驚醒修改,刪除操縱
* @param sql
* @return
*/
public boolean updateSql(String sql){
try{
//得到session對象
se=getHibernateTemplate().getSessionFactory().openSession();
//開始事務處理
se.beginTransaction();
//執行sql查詢並判斷是否操作成功(這裏有個小小自我矛盾:0行受影響暫且歸爲修改失敗)
if(se.createSQLQuery(sql).executeUpdate()>0){
se.getTransaction().commit();
return true;
}
//其實這裏不需要回滾的,但是又必須要進行事務操作,所以還是回滾吧
se.getTransaction().rollback();
return false;
}catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 根據hql進行添加操作
* @param hql
* @return
*/
public boolean addHql(String hql){
try{
se=getHibernateTemplate().getSessionFactory().openSession();
//開啓事物
se.beginTransaction();
//調用save方法
se.save(hql);
//提交事物
se.getTransaction().commit();
return true;
}catch(Exception e){
//回滾事物
se.getTransaction().rollback();
return false;
}finally{
se.clear();
se.close();
}
}
/**
* 根據實體進行添加
* @param obj
* @return
*/
public boolean addHql(Object obj){
try{
//執行自帶的保存方法
getHibernateTemplate().save(obj);
return true;
}catch(Exception e){
e.printStackTrace();
return false;
}
}
/**
* 根據sql語句來添加
* @param sql
* @return
*/
public boolean addSql(String sql){
try{
se=getHibernateTemplate().getSessionFactory().openSession();
//開啓事務
se.beginTransaction();
//執行添加操作
se.save(sql);
//提交併返回true
se.getTransaction().commit();
return true;
}catch(Exception e){
//回滾並提示操作失敗
se.getTransaction().rollback();
return false;
}finally{
se.clear();
se.close();
}
}
}
/************************code end*************************/
三個修改方法
三個添加方法
八個查詢方法