论坛首页 Java企业应用论坛

泛型dao架构实现,封装crud等基本操作

浏览 27655 次
精华帖 (0) :: 良好帖 (2) :: 新手帖 (2) :: 隐藏帖 (5)
作者 正文
   发表时间:2008-12-26  
dao是不是也应该区分数据库啊?

如何能支持多数据库呢?是定义一个接口,然后每个数据库用一个实现类来处理?
0 请登录后投票
   发表时间:2009-08-22  
面向接口编程,所以在方法定义中不要用HashMap 。pageListQuery, PageList 在哪里啊?
0 请登录后投票
   发表时间:2009-08-22  
还有分页采用displaytag 可能会更好吧。
0 请登录后投票
   发表时间:2009-09-03  
tangbo530 写道

public abstract class BaseDAOImpl<T, PK extends Serializable> extends HibernateDaoSupport implements
BaseDAO<T, PK> {

protected abstract Class<T> type();

// 保存
public void save(T instance) {
getHibernateTemplate().save(instance);
}

// 更新
public void update(T instance) {
getHibernateTemplate().update(instance);
}

// 删除
public void delete(T instance) {
getHibernateTemplate().delete(instance);
}

// 根据ID查询
@SuppressWarnings("unchecked")
public T get(PK id) {
return (T) getHibernateTemplate().get(type(), id);
}

// 查询所有
@SuppressWarnings("unchecked")
public List<T> findAll() {
return getHibernateTemplate().loadAll(type());
}

// 根据例子查询
@SuppressWarnings("unchecked")
public List<T> findByExample(T instance) {
return getHibernateTemplate().findByExample(instance);
}

// 根据HQL语句进行update操作等
public int bulkUpdate(String hql) {
return getHibernateTemplate().bulkUpdate(hql);
}

// 根据HQL语句进行update操作等
public int bulkUpdate(String hql, Object value) {
return getHibernateTemplate().bulkUpdate(hql, value);
}

// 根据HQL语句进行update操作等
public int bulkUpdate(String hql, Object[] value) {
return getHibernateTemplate().bulkUpdate(hql, value);
}

// 根据HQL语句进行查询
@SuppressWarnings("unchecked")
public List<T> find(String queryString) {
return getHibernateTemplate().find(queryString);
}

// 根据HQL语句进行查询
@SuppressWarnings("unchecked")
public List<T> find(String queryString, Object obj) {

return getHibernateTemplate().find(queryString, obj);
}

// 根据HQL语句进行查询
@SuppressWarnings("unchecked")
public List<T> find(String queryString, Object[] obj) {
return getHibernateTemplate().find(queryString, obj);
}

/**
* 使用命名查询进行查询
*
* @param queryString
*            HQL
* @param paramName
*            参数名
* @param value
*            参数值
* @return
*/
@SuppressWarnings("unchecked")
public List<T> findByNamedParam(String queryString, String paramName, Object value) {
return this.getHibernateTemplate().findByNamedParam(queryString, paramName, value);
}

/**
* 使用命名查询进行查询 多个参数
*
* @param queryString
*            HQL
* @param paramNames
*            参数名的数组
* @param values
*            参数值的数组
* @return
*/
@SuppressWarnings("unchecked")
public List<T> findByNamedParam(String queryString, String[] paramNames, Object[] values) {
return this.getHibernateTemplate().findByNamedParam(queryString, paramNames, values);
}

/**
* 使用HIBERNATE映射文件中的定义的HQL语句进行查询
*
* @param queryName
*            文件中定义的HQL语句的名字
* @return
*/
@SuppressWarnings("unchecked")
public List<T> findByNamedQuery(String queryName) {
return getHibernateTemplate().findByNamedQuery(queryName);
}

/**
*
* @param queryName
* @param value
* @return
*/
@SuppressWarnings("unchecked")
public List<T> findByNamedQuery(String queryName, Object value) {
return getHibernateTemplate().findByNamedQuery(queryName, value);
}

/**
*
* @param queryName
* @param values
* @return
*/
@SuppressWarnings("unchecked")
public List<T> findByNamedQuery(String queryName, Object[] values) {
return getHibernateTemplate().findByNamedQuery(queryName, values);
}

/**
* 根据属性查询
*
* @param property
* @param value
* @return
*/
@SuppressWarnings("unchecked")
public List<T> findByProperty(String property, Object value) {
return this.getHibernateTemplate().findByCriteria(
DetachedCriteria.forClass(type()).add(Restrictions.eq(property, value)));
}

/**
* 分页查询
* 注:不能满足要求子类重写该方法
* @param t
* @param firstResult
* @param maxResult
* @return 返回分页查询的数据
*/
@SuppressWarnings("unchecked")
public List<T> findByPagination(final T t, final int firstResult, final int maxResult) {
return getHibernateTemplate().executeFind(new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException, SQLException {
Criteria criteria = session.createCriteria(type());
criteria.add(Example.create(t).enableLike(MatchMode.ANYWHERE));
criteria.setFirstResult(firstResult);
criteria.setMaxResults(maxResult);
return criteria.list();
}
});
}

