锁定老帖子 主题:泛型dao架构实现,封装crud等基本操作
精华帖 (0) :: 良好帖 (2) :: 新手帖 (2) :: 隐藏帖 (5)
|
|
---|---|
作者 | 正文 |
发表时间:2008-12-26
dao是不是也应该区分数据库啊?
如何能支持多数据库呢?是定义一个接口,然后每个数据库用一个实现类来处理? |
|
返回顶楼 | |
发表时间:2009-08-22
面向接口编程,所以在方法定义中不要用HashMap 。pageListQuery, PageList 在哪里啊?
|
|
返回顶楼 | |
发表时间:2009-08-22
还有分页采用displaytag 可能会更好吧。
|
|
返回顶楼 | |
发表时间: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的更好呢! |
|
返回顶楼 | |
发表时间:2009-09-05
写的很不乐观
|
|
返回顶楼 | |
发表时间:2009-09-07
EXvision 写道 逆风的香1314 写道 你的代码好像有点问题啊?太复杂了。
还有一个问题就是为什么你们总喜欢用HIBERNATE呢?莫非你是做外包的/ 我个人比较喜欢用Spring做底层,抑或是直接JDBC连接。 这样好控制。 所以你这辈子都不会明白ORM。 楼主也不能这样讲的,hibernate再好,他也从jdbc过来的,我的导师以前就做个一个项目,结束测试的时候,邮件服务老是出错,最后把hibernate改成了jdbc,问题解决,最后导师给我们说了一句深刻的话,用不用hibernate要慎重,因为jdbc才是真正的老祖宗嘛 |
|
返回顶楼 | |
发表时间:2009-09-07
EXvision 写道 楼主的abstractDao封装的方法过于少了。
其实可以整合criteria,另外一般情况下用hibernate写sql的时候比较少。 建议参照SpringSide的泛型DAO。很漂亮。 公司内用的没必要面面俱到,够用就行了。 |
|
返回顶楼 | |
发表时间:2009-09-30
mfdkydyw4 写道 EXvision 写道 逆风的香1314 写道 你的代码好像有点问题啊?太复杂了。
还有一个问题就是为什么你们总喜欢用HIBERNATE呢?莫非你是做外包的/ 我个人比较喜欢用Spring做底层,抑或是直接JDBC连接。 这样好控制。 所以你这辈子都不会明白ORM。 楼主也不能这样讲的,hibernate再好,他也从jdbc过来的,我的导师以前就做个一个项目,结束测试的时候,邮件服务老是出错,最后把hibernate改成了jdbc,问题解决,最后导师给我们说了一句深刻的话,用不用hibernate要慎重,因为jdbc才是真正的老祖宗嘛 Hibernate的主要贡献我认为是在系统设计上,至少在设计和原型阶段,不会再有繁冗的jdbc代码分散我们的注意力。Hibernate本身由于过于强大,需要注意的地方太多了,调优也不是很简单,这可能为实施阶段带来意想不到的bug,不过总之,一般情况下问题并非hibernate本身不能解决,而是你还没弄明白hibernate。 顺便说一句,如果当时你导师的团队人员不足以在有限时间内把hibernate搞得很明白很深入,及时转移到jdbc挽救项目的决定还是正确的,不管怎样,成品才是硬道理。 |
|
返回顶楼 | |
发表时间:2009-10-08
其实在appfuse里早就有好的实现了
|
|
返回顶楼 | |
发表时间:2009-10-08
derickkoo 写道 主键类型不要用Long,用Serialized吧
赞同,这样就不用考虑主键是什么类型了,我公司的项目开发中就是这样的! |
|
返回顶楼 | |