<!--
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*************************/
三个修改方法
三个添加方法
八个查询方法