/**
* 分页统计查询
*
* @param t
* @return 一共有多少条数据
*/
@SuppressWarnings("unchecked")
public int countByPagination(final T t) {
return (Integer) getHibernateTemplate().execute(new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException, SQLException {
Criteria criteria = session.createCriteria(type());
criteria.setProjection(Projections.rowCount());
criteria.add(Example.create(t).enableLike(MatchMode.ANYWHERE));
return criteria.uniqueResult();
}
});
}

这个比lz的更好呢!
0 请登录后投票
   发表时间:2009-09-05  
写的很不乐观
0 请登录后投票
   发表时间:2009-09-07  
EXvision 写道
逆风的香1314 写道
你的代码好像有点问题啊?太复杂了。
还有一个问题就是为什么你们总喜欢用HIBERNATE呢?莫非你是做外包的/
我个人比较喜欢用Spring做底层,抑或是直接JDBC连接。
这样好控制。


所以你这辈子都不会明白ORM。


楼主也不能这样讲的,hibernate再好,他也从jdbc过来的,我的导师以前就做个一个项目,结束测试的时候,邮件服务老是出错,最后把hibernate改成了jdbc,问题解决,最后导师给我们说了一句深刻的话,用不用hibernate要慎重,因为jdbc才是真正的老祖宗嘛
0 请登录后投票
   发表时间:2009-09-07  
EXvision 写道
楼主的abstractDao封装的方法过于少了。
其实可以整合criteria,另外一般情况下用hibernate写sql的时候比较少。

建议参照SpringSide的泛型DAO。很漂亮。


公司内用的没必要面面俱到,够用就行了。
0 请登录后投票
   发表时间:2009-09-30  
mfdkydyw4 写道
EXvision 写道
逆风的香1314 写道
你的代码好像有点问题啊?太复杂了。
还有一个问题就是为什么你们总喜欢用HIBERNATE呢?莫非你是做外包的/
我个人比较喜欢用Spring做底层,抑或是直接JDBC连接。
这样好控制。


所以你这辈子都不会明白ORM。


楼主也不能这样讲的,hibernate再好,他也从jdbc过来的,我的导师以前就做个一个项目,结束测试的时候,邮件服务老是出错,最后把hibernate改成了jdbc,问题解决,最后导师给我们说了一句深刻的话,用不用hibernate要慎重,因为jdbc才是真正的老祖宗嘛


Hibernate的主要贡献我认为是在系统设计上,至少在设计和原型阶段,不会再有繁冗的jdbc代码分散我们的注意力。Hibernate本身由于过于强大,需要注意的地方太多了,调优也不是很简单,这可能为实施阶段带来意想不到的bug,不过总之,一般情况下问题并非hibernate本身不能解决,而是你还没弄明白hibernate。

顺便说一句,如果当时你导师的团队人员不足以在有限时间内把hibernate搞得很明白很深入,及时转移到jdbc挽救项目的决定还是正确的,不管怎样,成品才是硬道理。
0 请登录后投票
   发表时间:2009-10-08  
其实在appfuse里早就有好的实现了
0 请登录后投票
   发表时间:2009-10-08  
derickkoo 写道
主键类型不要用Long,用Serialized吧

赞同,这样就不用考虑主键是什么类型了,我公司的项目开发中就是这样的!
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics