优点:简单的和基础的CRUD功能可以很快实现,可以说是比较的“标准化”。维护起来也很容易。
缺点:性能没有保障。不支持特别复杂的CRUD。
可以适用的场景:小型Web项目
1.CrudDao完成最基本的增删改查
包括增加一个对象create、根据主键获得对象get、更新一个持久化的对象update、逻辑删除一个对象remove、逻辑恢复一个对象recover、物理删除一个持久化的对象delete、更新属性(TODO,需要增加where限制)、更新属性update。
package cn.fansunion.hibernate; import java.lang.reflect.ParameterizedType; import java.util.Map; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.springframework.beans.factory.annotation.Autowired; import cn.fansunion.hibernate.constants.CommonConstants; import cn.fansunion.hibernate.constants.StatusConstants; import cn.fansunion.hibernate.sql.update.HqlUpdateBuilder; import cn.fansunion.hibernate.util.Pair; /** * Dao基类,完成最基本的增删改查操作。 * * @author LeiWen@FansUnion.cn */ public class CrudDao<T> { /** * 表的实体类型 */ protected Class<T> modelClazz; @Autowired protected SessionFactory sessionFactory; public CrudDao() { this.modelClazz = (Class<T>) ((ParameterizedType) getClass() .getGenericSuperclass()).getActualTypeArguments()[0]; } // ////////////////////////////////////////////////////// // ///////////泛型方法-CRUD///////////////////////// // ///////////////////////////////////////////////////// /** * 根据主键(唯一标志)查询一条记录 * * @param id * 主键 * @return 一条记录对应的实体对象 */ public T get(Integer id) { T entity = (T) getCurrentSession().get(modelClazz, id); return entity; } /** * 向数据库插入一条记录 * * @param entity * 与数据库表对应的实体对象 */ public void create(T entity) { getCurrentSession().save(entity); } /** * 更新一条记录 * * @param entity * 持久态的实体对象 */ public void update(T entity) { getCurrentSession().update(entity); } /** * 根据主键(唯一标志),逻辑删除一条记录 * * @param id * 主键 */ public void remove(Integer id) { updateProperties(new Pair(CommonConstants.ID, id), new Pair( CommonConstants.IS_DELETED, StatusConstants.DELETED)); } /** * 根据主键(唯一标志),恢复一条记录 * * @param id * 主键 */ public void recover(Integer id) { updateProperties(new Pair(CommonConstants.ID, id), new Pair( CommonConstants.IS_DELETED, StatusConstants.NORMAL)); } /** * 物理删除一条记录 * * @param entity * 持久态的实体对象 */ public void delete(T entity) { getCurrentSession().delete(entity); } /** * 获取主数源 */ protected Session getCurrentSession() { return sessionFactory.getCurrentSession(); } // /////////////////////////////////////////////// // /////根据属性更新(TODO 增加where限制)////////// // /////////////////////////////////////////////// /** * 根据1个属性更新(谨慎使用) * * @param key * 属性名称 * @param value * 属性的值 * @return 更新的记录数 */ public Integer updateProperty(String key, Object value) { HqlUpdateBuilder builder = new HqlUpdateBuilder(); String hql = builder.param(key, value).toHql(); return update(hql, key, value); } /** * 根据0个、1个或多个属性更新(强烈建议,至少使用2个键值对) */ public Integer updateProperties(Pair... pair) { HqlUpdateBuilder builder = new HqlUpdateBuilder(); String hql = builder.param(pair).toHql(); return update(hql, pair); } /** * 根据多个键值对,更新记录 */ public Integer updateProperties(Map<String, Object> params) { HqlUpdateBuilder builder = new HqlUpdateBuilder(); String hql = builder.param(params).toHql(); return update(hql, params); } /** * 根据hql语句和键值对,更新记录 * * @param hql * hql语句 * @param key * 属性名称 * @param value * 属性的值 * @return */ public Integer update(String hql, String key, Object value) { Map<String, Object> params = createMap(key, value); return update(hql, params); } public Integer update(String hql, Pair... pair) { Map<String, Object> params = createMap(pair); return update(hql, params); } public Integer update(String hql, Map<String, Object> params) { Query query = createQuery(hql, params); return query.executeUpdate(); } // /////////////////////////////////////////////// // ////////////创建Query对象///////////////////////// // /////////////////////////////////////////////// protected Query createQuery(String hql, Map<String, Object> params) { return DaoUtils.createQuery(getCurrentSession(), hql, params); } protected Query createQuery(String hql, String key, Object value) { return DaoUtils.createQuery(getCurrentSession(), hql, key, value); } protected Query createQuery(String hql) { return DaoUtils.createQuery(getCurrentSession(), hql); } protected Map<String, Object> createMap() { return DaoUtils.createMap(); } protected Map<String, Object> createMap(String key, Object value) { return DaoUtils.createMap(key, value); } protected Map<String, Object> createMap(Pair... pair) { return DaoUtils.createMap(pair); } }
2.BasicQueryUpdateDao完成几个较为通用的几个功能
包括获取记录总数count、获取一个列表list、获得唯一结果unique。
package cn.fansunion.hibernate; import java.util.List; import java.util.Map; import org.hibernate.Query; import cn.fansunion.hibernate.util.EmptyUtils; import cn.fansunion.hibernate.util.PageConstants; import cn.fansunion.hibernate.util.PageUtils; import cn.fansunion.hibernate.util.Pair; /** * 完成基本的查询操作。 * * @author LeiWen@FansUnion.cn */ public class BasicQueryUpdateDao<T> extends CrudDao<T> { public static final boolean NOT_PAGE = false; public static final boolean NEED_PAGE = true; // /////////////////////////////////////////////// // ////////////获取记录总数///////////////////////// // /////////////////////////////////////////////// public Integer count(String hql) { Query query = createQuery(hql); Integer count = doCount(query); return count; } public Integer count(String hql, String key, Object value) { Query query = createQuery(hql, key, value); Integer count = doCount(query); return count; } public Integer count(String hql, Pair... pair) { Map<String, Object> params = createMap(pair); return count(hql, params); } public Integer count(String hql, Map<String, Object> params) { Query query = createQuery(hql, params); Integer count = doCount(query); return count; } protected Integer doCount(Query query) { Integer count = 0; Object uniqueResult = query.uniqueResult(); if (uniqueResult != null) { count = Integer.parseInt(uniqueResult.toString()); } return count; } // /////////////////////////////////////////////// // ///////获取一个列表(不使用泛型 List<T>)///////////////// // /////////////////////////////////////////////// // 执行不带参数的hql查询,返回一个结果集List public List list(String hql, boolean needPage) { return list(hql, needPage); } public List list(String hql, String key, Object value, boolean needPage) { Map<String, Object> params = createMap(key, value); return list(hql, params, needPage); } public List list(String hql, Map<String, Object> params, boolean needPage) { if (needPage) { PageUtils.fillDefaultPageParams(params); } List list = list(hql, params, needPage); return list; } // 执行带参数并且含有分页的hql查询 private List doList(String hql, Map<String, Object> params) { Query query = createQuery(hql, params); fillPageParams(query, params); List list = doQuery(query); return list; } /** * 向查询对象Query中设置分页参数 * * @param query * 查询对象 * @param params * 查询参数 */ private void fillPageParams(Query query, Map<String, Object> params) { Integer firstResult = (Integer) params.get(PageConstants.FIRST_RESULT); Integer maxResults = (Integer) params.get(PageConstants.MAX_RESULTS); if (firstResult > 0) { query.setFirstResult(firstResult); } if (maxResults > 0) { query.setMaxResults(maxResults); } } /** * 执行查询语句 * * @param query * 查询对象 * @return 查询结果 */ protected List doQuery(Query query) { return query.list(); } public T unique(String hql) { List<T> list = list(hql,NOT_PAGE); T result = doGetFirst(list); return result; } public T unique(String hql, String key, Object value) { Map<String, Object> params = createMap(key, value); return unique(hql, params); } public T unique(String hql, Pair... pair) { Map<String, Object> params = createMap(pair); return unique(hql, params); } public T unique(String hql, Map<String, Object> params) { List<T> list = list(hql, params,NOT_PAGE); T result = doGetFirst(list); return result; } protected T doGetFirst(List<T> list) { T result = null; if (EmptyUtils.notEmpty(list)) { result = list.get(0); } return result; } }
3.BasicSqlQueryUpdateDao
使用原生的SQL,而不是HQL,实现一些较为通用的功能,与BasicQueryUpdateDao类似。
更多功能,与上面的几个都差不多。只是封装程度不同而已。
4.BaseDao
更多类似的功能,还有
searchListByProperty: 根据一个或多个键值对模糊搜索符合条件的结果集
findListByProperty:根据一个键值对精确查找对象
findByPropertyUnique:根据1个键值对精确查找一个对象
countFindByPropertyListAnd:计算查询记录的个数count
5.More API
更多功能需要结合实际需求,整理了...
小结
网站开发最基础最常用的功能就是增删改查CRUD。
无论是用Hibernate还是Mybatis,都会有自己的优势和不足。
如果只是站在开发和技术的角度想问题,永远有做不完的问题,数不清的重复代码。
不去思考和总结,高富帅级的程序员也会被弄成码农,被折磨。
原文链接:http://blog.fansunion.cn/articles/3624(小雷博客-blog.fansunion.cn)