所有dao类的方法名都是一样的,但是形参不同(因为传入的实体不同),对于这种情况如何设计一个公用的借口
解决方案 »
- Spring-acegi怎么做单点登录?
- java怎样开发GIS,望高人指点,非常感谢
- JSF
- 关于Ejb2.0中无状态SessionBean的问题
- 关于Tomcat下加载Servlet的问题!!!!!急啊!!!!
- 初学web service 遇到的axis配置问题 ?
- 我在线等待好久,为什么没有回答,难道不欢迎新来的吗???????????????
- 100分:关于如何解决邮件附件名称乱码问题(另贴给分,这个请放心)
- springMVC怎么获取从jsp传过来的集合类似List<User>
- 刚到公司,求关于Struts 和 ant,JUnit的文章及实例教程,急!
- 关于hibernate多对多更新的问题
- 谁能比较一下struts2和jsf2各自的优点和缺点
* List by page.
*
* @param queryStr the query str
* @param offest the offest
* @param limit the limit
*
* @return the list< t>
*/
List<T> listByPage(String queryStr, int offest, int limit);
}
import java.util.List;interface BaseDao<T> { /**
* 根据主键值查询记录
* @param id
* @return
* 2009-11-25 上午11:32:36
*/
public T find(Serializable id);
/**
* 翻页查询数据记录
* @param page
* @return
* 2009-11-25 上午11:32:49
*/
public List<T> getPageData(int page);
/**
* 设置页数大小
*
* @param pageSize
* 2009-11-26 上午10:56:42
*/
public void setPageSize(int pageSize);
/**
* 获得分页查询时页数大小
*
* @return
* 2009-11-26 上午10:58:12
*/
public int getPageSize();
/**
* 删除受托管对象
* @param t
* 2009-11-25 上午11:33:01
*/
public void remove(T t);
/**
* 合并非托管对象
* @param t
* 2009-11-25 上午11:33:10
*/
public void merge(T t);
/**
* 持久化对象
* @param t
* 2009-11-25 上午11:33:23
*/
public void persist(T t);
/**
* 获得数据记录总数
* @return
* 2009-11-25 上午11:33:31
*/
public Long count();
/**
* 根据字段名和字段值为条件查询记录数
* @param fieldNames
* @param values
* @return
* 2009-11-26 上午11:16:47
*/
public Long count(String[] fieldNames, Object... values);
/**
* 刷新 EntityManager 强行 EntityManager 刷新缓冲区
*
* 2009-11-25 上午11:33:39
*/
public void flush();
/**
* 清空 EntityManager 中所托管所有的对象
*
* 2009-11-25 上午11:34:08
*/
public void clear();
/**
* 判断对象是否处于受托管状态
* @return
* 2009-11-25 上午11:34:23
*/
public boolean isManaged(T t);
}import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;import com.jingdian.om.server.util.SystemConfig;/**
* JPA dao 基类<br />
* 用于实现一些常用的
*
* 2009-11-2 下午03:31:07
*/
public class JpaBaseDao<T> implements BaseDao<T> {
@PersistenceContext
protected EntityManager em;
/**
* Entity 的 Class 对象
*/
private Class<T> entityClass;
private int pageSize;
private final String baseCount;
@SuppressWarnings("unchecked")
public JpaBaseDao() {
// 获得参数化类型中的 Class 对象
Type genType = getClass().getGenericSuperclass();
Type[] params = ((ParameterizedType)genType).getActualTypeArguments();
entityClass = (Class)params[0];
this.pageSize = SystemConfig.PAGE_SIZE;
baseCount = "SELECT count(t.id) FROM " + entityClass.getSimpleName() + " t";
} /**
* 根据主键查找实体
*/
public T find(Serializable id) {
return em.find(entityClass, id);
} /**
* 获得所有的数据
*/
@SuppressWarnings("unchecked")
public List<T> getPageData(int page) {
String jpql = "SELECT t FROM " + entityClass.getSimpleName() + " t";
Query q = em.createQuery(jpql);
q.setFirstResult((page - 1) * pageSize);
q.setMaxResults(pageSize);
return (List<T>)q.getResultList();
} /**
* 合并实体
*/
public void merge(T t) {
em.merge(t);
} /**
* 持久化实体
*/
public void persist(T t) {
em.persist(t);
} /**
* 删除实体
*/
public void remove(T t) {
em.remove(t);
} /**
* 获得记录总数
*/
public Long count() {
return count(null);
}
public Long count(String[] fieldNames, Object... values) {
Query query = null;
if(fieldNames == null || values == null || fieldNames.length == 0 ||
values.length == 0 || fieldNames.length != values.length) {
query = em.createQuery(baseCount);
} else {
StringBuffer sb = new StringBuffer(baseCount);
sb.append(" WHERE");
for(int i = 0; i < fieldNames.length; i++) {
if(i > 0) {
sb.append(" AND");
}
sb.append(" t.").append(fieldNames[i]).append(" = ?").append(i + 1);
}
query = em.createQuery(sb.toString());
for(int i = 0; i < values.length; i++) {
query.setParameter(i + 1, values[i]);
}
}
return (Long)em.createQuery(baseCount).getSingleResult();
} public void flush() {
em.flush();
}
public void clear() {
em.clear();
}
public boolean isManaged(T t) {
return em.contains(t);
} public void setPageSize(int pageSize) {
this.pageSize = (pageSize < 1) ? SystemConfig.PAGE_SIZE : pageSize;
}
public int getPageSize() {
return this.pageSize;
}
}继承这个 JpaBaseDao 加上泛型参数就可以了,比如:public class UserDao extends JpaBaseDao<UserDao>不过,我感觉这种基类的 DAO 实用性不大,因为大多数的数据库操作并不只是简单地操纵一张表。
public class Dao<Pojo extends BaseObject> extends HibernateDaoSupport{
// ...
}pojo是实体类,BaseObject是所有实体类的父类
public class BaseDao<Pojo extends BaseObject> extends Dao{
// ....
}然后所有的Dao都继承BaseDao