- 浏览: 11557 次
- 性别:
- 来自: 长沙
最新评论
-
qiangshao:
javazeke 写道JDBC的简化代码,我前几个月也写过,和 ...
今天,在百度知道 ,一位网友问到jdbc代码简化,今天花了2个小时间给他写了个。。 -
javazeke:
JDBC的简化代码,我前几个月也写过,和楼主的大同小异,同样我 ...
今天,在百度知道 ,一位网友问到jdbc代码简化,今天花了2个小时间给他写了个。。 -
qiangshao:
忘了一点 :实体类基本数据类型必须是包装类
今天,在百度知道 ,一位网友问到jdbc代码简化,今天花了2个小时间给他写了个。。 -
tangbo530:
<div class="quote_title ...
看到很多人都发布了hibernate dao 我都看了下 也写了一份 很多人都提了建议,将查询抽取出来这个建议不错,我这个就是吸取了大家的建议,还加了分页标签。 -
whaosoft:
很佩服你这种钻研的精神
看到很多人都发布了hibernate dao 我都看了下 也写了一份 很多人都提了建议,将查询抽取出来这个建议不错,我这个就是吸取了大家的建议,还加了分页标签。
看到很多人都发布了hibernate dao 我都看了下 也写了一份 很多人都提了建议,将查询抽取出来这个建议不错,我这个就是吸取了大家的建议,还加了分页标签。
- 博客分类:
- Java EE
basedao接口:
查询类接口:
basedao 实现类:
查询实现类:
分页bean:
我的分页标签:支持条件筛选,因为每次翻页都是做的表单提交,因此再jsp页面使用时
需要用表单包围;
tld文件:
action里代码日下:
jsp页面使用如下:
分页效果2种样式:
如下:
首页 上一页 下一页 1 2 3 4 5 6.... 下一页 末页
或者是只显示数字, 或者是文字
还有就是关于怎么使用查询类
在业务bean 里 这样写
继承basedao 或者是注入:
还忘记一点了:
就是basedao实现类里还引用了一个类,序列化,反序列化方法//主要是为了拷贝出一份QueryBuilder
一直没有好的方法来实现对象拷贝,希望大家指点下
非常期待啊!!! 希望不要变成笑话!
非常期待啊!!! 希望不要变成笑话!
看清楚看不好 ,这个只是测试分页标签的查询条件怎么保持
为适应程序的扩展性能 where 条件用户提供要好些
同问?
public T get(ID id); 不是挺好吗
看清楚看不好 ,这个只是测试分页标签的查询条件怎么保持
分页是做的表单提交 ,所有之需要在分页标签中用表单包围 就可以了
每次都要密码 很烦 不知道怎么取消密码。。
这是我有一次弄着玩时 设的 ,不能够取消了 郁闷
密码123 应该能看到注释吧 上面有
解压出来重新压一次不就好了!
package org.ywq.common; import java.io.Serializable; import java.util.List; import org.hibernate.criterion.Criterion; import org.hibernate.criterion.Order; public interface IDAO<T,ID extends Serializable> { /** * 查询类clazz的所有对象. * * @param clazz * the type of objects (a.k.a. while table) to get data from * @return List of populated objects */ public List<T> getObjects(Class<T> clazz); /** * 根据类名和主键得到一个对象. * * @param clazz * model class to lookup * @param id * the identifier (primary key) of the class * @return a populated object * @see org.springframework.orm.ObjectRetrievalFailureException */ public Object getObject(Class<T> clazz, Serializable id); /** * 插入一个对象. * * @param o * the object to save */ public Object save(Object o); /** * 持久化一个对象,包括更新或插入. * * @param o * the object to save * */ public Object saveOrUpdate(Object o); /** * 更新一个对象. * * @param object */ public Object update(Object object); /** * 根据类和主键,删除一个对象. * * @param clazz * model class to lookup * @param id * the identifier (primary key) of the class */ public void removeObject(Class<T> clazz, Serializable id); /** * 删除一个对象. */ public void removeObject(Object object); /** * 批量删除对象. * * @param clazz * @param ids */ public void removeBatch(Class<T> clazz, Serializable[] ids); /** * 根据HQL查询设置. * * @param filter * @return */ public List<T> find(String query); /** * 根据查询设置得到查询结果 * * @param query * @return */ public List<T> find(QueryBuilder<T> queryBuilder); /** * * @param currentPage * 当前页码 * @param pageSize * 页大小 * @param queryBuilder * 查询类 * @return */ @SuppressWarnings("unchecked") public PageModel find(Integer currentPage, Integer pageSize, QueryBuilder queryBuilder); /** * 更新对象. * * @param object * 需要更新的对象. */ public void refresh(Object object); /** * 更新到数据库中. */ public void flush(); /** * 根据查询设置,得到分页的数据结果集. * * @param query * @param start * offset * @param length * size * @return */ public List<T> find(String query, Integer start, Integer length); /** * * @param queryBulider * 查询条件 * @param currentPage * 当前页 * @param pageSize * * @return */ public List<T> find(QueryBuilder<T> queryBulider, Integer currentPage, Integer pageSize); /** * 根据条件查询. * * @param hql * hql语句. * @param param * 参数. * @return 查询结果. */ public List<T> find(String hql, Serializable param); /** * 根据条件查询相关结果. * * @param clazz * 要查询的对象. * @param criterions * 查询条件. * @return 查询结果. */ public List<T> getList(Class<T> clazz, Criterion[] criterions); /** * @param clazz * @param criterions * @return */ public Object getFirst(Class<T> clazz, Criterion[] criterions); /** * @param class1 * @param 条件查询数组 * @param 排序 * @return */ public List<T> getList(Class<T> class1, Criterion[] criterions, Order[] orders); /** * @param className * @param criterions * @return */ public List<T> getList(String className, Criterion[] criterions); /** * @param className * @param sequenceName * @return */ public List<T> getNextId(String sequenceName); /** * @param qb * @return */ public int count(QueryBuilder<T> qb); /* * */ public int count(String hql); /** * 执行SQL语句, 返回影响结果的行数 * * @param sql * @return */ public int updateBySql(String sql); /** * 批量修改对象 * * @param objs * @param batchSize */ public void updateBatch(List<T> objs, int batchSize); }
查询类接口:
package org.ywq.common; import java.io.Serializable; import java.util.Collection; import java.util.List; import java.util.Map; import org.hibernate.criterion.Criterion; import org.hibernate.criterion.DetachedCriteria; import org.hibernate.criterion.MatchMode; import org.hibernate.criterion.Order; /** * 查询过滤类. * */ public interface QueryBuilder<T> extends Serializable { public void setDc(DetachedCriteria ec); public abstract QueryBuilder<T> clone(); /** * 判断是否相等 * @param propertyName * @param value */ public abstract QueryBuilder<T> eq(String propertyName, Object value); /** * 判断是否匹配 * @param propertyName * @param value */ public abstract QueryBuilder<T> like(String propertyName, Object value); /** * 根据matchMode判断是否匹配 * @param propertyName * @param value * @param matchMode */ public abstract QueryBuilder<T> like(String propertyName, String value, MatchMode matchMode); /** * 根据matchMode判断是否匹配 * @param propertyName * @param value * @param matchMode */ public abstract QueryBuilder<T> ilike(String propertyName, String value, MatchMode matchMode); /** * 判断时候不等 * @param propertyName * @param value */ public abstract QueryBuilder<T> ilike(String propertyName, Object value); /** * 判断是否大于 * @param propertyName * @param value */ public abstract QueryBuilder<T> gt(String propertyName, Object value); /** * 判断是否小于 * @param propertyName * @param value */ public abstract QueryBuilder<T> lt(String propertyName, Object value); /** * 判断是否小于等于 * @param propertyName * @param value */ public abstract QueryBuilder<T> le(String propertyName, Object value); /** * 判断是否大于等于 * @param propertyName * @param value */ public abstract QueryBuilder<T> ge(String propertyName, Object value); /** * 不等于. * @param propertyName * @param value */ public QueryBuilder<T> notEq(String propertyName, Object value); /** * 判断是否在给定的区间里 * @param propertyName * @param lo * @param hi */ public abstract QueryBuilder<T> between(String propertyName, Object lo, Object hi); /** * 判断是否在给定的数组里 * @param propertyName * @param values */ public abstract QueryBuilder<T> in(String propertyName, Object[] values); /** * 判断是否在给定的集合里 * @param propertyName * @param values */ public abstract QueryBuilder<T> in(String propertyName, Collection<T> values); /** * 判断是否为空 * @param propertyName */ public abstract QueryBuilder<T> isNull(String propertyName); /** * 判断属性值是否相等 * @param propertyName * @param otherPropertyName */ public abstract QueryBuilder<T> eqProperty(String propertyName, String otherPropertyName); /** * 判断属性值是否小于 * @param propertyName * @param otherPropertyName */ public abstract QueryBuilder<T> ltProperty(String propertyName, String otherPropertyName); /** * 判断属性值是否小于等于 * @param propertyName * @param otherPropertyName */ public abstract QueryBuilder<T> leProperty(String propertyName, String otherPropertyName); /** * 判断是否不等于 * @param propertyName */ public abstract QueryBuilder<T> isNotNull(String propertyName); /** * @param propertyNameValues * @return */ public abstract QueryBuilder<T> allEq(Map<T, T> propertyNameValues); /** * 添加排序 * @param orderBy * @return */ public abstract QueryBuilder<T> addOrderBy(Order orderBy); /** * 查询条件 * 不建议使用 * @param criterion * @return */ public abstract QueryBuilder<T> addCriterion(Criterion criterion); /** * * @return */ public abstract List<Order> getOrderBys(); /** * * @return */ public abstract DetachedCriteria getDetachedCriteria(); public abstract Class<T> getClazz(); }
basedao 实现类:
package org.ywq.common; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; import java.sql.SQLException; import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hibernate.Criteria; import org.hibernate.HibernateException; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.criterion.Criterion; import org.hibernate.criterion.DetachedCriteria; import org.hibernate.criterion.Order; import org.hibernate.criterion.Projections; import org.springframework.orm.hibernate3.HibernateCallback; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import org.springframework.util.Assert; import org.ywq.common.utils.ObjectWriteorRead; /** * 基本实现类 * * @spring.property name="sessionFactory" ref="sessionFactory" type="bean" * 注入sessionFactory */ public class BaseDAOHibernate<T> extends HibernateDaoSupport implements IDAO<T, Serializable> { @SuppressWarnings("unchecked") public PageModel<T> find(final Integer currentPage, final Integer pageSize, final QueryBuilder qb) { QueryBuilder newqb = null; if (qb != null) { ByteArrayOutputStream byteOut = new ByteArrayOutputStream(); ObjectWriteorRead.writeObject(qb, byteOut);// 序列化对象, 这里需要用到对象拷贝,一直没有好的办法,用克隆的方法没效果,所有暂时也不考虑效率了,这里希望大家提点建议 ByteArrayInputStream bytein = new ByteArrayInputStream(byteOut .toByteArray()); newqb = (QueryBuilder) ObjectWriteorRead.readObject(bytein);// 还原对象,以实现拷贝对象 Integer total = this.count(newqb); PageModel pm = new PageModel(); pm.setDatas(this.find(qb, currentPage, pageSize)); pm.setTotal(total); pm.setPagesize(pageSize); pm.setTotalPage((total + pageSize - 1) / pageSize); pm.setCurrenPage((currentPage)); return pm; } return null; } protected final Log log = LogFactory.getLog(getClass()); public BaseDAOHibernate() { System.out.println("creating BaseDAOHibernate... "); } @SuppressWarnings("unchecked") public List<T> getObjects(Class<T> clazz) { Assert.notNull(clazz, "要查询的对象类型不能为空!"); return getHibernateTemplate().loadAll(clazz); } public Object getObject(Class<T> clazz, Serializable id) { Assert.notNull(clazz, "要查询的对象类型不能为空!"); Assert.notNull(id, "要查询的对象主键不能为空!"); return getHibernateTemplate().get(clazz, id); } public Object save(Object o) { Assert.notNull(o, "要保存的对象不能为空!"); getHibernateTemplate().save(o); return o; } public Object saveOrUpdate(Object o) { Assert.notNull(o, "要保存或更新的对象类型不能为空!"); getHibernateTemplate().saveOrUpdate(o); return o; } public Object update(Object object) { Assert.notNull(object, "要更新的对象类型不能为空!"); getHibernateTemplate().update(object); return object; } @SuppressWarnings("unchecked") public void removeObject(Class<T> clazz, Serializable id) { Assert.notNull(clazz, "要移除的对象类型不能为空!"); Assert.notNull(id, "要移除的对象主键不能为空!"); Object object = getObject(clazz, id); if (object != null) { getHibernateTemplate().delete(object); } } public void removeObject(Object object) { Assert.notNull(object, "要移除的对象不能为空!"); getHibernateTemplate().delete(object); } public void removeBatch(final Class<T> clazz, final Serializable[] ids) { Assert.notNull(clazz, "要移除的对象类型不能为空!"); getHibernateTemplate().execute(new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { for (int i = 0; i < ids.length; i++) { Object obj = session.load(clazz, ids[i]); if (obj != null) { session.delete(obj); } else { log.warn("无法删除主键为:" + ids[i] + "的" + clazz.getName()); } } return null; } }); } @SuppressWarnings("unchecked") public List<T> find(String query) { Assert.notNull(query, "查询语句不能为空!"); return getHibernateTemplate().find(query); } public void refresh(Object object) { getHibernateTemplate().refresh(object); } public void flush() { getHibernateTemplate().flush(); } public List<T> find(String query, Integer start, Integer length) { return getObjects(query, start, length); } @SuppressWarnings("unchecked") public List<T> find(final QueryBuilder queryBuilder, final Integer currentPage, final Integer pageSize) { if (queryBuilder != null) { return (List<T>) getHibernateTemplate().execute( new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { DetachedCriteria dc = queryBuilder .getDetachedCriteria(); for (Object or : queryBuilder.getOrderBys()) { Order order = (Order) or; dc.addOrder(order); } if (currentPage != null && pageSize != null) { Criteria crit = dc .getExecutableCriteria(session); crit.setFirstResult((currentPage - 1) * pageSize); crit.setMaxResults(pageSize); } return dc.getExecutableCriteria(session).list(); } }, true); } return null; } @SuppressWarnings("unchecked") public List<T> getObjects(final String queryString, final int position, final int length) { Assert.notNull(queryString, "查询语句不能为空!"); return getHibernateTemplate().executeFind(new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query query = session.createQuery(queryString); query.setFirstResult(position); query.setMaxResults(length); List lt = query.list(); return lt; } }); } /* * (非 Javadoc) * */ public List<T> find(final QueryBuilder<T> queryBuilder) { if (queryBuilder != null) { return this.find(queryBuilder, null, null); } return null; } /** * @param hql * @param param * @return */ @SuppressWarnings("unchecked") public List<T> find(final String hql, final Serializable param) { Assert.notNull(hql, "查询语句不能为空!"); Assert.notNull(param, "查询参数不能为空!"); return getHibernateTemplate().find(hql, param); } /** * @param clazz * @param criterions * @return */ @SuppressWarnings("unchecked") public List<T> getList(final Class<T> clazz, final Criterion[] criterions) { Assert.notNull(clazz, "要查询的类不能为空!"); return getHibernateTemplate().executeFind(new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Criteria query = session.createCriteria(clazz); if (criterions != null && criterions.length > 0) { for (int i = 0; i < criterions.length; i++) { query.add(criterions[i]); } } return query.list(); } }); } /** * 得到查到的最前一个对象. * * @param clazz * 类名. * @param criterions * 查询条件. * @return 查询得到的结果. */ public Object getFirst(Class<T> clazz, Criterion[] criterions) { List<T> lt = getList(clazz, criterions); if (lt != null && !lt.isEmpty()) { return lt.get(0); } return null; } /** * @param clazz * @param criterions * @param orders * @return */ @SuppressWarnings("unchecked") public List<T> getList(final Class<T> clazz, final Criterion[] criterions, final Order[] orders) { Assert.notNull(clazz, "要查询的类不能为空!"); return getHibernateTemplate().executeFind(new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Criteria criteria = session.createCriteria(clazz); if (criterions != null && criterions.length > 0) { for (int i = 0; i < criterions.length; i++) { criteria.add(criterions[i]); } } if (orders != null && orders.length > 0) { for (int i = 0; i < orders.length; i++) { criteria.addOrder(orders[i]); } } return criteria.list(); } }); } /** * @param className * @param criterions * @return */ @SuppressWarnings("unchecked") public List<T> getList(final String className, final Criterion[] criterions) { Assert.notNull(className, "要查询的类名不能为空"); return getHibernateTemplate().executeFind(new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Criteria criteria = null; try { criteria = session.createCriteria(Class.forName(className)); } catch (ClassNotFoundException e) { logger .error( "$HibernateCallback.doInHibernate(Session) - 找不到类错误 - e=" + e, e); //$NON-NLS-1$ throw new IllegalArgumentException("传入的类名是错误的,classname = " + className); } if (criterions != null && criterions.length > 0) { for (int i = 0; i < criterions.length; i++) { criteria.add(criterions[i]); } } return criteria.list(); } }); } /** * @param className * @param sequenceName * @return */ @SuppressWarnings("unchecked") public List<T> getNextId(final String sequenceName) { return getHibernateTemplate().executeFind(new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query query = null; query = session.createSQLQuery("select " + sequenceName + ".nextval from dual"); return query.list(); } }); } public int count(final String hql) { return ((Integer) getHibernateTemplate().execute( new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query query = session.createQuery(hql); return query.setProperties(Projections.rowCount()) .uniqueResult(); } }, true)).intValue(); } /** * @param qb * @return */ public int count(final QueryBuilder<T> queryBuilder) { return ((Integer) getHibernateTemplate().execute( new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { System.out.println(session.isOpen()); DetachedCriteria dc = queryBuilder .getDetachedCriteria(); Criteria ct = dc.getExecutableCriteria(session); return ct.setProjection(Projections.rowCount()) .uniqueResult(); } }, true)).intValue(); } public int updateBySql(final String sql) { super.getHibernateTemplate().execute(new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { int iRet = session.createSQLQuery(sql).executeUpdate(); return iRet; } }); return -1; } public void updateBatch(final List<T> objs, final int batchSize) { super.getHibernateTemplate().execute(new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { int count = 0; for (Object o : objs) { session.update(o); if (++count % batchSize == 0) { session.flush(); session.clear(); } } return true; } }); } }
查询实现类:
package org.ywq.common; import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; import org.apache.commons.lang.builder.EqualsBuilder; import org.apache.commons.lang.builder.HashCodeBuilder; import org.apache.commons.lang.builder.ToStringBuilder; import org.apache.commons.lang.builder.ToStringStyle; import org.hibernate.criterion.Criterion; import org.hibernate.criterion.DetachedCriteria; import org.hibernate.criterion.MatchMode; import org.hibernate.criterion.Order; import org.hibernate.criterion.Restrictions; /** * 使用hibernate进行查询的实现. * */ public class HibernateQueryBuilder<T> implements QueryBuilder<T>, Serializable, Cloneable { @SuppressWarnings("unchecked") public HibernateQueryBuilder<T> clone() { HibernateQueryBuilder<T> qb = null; try { qb = (HibernateQueryBuilder<T>) super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return qb; } /** * */ private static final long serialVersionUID = -7000654904767633672L; private DetachedCriteria dc = null; private List<Order> orderLists = new ArrayList<Order>(); private Class<T> clazz = null; public HibernateQueryBuilder(Class<T> clazz) { this.clazz = clazz; dc = DetachedCriteria.forClass(clazz); } public Class<T> getClazz() { return clazz; } public void setDc(DetachedCriteria dc) { this.dc = dc; } public QueryBuilder<T> eq(String propertyName, Object value) { if (isNotEmpty(value)) { dc.add(Restrictions.eq(propertyName, value)); } return this; } /** * 不等于. * * @param propertyName * @param value * @return */ public QueryBuilder<T> notEq(String propertyName, Object value) { if (isNotEmpty(value)) { dc.add(Restrictions.ne(propertyName, value)); } return this; } private boolean isNotEmpty(Object value) { return value != null && value.toString().trim().length() > 0; } public QueryBuilder<T> like(String propertyName, Object value) { if (isNotEmpty(value)) { dc.add(Restrictions.like(propertyName, value)); } return this; } public QueryBuilder<T> like(String propertyName, String value, MatchMode matchMode) { if (isNotEmpty(value)) { dc.add(Restrictions.like(propertyName, value, matchMode)); } return this; } public QueryBuilder<T> ilike(String propertyName, String value, MatchMode matchMode) { if (isNotEmpty(value)) { dc.add(Restrictions.ilike(propertyName, value, matchMode)); } return this; } public QueryBuilder<T> ilike(String propertyName, Object value) { if (isNotEmpty(value)) { dc.add(Restrictions.ilike(propertyName, value)); } return this; } public QueryBuilder<T> gt(String propertyName, Object value) { if (isNotEmpty(value)) { dc.add(Restrictions.gt(propertyName, value)); } return this; } public QueryBuilder<T> lt(String propertyName, Object value) { if (isNotEmpty(value)) { dc.add(Restrictions.lt(propertyName, value)); } return this; } public QueryBuilder<T> le(String propertyName, Object value) { if (isNotEmpty(value)) { dc.add(Restrictions.le(propertyName, value)); } return this; } public QueryBuilder<T> ge(String propertyName, Object value) { if (isNotEmpty(value)) { dc.add(Restrictions.ge(propertyName, value)); } return this; } public QueryBuilder<T> between(String propertyName, Object lo, Object hi) { if (isNotEmpty(lo) && isNotEmpty(hi)) { dc.add(Restrictions.between(propertyName, lo, hi)); } else if (isNotEmpty(lo)) { dc.add(Restrictions.ge(propertyName, lo)); } else if (isNotEmpty(hi)) { dc.add(Restrictions.le(propertyName, hi)); } return this; } public QueryBuilder<T> in(String propertyName, Object[] values) { if (values != null && values.length > 0) { dc.add(Restrictions.in(propertyName, values)); } return this; } public QueryBuilder<T> in(String propertyName, Collection<T> values) { if (values != null && values.size() > 0) { dc.add(Restrictions.in(propertyName, values)); } return this; } public QueryBuilder<T> isNull(String propertyName) { dc.add(Restrictions.isNull(propertyName)); return this; } public QueryBuilder<T> eqProperty(String propertyName, String otherPropertyName) { dc.add(Restrictions.eqProperty(propertyName, otherPropertyName)); return this; } public QueryBuilder<T> ltProperty(String propertyName, String otherPropertyName) { dc.add(Restrictions.ltProperty(propertyName, otherPropertyName)); return this; } public QueryBuilder<T> leProperty(String propertyName, String otherPropertyName) { dc.add(Restrictions.leProperty(propertyName, otherPropertyName)); return this; } public QueryBuilder<T> isNotNull(String propertyName) { dc.add(Restrictions.isNotNull(propertyName)); return this; } public QueryBuilder<T> allEq(Map<T, T> propertyNameValues) { dc.add(Restrictions.allEq(propertyNameValues)); return this; } public QueryBuilder<T> addOrderBy(Order orderBy) { orderLists.add(orderBy); return this; } public DetachedCriteria getDetachedCriteria() { return dc; } public List<Order> getOrderBys() { return orderLists; } public QueryBuilder<T> addCriterion(Criterion criterion) { if (criterion != null) { dc.add(criterion); } return this; } @SuppressWarnings("unchecked") public boolean equals(Object object) { if (!(object instanceof HibernateQueryBuilder)) { return false; } HibernateQueryBuilder<T> rhs = (HibernateQueryBuilder<T>) object; return new EqualsBuilder().append(this.clazz, rhs.clazz).isEquals(); } public int hashCode() { return new HashCodeBuilder(-2022315247, 1437659757).append(this.clazz) .toHashCode(); } public String toString() { return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) .append("orderLists", this.orderLists).append("clazz", this.clazz).toString(); } }
分页bean:
package org.ywq.common; import java.util.List; /** * @author ai5qiangshao E-mail:ai5qiangshao@163.com * @version 创建时间:Aug 5, 2009 9:47:42 PM * @Package org.ywq.common * @Description 类说明 */ public class PageModel<T> { private List<T> datas; private Integer total; private Integer totalPage=1; private Integer pagesize; private Integer currenPage=1; public Integer getCurrenPage() { return currenPage; } public void setCurrenPage(Integer currenPage) { this.currenPage = currenPage; } public Integer getPagesize() { return pagesize; } public void setPagesize(Integer pagesize) { this.pagesize = pagesize; } public List<T> getDatas() { return datas; } public void setDatas(List<T> datas) { this.datas = datas; } public Integer getTotal() { return total; } public void setTotal(Integer total) { this.total = total; } public Integer getTotalPage() { return totalPage; } public void setTotalPage(Integer totalPage) { this.totalPage = totalPage; } }
我的分页标签:支持条件筛选,因为每次翻页都是做的表单提交,因此再jsp页面使用时
需要用表单包围;
package org.ywq.tag; import java.io.IOException; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.SimpleTagSupport; /** * @author ai5qiangshao E-mail:ai5qiangshao@163.com * @version 创建时间:Aug 7, 2009 10:05:29 AM * @Package org.ywq.tag * @Description 类说明 */ public class PageTag extends SimpleTagSupport { public PageTag() { } private String currentPage; private String totalPage; private String url; private String theme = "both"; public String getCurrentPage() { return currentPage; } public void setCurrentPage(String currentPage) { this.currentPage = currentPage; } public String getTotalPage() { return totalPage; } public void setTotalPage(String totalPage) { this.totalPage = totalPage; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String submitAction() { StringBuffer bf = new StringBuffer(); bf.append("<script language=\""); bf.append("JavaScript"); bf.append("\"").append(">").append("\n"); bf.append("function topage("); bf.append("action"); bf.append("){"); bf.append("\n"); bf.append("var form = document.forms[0];").append("\n"); bf.append("form.action=action;"); bf.append("\n"); bf.append("form.submit();"); bf.append("}\n"); bf.append("</script>"); return bf.toString(); } @Override public void doTag() throws JspException, IOException { JspWriter out = super.getJspContext().getOut(); StringBuffer bf = new StringBuffer(); bf.append(this.submitAction()); if (theme.equals("both")) { bf.append(this.text()); } else if (theme.equals("number")) { bf.append(this.number()); } else if (theme.equals("text")) { bf.append(this.text()); } //System.out.println(bf.toString()); out.println(bf.toString()); } private String number() { String pageNoStr = getPageNoStr(); System.out.println(pageNoStr); StringBuffer str = new StringBuffer(); Integer totalInt = Integer.valueOf(totalPage); str.append("[ "); if (totalInt == 1) { str.append("<strong>1</strong> "); } else { int cpageInt = Integer.parseInt(this.getCurrentPage()); System.out.println(cpageInt + "============当前页"); int v = (cpageInt - 4) > 0 ? (cpageInt - 4) : 1; int v1 = (cpageInt + 4) < totalInt ? (cpageInt + 4) : totalInt; if (v1 == totalInt) { v = totalInt - 6; v = (v <= 0 ? 1 : v); // 如果为负数,则修改为1 } else if (v == 1 && v1 < totalInt) { v1 = totalInt > 6 ? 6 : totalInt; } // 10个为一组显示 for (int i = v; i <= v1; i++) { if (cpageInt == i) { // 当前页要加粗显示 str.append("<strong>" + i + "</strong> "); } else { str.append("<a href=\"").append("javascript:").append("topage('" + url + pageNoStr + i + "')"); str.append("\"").append(">").append(i).append("</a>"); str.append(" "); } } } str.append("]"); return str.toString(); } private String text() { StringBuilder str = new StringBuilder(); String pageNoStr = getPageNoStr(); int cpageInt = Integer.parseInt(currentPage); if (currentPage.equals(totalPage)) { if ("1".equals(totalPage)) { str.append("[第 " + currentPage + " 页]"); str.append(" [共 " + totalPage + " 页]"); } else { str.append("<a href=\"").append("javascript:").append( "topage('" + url + pageNoStr + 1 + "')"); str.append("\"").append(">").append("[首页]").append("</a>") .append(" "); str.append("<a href=\"").append("javascript:").append( "topage('" + url + pageNoStr + (cpageInt - 1) + "')"); str.append("\"").append(">").append("[上一页]").append("</a>") .append(" "); if (this.theme.equals("both")) { str.append(this.number()); } str.append("<a href=\"").append("javascript:").append( "topage('" + url + pageNoStr + totalPage + "')"); str.append("\"").append(">").append("[末页]").append("</a>") .append(" "); } } else { if ("1".equals(currentPage)) { str.append("<a href=\"").append("javascript:").append( "topage('" + url + pageNoStr + 1 + "')"); str.append("\"").append(">").append("[首页]").append("</a>") .append(" "); if (this.theme.equals("both")) { str.append(this.number()); } str.append("<a href=\"").append("javascript:").append( "topage('" + url + pageNoStr + (cpageInt + 1) + "')"); str.append("\"").append(">").append("[下一页]").append("</a>") .append(" "); str.append("<a href=\"").append("javascript:").append( "topage('" + url + pageNoStr + totalPage + "')"); str.append("\"").append(">").append("[末页]").append("</a>") .append(" "); } else { str.append("<a href=\"").append("javascript:").append( "topage('" + url + pageNoStr + 1 + "')"); str.append("\"").append(">").append("[首页]").append("</a>") .append(" "); str.append("<a href=\"").append("javascript:").append( "topage('" + url + pageNoStr + (cpageInt - 1) + "')"); str.append("\"").append(">").append("[上一页]").append("</a>") .append(" "); if (this.theme.equals("both")) { str.append(this.number()); } str.append("<a href=\"").append("javascript:").append( "topage('" + url + pageNoStr + (cpageInt + 1) + "')"); str.append("\"").append(">").append("[下一页]").append("</a>") .append(" "); str.append("<a href=\"").append("javascript:").append( "topage('" + url + pageNoStr + totalPage + "')"); str.append("\"").append(">").append("[末页]").append("</a>") .append(" "); } } return str.toString(); } public static void main(String[] args) { PageTag tag = new PageTag(); tag.setCurrentPage("2"); tag.setTotalPage("30"); tag.setUrl("http://localhost:8080/test.do"); tag.setTheme("text"); System.out.println(tag.text()); } public String getTheme() { return theme; } public void setTheme(String theme) { this.theme = theme; } public String getPageNoStr() { if (url.indexOf("?") != -1) { return "&pageNo="; } else return "?pageNo="; } }
tld文件:
<?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd"> <taglib> <tlib-version>1.0</tlib-version> <jsp-version>1.2</jsp-version> <short-name>page</short-name> <uri>http://ai5qiangshao@126.com/page</uri> <display-name>page</display-name> <tag> <name>pg</name> <tag-class>org.ywq.tag.PageTag</tag-class> <body-content>empty</body-content> <attribute> <name>currentPage</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>totalPage</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>url</name> <required>true</required> </attribute> <attribute> <name>theme</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag> </taglib>
action里代码日下:
String strnum=request.getParameter("pageNo"); System.out.println(strnum); Integer page = Integer.parseInt(strnum==null?"1":strnum); String where=((DynaActionForm)form).getString("query"); System.out.println(where+"==========="); request.setAttribute("pageModel", userService.list(page, 5,where)); return mapping.findForward("list");
jsp页面使用如下:
<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%> <%@ taglib prefix="page" uri="/WEB-INF/page.tld"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <%@ taglib prefix="bean" uri="http://struts.apache.org/tags-bean"%> <%@ taglib prefix="html" uri="http://struts.apache.org/tags-html"%> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>My JSP 'pagesplit.jsp' starting page</title> </head> <body> <table> <tr> <td> ID </td> <td> NAME </td> <td> AGE </td> <td> SEX </td> </tr> <c:forEach var="user" items="${pageModel.datas}"> <tr> <td> ${user.uid } </td> <td> ${user.uname } </td> <td> ${user.usex } </td> <td> ${user.uage } </td> </tr> </c:forEach> </table> <c:if test="${! empty pageModel.datas}"> <html:form action="user/userManager.do?method=list" method="post"> <html:text property="query" /> <page:pg url="/SSH/user/userManager.do?method=list" totalPage="${pageModel.totalPage}" currentPage="${pageModel.currenPage}"></page:pg> </html:form> </c:if> </body> </html>
分页效果2种样式:
如下:
首页 上一页 下一页 1 2 3 4 5 6.... 下一页 末页
或者是只显示数字, 或者是文字
还有就是关于怎么使用查询类
在业务bean 里 这样写
继承basedao 或者是注入:
public PageModel<User> list(Integer currPage, Integer pageSize,String where) { QueryBuilder<User> qb = new HibernateQueryBuilder<User>(User.class) .addOrderBy(Order.asc("uid")); qb.like("uname", "%"+where+"%");//需要的条件都可以再这里点出来(如in like not in order by .....) return dao.find(currPage, pageSize, qb); }
还忘记一点了:
就是basedao实现类里还引用了一个类,序列化,反序列化方法//主要是为了拷贝出一份QueryBuilder
一直没有好的方法来实现对象拷贝,希望大家指点下
package org.ywq.common.utils; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.OutputStream; import org.ywq.common.QueryBuilder; /** * @author ai5qiangshao E-mail:ai5qiangshao@163.com * @version 创建时间:Aug 9, 2009 5:29:15 PM * @Package org.ywq.common.utils * @Description 类说明 */ public class ObjectWriteorRead { public static void writeObject(Object o) { ObjectWriteorRead.writeObject(o, null); } public static void writeObject(Object o, OutputStream output) { ByteArrayOutputStream byteOut = new ByteArrayOutputStream(); try { ObjectOutputStream out = new ObjectOutputStream( output == null ? byteOut : output); out.writeObject(o); } catch (IOException e) { e.printStackTrace(); } } public static Object readObject(InputStream input) { Object o = null; try { ObjectInputStream in = new ObjectInputStream(input); o = in.readObject(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return o; } }
评论
52 楼
tangbo530
2009-08-14
aiyanbo 写道
tangbo530 写道
我用一行代码就可以代替你写的所有
非常期待啊!!! 希望不要变成笑话!
public interface BaseDAO extends HibernateOperations{} public class BaseDAOImpl extends HibernateTemplate implements BaseDAO {
51 楼
whaosoft
2009-08-14
很佩服你这种钻研的精神
50 楼
leon0122
2009-08-14
看这代码还不如给个类关系图看的更清楚些
49 楼
qiangshao
2009-08-14
<div class="quote_title">fhjxp 写道</div>
<div class="quote_div">
<pre name="code" class="java"> /**
* 根据类名和主键得到一个对象.
*
* @param clazz
* model class to lookup
* @param id
* the identifier (primary key) of the class
* @return a populated object
* @see org.springframework.orm.ObjectRetrievalFailureException
*/
public Object getObject(Class<T> clazz, Serializable id);</pre>
<p><br>用范型就要使用彻底,比如上面这个方法就应该这样写:public <T> T getObject(final Class<T> clazz, final Serializable id);,另外PageModel也应该是可以支持范型的。</p>
<p> </p>
</div>
<p> </p>
<p>PageModel是支持泛型的</p>
<div class="quote_div">
<pre name="code" class="java"> /**
* 根据类名和主键得到一个对象.
*
* @param clazz
* model class to lookup
* @param id
* the identifier (primary key) of the class
* @return a populated object
* @see org.springframework.orm.ObjectRetrievalFailureException
*/
public Object getObject(Class<T> clazz, Serializable id);</pre>
<p><br>用范型就要使用彻底,比如上面这个方法就应该这样写:public <T> T getObject(final Class<T> clazz, final Serializable id);,另外PageModel也应该是可以支持范型的。</p>
<p> </p>
</div>
<p> </p>
<p>PageModel是支持泛型的</p>
48 楼
aiyanbo
2009-08-14
tangbo530 写道
我用一行代码就可以代替你写的所有
非常期待啊!!! 希望不要变成笑话!
47 楼
aiyanbo
2009-08-14
M296496546 写道
daquan198163 写道
String where=((DynaActionForm)form).getString("query");
System.out.println(where+"===========");
request.setAttribute("pageModel", userService.list(page, 5,where));
难道要用户来提供where条件?
System.out.println(where+"===========");
request.setAttribute("pageModel", userService.list(page, 5,where));
难道要用户来提供where条件?
看清楚看不好 ,这个只是测试分页标签的查询条件怎么保持
为适应程序的扩展性能 where 条件用户提供要好些
46 楼
fhjxp
2009-08-14
<pre name="code" class="java"> /**
* 根据类名和主键得到一个对象.
*
* @param clazz
* model class to lookup
* @param id
* the identifier (primary key) of the class
* @return a populated object
* @see org.springframework.orm.ObjectRetrievalFailureException
*/
public Object getObject(Class<T> clazz, Serializable id);</pre>
<p><br>用范型就要使用彻底,比如上面这个方法就应该这样写:public <T> T getObject(final Class<T> clazz, final Serializable id);,另外PageModel也应该是可以支持范型的。</p>
<p> </p>
* 根据类名和主键得到一个对象.
*
* @param clazz
* model class to lookup
* @param id
* the identifier (primary key) of the class
* @return a populated object
* @see org.springframework.orm.ObjectRetrievalFailureException
*/
public Object getObject(Class<T> clazz, Serializable id);</pre>
<p><br>用范型就要使用彻底,比如上面这个方法就应该这样写:public <T> T getObject(final Class<T> clazz, final Serializable id);,另外PageModel也应该是可以支持范型的。</p>
<p> </p>
45 楼
edwardpro
2009-08-14
很多年前写过...
44 楼
01404421
2009-08-14
非常支持LZ写这样的东西,我以前也写过一个,使用在两个小项目当中运行还不错,最后发现在做稍微大点的项目是还是用Spring+Hibernate来做比较好,毕竟效率、缓存、多表、事务操作还是使用现成稳定的工具比较好
43 楼
liusong1220
2009-08-14
jessdy 写道
没什么新意的东西,都完善了几年的东西了
顺便提一下
都用了这么多范型了,这个干吗不用,还返回Object?
顺便提一下
qiangshao 写道
basedao接口:
/** * 根据类名和主键得到一个对象. * * @param clazz * model class to lookup * @param id * the identifier (primary key) of the class * @return a populated object * @see org.springframework.orm.ObjectRetrievalFailureException */ public Object getObject(Class<T> clazz, Serializable id);
都用了这么多范型了,这个干吗不用,还返回Object?
同问?
public T get(ID id); 不是挺好吗
42 楼
lucky16
2009-08-13
暂时却是用不上,
但是给我的感觉就是代码好长,
希望下次注意啊!
但是给我的感觉就是代码好长,
希望下次注意啊!
41 楼
M296496546
2009-08-13
daquan198163 写道
String where=((DynaActionForm)form).getString("query");
System.out.println(where+"===========");
request.setAttribute("pageModel", userService.list(page, 5,where));
难道要用户来提供where条件?
System.out.println(where+"===========");
request.setAttribute("pageModel", userService.list(page, 5,where));
难道要用户来提供where条件?
看清楚看不好 ,这个只是测试分页标签的查询条件怎么保持
40 楼
daquan198163
2009-08-13
String where=((DynaActionForm)form).getString("query");
System.out.println(where+"===========");
request.setAttribute("pageModel", userService.list(page, 5,where));
难道要用户来提供where条件?
System.out.println(where+"===========");
request.setAttribute("pageModel", userService.list(page, 5,where));
难道要用户来提供where条件?
39 楼
曾经de迷茫
2009-08-13
大部分代码是 getHibernateTemplate()....
多了个参数判断..
包括分业标签,Apache开源里都有啊.
不过楼主是很有耐心的说.
多了个参数判断..
包括分业标签,Apache开源里都有啊.
不过楼主是很有耐心的说.
38 楼
airport
2009-08-13
是一个好的总结
不过现在来说,有点太繁琐了
现在用spring,接口都可以省略了
不过现在来说,有点太繁琐了
现在用spring,接口都可以省略了
37 楼
qiangshao
2009-08-13
wenming200882 写道
好东西 支持一下 代码还没仔细研究 有个问题查询结果分页 怎样保存查询条件呢
分页是做的表单提交 ,所有之需要在分页标签中用表单包围 就可以了
36 楼
cats_tiger
2009-08-13
其实东西做的不错,只是比起HibernateTemplate、SpringSide之类似乎没有什么突破。
35 楼
energykey
2009-08-13
这东西估计有个几年经验都会写一个自己的吧?~
我也有一个自己的,呵呵。
不过现在项目用struts2+ftl啦,jsp tag用不了了。。。不过底层的还是在用。
楼主很有耐心,客观地说,写的不错~
我也有一个自己的,呵呵。
不过现在项目用struts2+ftl啦,jsp tag用不了了。。。不过底层的还是在用。
楼主很有耐心,客观地说,写的不错~
34 楼
8vip
2009-08-13
qiangshao 写道
bavnnsym 写道
解压的时候要密码
每次都要密码 很烦 不知道怎么取消密码。。
这是我有一次弄着玩时 设的 ,不能够取消了 郁闷
密码123 应该能看到注释吧 上面有
解压出来重新压一次不就好了!
33 楼
daquan198163
2009-08-13
QueryBuilder只是在criterial外面有包了一层,看不出什么存在的必要。
相关推荐
- **设计模式**:考虑使用模板方法模式或者策略模式,将通用的数据库操作抽象出来,使得`HibernateDao.java`更具有复用性和灵活性。 总结,`HibernateDao.java`是Hibernate框架在实际项目中的重要实现,它封装了...
hibernateDao工具类
本资源“Hibernate_通用DAO模式”提供了一种适用于不同类型表单的DAO实现,基于SSH(Struts2、Spring、Hibernate)框架,特别强调简洁、易懂和高可移植性。 首先,SSH框架是Java Web开发中的经典组合,Struts2负责...
HibernateDao 是一种基于 Hibernate ORM(对象关系映射)框架的通用数据访问对象,它简化了对数据库的操作,提供了更高级别的抽象,使开发者能够更加专注于业务逻辑而不是底层的数据操作。在Java开发中,Hibernate...
"Hibernate封装DAO层"就是将Hibernate的功能整合到DAO设计模式中,以实现更加高效、规范的数据库操作。 1. **DAO设计模式**: DAO模式是软件设计模式的一种,它的核心思想是创建一个独立于具体数据库操作的对象,...
Hibernate DAO(Data Access Object)生成工具是用于自动化创建数据访问层对象的实用程序,它可以显著提高开发效率,尤其是在处理大量数据库交互的项目中。DAO模式是一种设计模式,它提供了对数据库操作的抽象,使得...
本文将详细探讨HibernateDAO的实现方式以及常见设计模式,旨在帮助开发者更好地理解和运用这一技术。 1. HibernateDAO的基本概念 HibernateDAO(Data Access Object)主要负责数据库的读写操作,它封装了对...
**Hibernate原生通用DAO**是基于Hibernate框架设计的一种简化数据访问操作的方式,它模仿了Spring框架中的`HibernateTemplate`类,旨在提供一个简单易用的DAO(Data Access Object)层,方便开发人员进行数据库操作...
本文将深入探讨如何使用代理来实现Hibernate Dao层的自动事务管理,以提高代码的可维护性和事务处理的效率。 首先,理解Dao(Data Access Object)层的作用至关重要。Dao层是应用与数据库之间的一层抽象,它封装了...
本文将围绕“Hibernate超级通用DAO”这一主题,深入探讨如何构建一个功能强大的DAO层,实现包括增、删、改、查以及多条件模糊查询在内的各种功能。 首先,Hibernate是一个流行的Java ORM(对象关系映射)框架,它...
spring集成hibernate通用dao,泛型,server都可以调用
此外,了解SQL语言也是必要的,虽然Hibernate可以自动生成SQL,但在某些复杂查询场景下,可能需要手动编写SQL。最后,熟悉Spring框架和其他与Hibernate整合的技术,如Spring Data JPA,能够进一步提升开发效率。
开发HIBERNATE,只要继承此类.一切变得简单多了. 继承的DAO类可一行代码实行增,删,改. 另外也支持查询.分页查询. 在事务方面还不完善. 代码是我自己写的.资源分要使用5点. 但大家可以在下载后点评一下.这样5点的积分...
**DAO(Data Access Object)模式**是软件设计模式中用于处理数据访问的一种方式,它将业务逻辑与数据访问层分离,提高代码的可重用性和可维护性。在Java领域,尤其是在企业级应用开发中,DAO模式常与ORM(Object-...
本篇将深入探讨Hibernate中的通用DAO实现及其相关知识点。 **一、Hibernate简介** Hibernate是一个开源的ORM框架,它通过映射Java类到数据库表,实现了对象和关系数据库之间的无缝转换。通过使用Hibernate,开发者...
**hibernate通用DAO(Data Access Object)**是软件开发中的一个重要概念,它主要用于数据库操作的抽象,使得业务逻辑层可以无需关注具体的SQL语句,从而实现数据访问的解耦。在Java EE应用中,Hibernate作为一款...
### 一个通用的Hibernate DAO知识点解析 #### 一、标题:一个通用的Hibernate DAO - **含义**:此标题指的是一种使用Hibernate框架实现的数据访问对象(DAO)设计模式的具体实现方式。它强调了该DAO类是通用的,...
**Hibernate DAO生成器详解** 在Java开发中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它使得Java开发者能够方便地操作数据库,无需过多关注SQL的细节。然而,随着项目规模的扩大,手动编写数据访问对象...
标题中的“hibernate4 通用dao,service”指的是在Java开发中使用Hibernate框架实现的通用数据访问对象(DAO)和业务服务层(Service)。Hibernate是一个流行的对象关系映射(ORM)工具,它允许开发者使用面向对象的...