优点:简单的和基础的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{ /** * 表的实体类型 */ protected Class modelClazz; @Autowired protected SessionFactory sessionFactory; public CrudDao() { this.modelClazz = (Class ) ((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 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 params = createMap(key, value); return update(hql, params); } public Integer update(String hql, Pair... pair) { M