数据访问层常用操作的JPA实现
来源:互联网 发布:mac客人模式权限 编辑:程序博客网 时间:2024/06/08 23:56
转自:http://www.haogongju.net/art/1604040
针对数据的增删改查,使用JPA做一些常用的封装。
一个基础DAO接口和一个DAO接口的实现类。
1、基础DAO接口BaseDao
package cn.luxh.app.dao.common;import java.util.List;import cn.luxh.app.util.Pagination;import cn.luxh.app.util.QueryCondition;/*** interface <code>BaseDao</code> DAO接口,封装常用的数据库操作** @author Luxh*/public interface BaseDao {/*** 新增实体* @param entity 要新增的实体*/public void save(Object entity);/*** 更新实体* @param entity 要更新的实体*/public void update(Object entity);/*** 根据主键删除实体* @param <T>* @param clazz 实体类的Class* @param id 主键*/public <T> void delete(Class<T> clazz,Object id);/*** 根据主键批量删除实体* @param <T>* @param clazz 实体类的Class* @param id 主键数组*/public <T> void delete(Class<T> clazz,Object[] ids);/*** 根据主键查询* @param <T>* @param clazz 实体类的Class* @param id 主键* @return*/public <T> T getById(Class<T> clazz,Object id);/*** 查询所有记录* @param <T>* @param clazz 实体类的Class* @return*/public <T> List<T> getAll(Class<T> clazz);/*** 根据条件集合查询记录* @param <T>* @param clazz* @param queryConditions 查询条件集合* @param orderBy 排序,如 order by id desc* @param currentPage 当前页* @param pageSize 每页显示记录数* @return*/public <T> List<T> get(Class<T> clazz,List<QueryCondition> queryConditions,String orderBy,int currentPage,int pageSize);/*** 根据条件集合查询记录* @param <T>* @param clazz* @param queryConditions 查询条件集合* @return*/public <T> List<T> get(Class<T> clazz,List<QueryCondition> queryConditions);/*** 根据条件集合查询记录* @param <T>* @param clazz* @param queryConditions 查询条件集合* @param orderBy 排序,如 order by id desc* @return*/public <T> List<T> get(Class<T> clazz,List<QueryCondition> queryConditions,String orderBy);/*** 根据条件集合查询单条记录* @param clazz* @param queryConditions 查询条件集合* @return*/@SuppressWarnings("rawtypes")public Object getSingleResult(Class clazz,List<QueryCondition> queryConditions);/*** 根据条件查询记录数量* @param clazz* @param queryConditions 查询条件集合* @return*/@SuppressWarnings("rawtypes")public long getRecordCount(Class clazz,List<QueryCondition> queryConditions);/*** 根据jpql查询* @param <T>* @param jpql* @param objects* @return*/public <T> List<T> getByJpql(String jpql,Object...objects);/*** 执行jpql语句* @param jpql* @param objects* @return*/public int executeJpql(String jpql,Object...objects);/*** 分页查询* @param <T>* @param clazz* @param queryConditions 查询条件集合* @param orderBy 排序字段 如:order by id desc* @param currentPage 当前页* @param pageSize 每页显示记录数* @return*/public <T> Pagination<T> getPagination(Class<T> clazz,List<QueryCondition> queryConditions,String orderBy,int currentPage,int pageSize);/*** 查找唯一结果* @param jpql* @param objects* @return*/public Object getUniqueResultByJpql(String jpql,Object...objects);}
2、DAO接口的实现类BaseDaoImpl
package cn.luxh.app.dao.common;import java.util.Iterator;import java.util.List;import javax.persistence.EntityManager;import javax.persistence.PersistenceContext;import javax.persistence.Query;import org.springframework.stereotype.Repository;import cn.luxh.app.util.Pagination;import cn.luxh.app.util.QueryCondition;/*** Class <code>BaseDaoImpl</code> DAO接口实现类,实现常用的操作** @author Luxh*/@Repository(value="baseDao")public class BaseDaoImpl implements BaseDao {@PersistenceContextprotected EntityManager em;public <T> void delete(Class<T> clazz, Object id) {T entity = em.find(clazz, id);em.remove(entity);}public <T> void delete(Class<T> clazz, Object[] ids) {T entity = null;for(Object id : ids) {entity = em.find(clazz, id);em.remove(entity);}}@SuppressWarnings("unchecked")public <T> List<T> getAll(Class<T> clazz) {String className = clazz.getSimpleName();StringBuffer jpql = new StringBuffer("select o from ");jpql.append(className).append(" o ");return em.createQuery(jpql.toString()).getResultList();}public <T> T getById(Class<T> clazz, Object id) {return em.find(clazz, id);}public void save(Object entity) {em.persist(entity);}public void update(Object entity) {em.merge(entity);}@SuppressWarnings("unchecked")public <T> List<T> get(Class<T> clazz, List<QueryCondition> queryConditions,String orderBy,int currentPage,int pageSize) {Query query = getQuery(clazz, queryConditions, orderBy, false);if(currentPage == 0 && pageSize == 0) {return query.getResultList();}else {return query.setFirstResult((currentPage-1)*pageSize).setMaxResults(pageSize).getResultList();}}/*** 根据查询条件获取Query* @param clazz* @param queryConditions* @param orderBy* @param isQueryTotal 是否查询记录总数, true 则查询记录总数* @return*/@SuppressWarnings("rawtypes")private Query getQuery(Class clazz, List<QueryCondition> queryConditions,String orderBy,boolean isQueryTotal) {String className = clazz.getSimpleName();String preJPQL = isQueryTotal?"select count(*) from ":"select o from ";StringBuffer jpql = new StringBuffer(preJPQL);jpql.append(className).append(" o where 1=1 ");Query query = null;if(queryConditions != null && queryConditions.size() > 0) {//构造jpql语句Iterator<QueryCondition> iterator = queryConditions.iterator();while(iterator.hasNext()) {QueryCondition queryCondition = iterator.next();if(queryCondition!=null) {if(queryCondition.getOperator().equals(QueryCondition.CUSTOM)) {jpql.append(" and (").append(queryCondition.getCustomJPQL()).append(")");}if(queryCondition.getValue() != null && !"".equals(queryCondition.getValue())) {//如果占位符名称是*.*格式,则换成*_*格式。且:和名称之间不能有空格String placeholder = queryCondition.getField().indexOf(".")!=-1 ? queryCondition.getField().replace(".", "_"):queryCondition.getField();jpql.append(" and o.").append(queryCondition.getField().trim()).append(" ").append(queryCondition.getOperator()).append(":").append(placeholder.trim());}}}}if(orderBy != null && !"".equals(orderBy)) {jpql.append(" ").append(orderBy);}query = em.createQuery(jpql.toString());if(queryConditions != null && queryConditions.size() > 0) {//为参数赋值Iterator<QueryCondition> iterator2 = queryConditions.iterator();while(iterator2.hasNext()) {QueryCondition queryCondition = iterator2.next();if(queryCondition!=null) {if(queryCondition.getValue() != null && !"".equals(queryCondition.getValue())) {//将占位符中的.替换成_queryCondition.setField(queryCondition.getField().indexOf(".") != -1 ? queryCondition.getField().replace(".", "_"):queryCondition.getField());if(queryCondition.getOperator().equals(QueryCondition.LK)) {query.setParameter(queryCondition.getField(), "%"+queryCondition.getValue()+"%");}else {query.setParameter(queryCondition.getField(), queryCondition.getValue());}}}}}return query;}public <T> List<T> get(Class<T> clazz, List<QueryCondition> queryConditions) {return get(clazz, queryConditions, null, 0, 0);}public <T> List<T> get(Class<T> clazz, List<QueryCondition> queryConditions, String orderBy) {return get(clazz, queryConditions, orderBy, 0, 0);}@SuppressWarnings("rawtypes")public Object getSingleResult(Class clazz, List<QueryCondition> queryConditions) {Query query = getQuery(clazz, queryConditions, null, false);return query.getSingleResult();}@SuppressWarnings("rawtypes")public long getRecordCount(Class clazz, List<QueryCondition> queryConditions) {Query query = getQuery(clazz, queryConditions, null, true);Object result = query.getSingleResult();long recordCount = 0L;if(result != null) {recordCount = ((Long)result).longValue();}return recordCount;}@SuppressWarnings("unchecked")public <T> List<T> getByJpql(String jpql, Object... objects) {Query query = em.createQuery(jpql);if(objects != null) {if (objects != null) {for(int i = 0 ; i < objects.length ; i ++){query.setParameter(i, objects[i]);}}}return query.getResultList();}public int executeJpql(String jpql,Object...objects) {Query query = em.createQuery(jpql);if (objects != null) {for(int i = 0 ; i < objects.length ; i ++){query.setParameter(i, objects[i]);}}return query.executeUpdate();}@SuppressWarnings({ "unchecked", "rawtypes" })public <T> Pagination<T> getPagination(Class<T> clazz,List<QueryCondition> queryConditions,String orderBy,int currentPage,int pageSize) {List<T> recordList = get(clazz, queryConditions, orderBy, currentPage, pageSize);long recordCount = getRecordCount(clazz, queryConditions);return new Pagination(currentPage, pageSize, recordCount, recordList);}@Overridepublic Object getUniqueResultByJpql(String jpql, Object... objects) {Query query = em.createQuery(jpql);if (objects != null) {for(int i = 0 ; i < objects.length ; i ++){query.setParameter(i, objects[i]);}}return query.getSingleResult();}}
3、查询条件工具类QueryCondition
package cn.luxh.app.util;/*** Class <code>QueryCondition</code> 查询条件* @author Luxh*/public class QueryCondition {/**等于*/public static final String EQ = "=";/**小于*/public static final String LT = "<";/**大于*/public static final String GT = ">";/**小于等于*/public static final String LE = "<=";/**大于等于*/public static final String GE = ">=";/**相似*/public static final String LK = "like";//可以再扩展//....../**自定义jpql语句*/public static final String CUSTOM = "custom";/**属性名*/private String field;/**操作符*/private String operator;/**值*/private Object value;/**自定义jpql语句*/private String customJPQL;/*** 传入自定义语句* @param customJPQL*/public QueryCondition(String customJPQL) {this.customJPQL = customJPQL;this.operator = CUSTOM;}/**** @param field 属性名* @param operator 操作符* @param value 值 如果属性是日期类型,需将字符串格式为日期 如new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2012-03-23 10:22:22")*/public QueryCondition(String field, String operator, Object value) {this.field = field;this.operator = operator;this.value = value;}public String getField() {return field;}public void setField(String field) {this.field = field;}public String getOperator() {return operator;}public void setOperator(String operator) {this.operator = operator;}public Object getValue() {return value;}public void setValue(Object value) {this.value = value;}public String getCustomJPQL() {return customJPQL;}public void setCustomJPQL(String customJPQL) {this.customJPQL = customJPQL;}}
4、查询条件QueryCondition的使用
List<QueryCondition> queryConditions = new ArrayList<QueryCondition>();//根据姓名和年龄的范围查找用户//对应的SQL: name = '楚留香'queryConditions.add(new QueryCondition("name",QueryCondition.EQ,"楚留香"));//对应的SQL: age = 10 or age =20queryConditions.add(new QueryCondition("age = 10 or age =20"));List<User> users = baseDao.get(User.class, queryConditions);
- 数据访问层常用操作的JPA实现
- JPA Repository数据访问层
- spring mvc 的jpa JpaRepository数据层 访问方式汇总
- spring mvc 的jpa JpaRepository数据层 访问方式汇总
- spring mvc 的jpa JpaRepository数据层 访问方式汇总
- spring mvc 的jpa JpaRepository数据层 访问方式汇总
- spring mvc 的jpa JpaRepository数据层 访问方式汇总
- spring mvc 的jpa JpaRepository数据层 访问方式汇总
- spring mvc 的jpa JpaRepository数据层 访问方式汇总
- JPA持久层CURD操作的抽象类实现
- JPA的几个常用操作
- CYQ.Data 轻量数据访问层(七) 自定义数据表实现绑定常用的数据控件(上)
- CYQ.Data 轻量数据访问层(八) 自定义数据表实现绑定常用的数据控件(中)
- CYQ.Data 轻量数据访问层(九) 自定义数据表实现绑定常用的数据控件(下)
- spring MVC jpa jpaRepository 数据层访问 方式汇总
- 数据访问层——表操作的封装
- 一个简单的NET数据访问层操作类
- 解析数据访问层操作数据库的方式
- struts2标签库
- 两个WEB.XML:servlet容器中的web.xml和WEB-INF下的web.xml
- unix编程好记提示
- JS文件默认编码方式及修改
- Js判断数组中是否有重复值的三种方法
- 数据访问层常用操作的JPA实现
- 二叉树的遍历
- 完美国际伤害减免公式及属性点对双防加成公式总结
- ATE0Q0V1
- signal信号捕捉
- iOS 设备的屏幕尺寸、分辨率及其屏幕边长比例详细情况是怎样的?
- 数据库还原时候被 占用的解决办法
- Java内存解析
- Object转换为String[]数组,或者其他类型的数组