相信大家,在项目中都曾自己或者组员一起封装过通用数据库操作基类.然后其他持久层类继承这个类.下面就贴出来我以前项目中用到的一个类吧,CommDao.多多指教. 下面提供下载.
package com.kechuang.xlw.commdao;
import java.io.Serializable;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.log4j.Logger;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.Expression;
import org.hibernate.criterion.Order;
import org.hibernate.type.DateType;
import org.hibernate.type.FloatType;
import org.hibernate.type.IntegerType;
import org.hibernate.type.StringType;
import org.hibernate.type.Type;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
/**
* 通用的操作类 dao
*
* @author 谢晋
*
*/
public class CommDao<T> extends HibernateDaoSupport {
// logger日志对象
protected Logger log = Logger.getLogger(this.getClass());
public CommDao() {
}
/**
* 添加一个对象
*/
public T addObject(T obj) {
this.getHibernateTemplate().save(obj);
return obj;
}
/**
* 删除一个对象
*/
public T deleteObject(T obj) {
this.getHibernateTemplate().delete(obj);
return obj;
}
/**
* 更新一个对象
*/
public T updateObject(T obj) {
this.getHibernateTemplate().update(obj);
return obj;
}
/**
* 排序+分页功能+条件查询
*
* @param <E>
* @param cl
* @param map
* 条件参数
* @param orderstr
* 排序字段 如果为null不排序
* @param beginpos
* 分页起点 如果为null不分页
* @param count
* 每页的记录总数 如果为null不分页
* @return 返回List集合
*/
public <E> List<E> getOrderObjects(final Class cl, final Map map,
final String orderstr, final Integer beginpos, final Integer count) {
List<E> list = this.getHibernateTemplate().executeFind(
new HibernateCallback() {
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
Criteria cri = session.createCriteria(cl);
if (map != null) {
Set keyset = map.keySet();
for (Object key : keyset) {
if (key == null || map.get(key) == null) {
continue;
}
// 如果对应的值是字符串类型,我就是用like匹配
if (map.get(key).getClass() == String.class) {
cri.add(Expression.like(key.toString(), map
.get(key)));
} else {
cri.add(Expression.eq(key.toString(), map
.get(key)));
}
}
}
if (orderstr != null) {
cri.addOrder(Order.desc(orderstr));
}
if (beginpos != null) {
cri.setFirstResult(beginpos);
} else {
cri.setFirstResult(0);
}
if (count != null) {
cri.setMaxResults(count);
}
return (List<E>) cri.list();
}
});
return list;
}
/**
* 分页查询 ,传一个hql语句. 和一个参数数组.
*
* @param hql
* hql语句
* @param bindValue
* 数组参数
* @param first
* 分页起点
* @param count
* 每页的记录总数
* @return 返回List集合
*/
public List pageQuery(final String hql, final Object[] bindValue,
final Integer first, final Integer count) {
List list = this.getHibernateTemplate().executeFind(
new HibernateCallback() {
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
Query query = session.createQuery(hql);
if (bindValue != null && bindValue.length >= 1) {
Type[] types = typesFactory(bindValue);
query.setParameters(bindValue, types);
}
if (first != null && first.intValue() >= 0) {
query.setFirstResult(first);
if (count != null && count.intValue() >= 0)
query.setMaxResults(count);
}
List result = query.list();
return result;
}
});
return list;
}
/**
* 获取对象对应参数的类型
*
* @param bindValue
* @return
*/
private final Type[] typesFactory(Object[] bindValue) {
int count = bindValue.length;
Type[] types = new Type[count];
for (int i = 0; i < count; i++) {
if (bindValue[i].getClass().getName().endsWith("String")) {
types[i] = new StringType();
} else if (bindValue[i].getClass().getName().endsWith("Integer")) {
types[i] = new IntegerType();
} else if (bindValue[i].getClass().getName().endsWith("Float")) {
types[i] = new FloatType();
} else if (bindValue[i].getClass().getName().endsWith("Date")) {
types[i] = new DateType();
}
}
return types;
}
/**
* 查询某个类的全部对象
*
* @param <E>
* @param c
* 查询类的class
* @return
*/
public <E> List<E> selectAllObject(final Class c) {
List<E> list = this.getHibernateTemplate().executeFind(
new HibernateCallback() {
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
Criteria cri = session.createCriteria(c);
List<E> list = cri.list();
return list;
}
});
return list;
}
/**
* 根据 主键 查询某个对象
*
* @param <E>
* @param c
* @param id
* @return
*/
public <E> E selectObjectById(final Class c, final Serializable id) {
E e = (E) this.getHibernateTemplate().execute(new HibernateCallback() {
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
E aa = (E) session.get(c, id);
return aa;
}
});
return e;
}
/**
* 根据条件,查询一个对象.
*
* @param <E>
* @param c
* @param map
* map放条件查询参数 调用的时候?: String username="xiejin" ;
* map.put("username",username);
* @return
*/
public <E> E selectUniqueObject(final Class c, final Map map) {
E e = (E) this.getHibernateTemplate().execute(new HibernateCallback() {
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
Criteria cri = session.createCriteria(c);
cri.add(Expression.allEq(map));
return (E) cri.uniqueResult();
}
});
return e;
}
/**
* 带条件的查询.返回list集合
*
* @param <E>
* @param c
* @param map
* 根据map里面放置的参数
* @return 返回一个list对象集合
*/
public <E> List<E> seletcObjectByMap(final Class c, final Map map) {
List<E> list = this.getHibernateTemplate().executeFind(
new HibernateCallback() {
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
Criteria cri = session.createCriteria(c);
cri.add(Expression.allEq(map));
List<E> e = cri.list();
return e;
}
});
return list;
}
/**
* 一个泛型方法:支持条件查询,排序,分页查询.
*
* @param <E>
* 类别
* @param cl
* 需要查询的类
* @param map
* map中put("uname","谢晋"); null or map
* 模糊查询用("uname","%"+uname+"%")
* @param orderStr
* 是否需要排序(升序) null or "属性字段"
* @param beginIndex
* 分页开始位置 null or Integer
* @param count
* 记录条数 null or Integer
* @return
*/
@SuppressWarnings("unchecked")
public <E> List<E> selectObjInfoByMapCondtionAndOrderAndPageQuery(
final Class cl, final Map map, final String orderStr,
final Integer beginIndex, final Integer count) {
List e = this.getHibernateTemplate().executeFind(
new HibernateCallback() {
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
// 使用 Criteria查询 代替复杂得hql语句;
Criteria cri = session.createCriteria(cl);
// 对map进行判断
if (map != null) {
Set keyset = map.keySet();
for (Object key : keyset) {
// 如果为空则继续遍历
if (key == null || map.get(key) == null) {
continue;
}
// 如果是参数值是字符串则用模糊查询. like 匹配
if (map.get(key).getClass() == String.class) {
cri.add(Expression.like(key.toString(), map
.get(key)));
} else {
cri.add(Expression.eq(key.toString(), map
.get(key)));
}
}
}
// 对orderStr 进行判断
if (orderStr != null) {
cri.addOrder(Order.asc(orderStr));// 升序
}
// 对分页 进行判断
if (beginIndex != null && beginIndex.intValue() >= 0) {
cri.setFirstResult(beginIndex.intValue());
if (count != null && count.intValue() >= 0) {
cri.setMaxResults(count.intValue());
}
}
return (List<E>) cri.list();
}
});
return e;
}
}
分享到:
相关推荐
dao层基类dao层基类dao层基类dao层基类dao层基类
通过将公共通用操作写进父类简化代码,提高代码的复用。 面向接口 使用继承 泛型 引入JPA API查询 以及 元数据 提高代码的安全性.
c#数据操作基类如何将Sql Server 表的结构导出到Word或Excel
recyclerview 封装基类适配器和基类holder 以及分割线使用
分享一下 使用EF时,对增删改查基本操作的封装代码 ef重构基类;抛砖引玉,仅供参考; ef增删改差扩展方法!
整理的基类 对数据操库操作类 包含执行Transact-SQL,返回DataSet,DataTable,DataReader,单个、多个值,统计条数.均可用参数存储过程等。
数据访问基类的设计方法
C# 数据库操作基类 包括存储过程和事务处理
c# xml 操作 基类
用C#读取GPS数据的基类用C#读取GPS数据的基类用C#读取GPS数据的基类用C#读取GPS数据的基类用C#读取GPS数据的基类用C#读取GPS数据的基类用C#读取GPS数据的基类用C#读取GPS数据的基类
这是我写的Entityframework的增删该查封装基类,如果你要使用EF开发项目,只要把需要增删改查的类继承这个基类,就可以轻松做到。敬请参考,不到之处请多多指正。
数据类型的基类
要求数据表字段名称和实体类的属性名称相同,敏感大小写。如果有需要请联系22282227 Eg: 数据表userinfo idx username pwd 1 admin 123456 c# public class UserInfo { public int idx; public string username;...
Struts2、Hibernate、Spring整合的泛型DAO (本人评价: 代码开发效率提高30% 代码出错率减少70%) 对于大多数开发人员,系统中的每个 DAO 编写几乎相同的代码到目前为止已经成为一种习惯。虽然所有人都将这种重复...
一个规范flutter生命周期的Widget基类,并且封装了基本属性,加快开发速度~
C#中的Asp.net 数据采集基类(远程抓取,分解,保存,匹配) 分享
简单易用的数据库封装操作,包含数据库连接池的基本实现,数据库连接可重用,所有的操作都脱离源生JDBC操作,开发人员只需要熟悉Java集合的用法,会写Sql即可轻松的使用该封装好的JDBC API写出合理的代码。...
用C#读取GPS数据的基类,比较通用的源代码程序!
Lua面向对象封装好的基类Class
用C读取GPS数据的基类适用于wince操作系统.pdf