美文网首页springboot
Spring-data-jpa EntityManager封装通

Spring-data-jpa EntityManager封装通

作者: 激萌咖啡 | 来源:发表于2018-09-01 11:24 被阅读26次

    由于在项目中添加新的业务,该项目使用jpa 但是表结构不是这个项目产生,所以使用jpa实体管理器(EntityManager)封装了一个通用的Dao

    sql封装类

    package com.ronnie.data.utils;
    
    import org.springframework.util.StringUtils;
    
    /**
     * @Description:
     * @Author: rongyu
     * @CreateDate: 2018/8/30$ 11:49$
     * @Remark:
     */
    public class NativeSqlBuilder {
    
        private final static String BLANK = " ";
        private final static String COMMA = ",";
        private final static String DEFAULT_SELECT_FIELD = "*";
        private final static String DEFAULT_ORDER = "id DESC";
    
        private String tableName;
        private StringBuffer fields = new StringBuffer();
        private StringBuffer conditions = new StringBuffer("1=1 ");
        private StringBuffer sorts = new StringBuffer();
    
        // 表名
        public NativeSqlBuilder(String tableName) {
            this.tableName = tableName;
        }
    
        // 表字段
        public NativeSqlBuilder addField(String field) {
            if (!StringUtils.isEmpty(fields)) {
                fields.append(COMMA + field);
            } else {
                fields.append(field);
            }
            return this;
        }
    
        // 条件
        public NativeSqlBuilder addCondition(String condition) {
            conditions.append(condition + BLANK);
            return this;
        }
    
        // 排序
        public NativeSqlBuilder addSort(String sort) {
            if (!StringUtils.isEmpty(sorts)) {
                sorts.append(COMMA + sort);
            } else {
                sorts.append(sort);
            }
            return this;
        }
    
        public static NativeSqlBuilder builder(String tableName) {
            return new NativeSqlBuilder(tableName);
        }
    
        public NativeSql build() {
            return NativeSql.builder()
                    .tableName(tableName)
                    .conditions(conditions.toString())
                    .fields(!StringUtils.isEmpty(fields.toString()) ? fields.toString() : DEFAULT_SELECT_FIELD)
                    .sorts(!StringUtils.isEmpty(sorts.toString()) ? sorts.toString() : DEFAULT_ORDER)
                    .build();
        }
    
    }
    
    

    通用Dao接受对象

    @Data
    @Builder
    public class NativeSql {
        private String tableName;
        private String fields;
        private String conditions;
        private String sorts;
    }
    
    package com.ronnie.data.utils;
    
    import lombok.Data;
    import org.springframework.data.domain.PageRequest;
    import org.springframework.data.domain.Pageable;
    import org.springframework.data.domain.Sort;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * rongyu
     * 分页接受参数
     */
    @Data
    public class PageModel {
        Integer pageNo = 1;
        Integer pageSize = 10;
        List<Sort.Direction> direction;
        List<String> property;
    
        public void setSort() {
            if (property == null || property.size() == 0) {
                List<String> list = new ArrayList<>();
                list.add("id");
                List<Sort.Direction> directions = new ArrayList<>();
                directions.add(Sort.Direction.DESC);
                property = list;
                direction = directions;
            }
        }
    
        private Sort getSort() {
            List<Sort.Order> orders = null;
            setSort();
            if (direction.size() == property.size()) {
                orders = new ArrayList<>();
                int length = direction.size();
                for (int i = 0; i < length; i++) {
                    orders.add(new Sort.Order(direction.get(i), property.get(i)));
                }
            }
            return new Sort(orders);
        }
    
        public Pageable getPageable() {
            Sort sort = getSort();
            if (sort == null)
                return new PageRequest(pageNo - 1, pageSize);
            return new PageRequest(pageNo - 1, pageSize, sort);
        }
    }
    
    

    通用Dao(接口)

    package com.ronnie.data.dao.base;
    
    import com.alibaba.fastjson.JSONObject;
    import com.ronnie.data.utils.NativeSql;
    import com.ronnie.data.utils.PageModel;
    import org.hibernate.query.NativeQuery;
    import org.hibernate.transform.ResultTransformer;
    import org.hibernate.transform.Transformers;
    import org.springframework.data.domain.Page;
    import org.springframework.data.domain.PageImpl;
    
    import javax.persistence.EntityManager;
    import javax.persistence.Query;
    import java.lang.reflect.ParameterizedType;
    import java.math.BigInteger;
    import java.util.List;
    import java.util.Map;
    
    /**
     * @Description:
     * @Author: rongyu
     * @CreateDate: 2018/8/31$ 10:14$
     * @Remark:
     */
    public interface BaseEntityManagerDao {
    
        /**
         * 设置实体管理器
         *
         * @return
         */
        EntityManager getEntityManager();
    
        /**
         * 分页查询
         *
         * @param nativeSql
         * @param pageModel
         * @return
         */
        default Page createNativePageQuery(NativeSql nativeSql, PageModel pageModel) {
            String countSql = "SELECT COUNT(1) FROM " + nativeSql.getTableName() + " WHERE " + nativeSql.getConditions();
            StringBuilder sql = new StringBuilder("SELECT ");
            sql.append(nativeSql.getFields())
                    .append(" FROM ")
                    .append(nativeSql.getTableName())
                    .append(" WHERE ")
                    .append(nativeSql.getConditions());
            Query countQuery = getEntityManager().createNativeQuery(countSql);
            long count = ((BigInteger) countQuery.getSingleResult()).longValue();
            if (pageModel.getProperty() != null && pageModel.getProperty().size() > 0 && pageModel.getDirection().size() == pageModel.getProperty().size()) {
                sql.append("ORDER BY");
                for (int i = 0; i < pageModel.getProperty().size(); i++) {
                    sql.append(" " + pageModel.getProperty().get(i) + " " + pageModel.getDirection().get(i) + " ");
                    if (i < pageModel.getProperty().size() - 1) {
                        sql.append(",");
                    }
                }
            }
            sql.append(" limit " + pageModel.getPageSize() * (pageModel.getPageNo() - 1) + " , " + pageModel.getPageSize());
            javax.persistence.Query query2 = getEntityManager().createNativeQuery(sql.toString());
            //query2.unwrap(NativeQuery.class).addEntity(Map.class).getResultList();
            query2.unwrap(NativeQuery.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
            List list = query2.getResultList();
            return new PageImpl<>(list, pageModel.getPageable(), count);
        }
    
        /**
         * 查询
         *
         * @param nativeSql
         * @return
         */
        default List<Map> nativeQueryAll(NativeSql nativeSql) {
            String sql = getSimpleSqlStringBuilder(nativeSql).toString();
            Query query = getEntityManager().createNativeQuery(sql);
            query.unwrap(NativeQuery.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
            List<Map> list = (List<Map>) query.getResultList();
            return list;
        }
    
        /**
         * 查询
         *
         * @param nativeSql
         * @return
         */
        default Object nativeQueryOne(NativeSql nativeSql) {
            String sql = getSimpleSqlStringBuilder(nativeSql).append(" LIMIT 1 ").toString();
            Query query = getEntityManager().createNativeQuery(sql);
            query.unwrap(NativeQuery.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
            Object o = query.getSingleResult();
            return o;
        }
    
        default StringBuilder getSimpleSqlStringBuilder(NativeSql nativeSql) {
            StringBuilder sql = new StringBuilder("SELECT ");
            return sql.append(nativeSql.getFields())
                    .append(" FROM ")
                    .append(nativeSql.getTableName())
                    .append(" WHERE ")
                    .append(nativeSql.getConditions())
                    .append(" ORDER BY ")
                    .append(nativeSql.getSorts());
        }
    
    }
    
    

    使用步骤

    一个实现类

    public interface ExEntrustDao extends BaseEntityManagerDao {
    }
    
    
    @Repository
    public class ExEntrustDaoImpl implements ExEntrustDao {
        private final static String TABLE_NAME = "ex_entrust";
    
        @Autowired
        @PersistenceContext
        private EntityManager em;
    
        @Override
        public EntityManager getEntityManager() {
            return this.em;
        }
    
    }
    
    public interface ExEntrustService {
        ExEntrust findOne(NativeSql nativeSql);
    }
    
    @Service
    public class ExEntrustServiceImpl implements ExEntrustService {
        @Autowired
        private ExEntrustDao dao;
    
        @Override
        public ExEntrust findOne(NativeSql nativeSql) {
            ExEntrust e = null;
            Object o = dao.nativeQueryOne(nativeSql);
            if (o != null) {
                e = JSONObject.parseObject(JSONObject.toJSONString(o), ExEntrust.class);
            }
            return e;
        }
    }
    

    调用

        @Test
        public void exEntrustService() {
            NativeSql nativeSql = NativeSqlBuilder
                    .builder("ex_entrust")
                    .addCondition("and id = 20522932")
                    .build();
            ExEntrust one = exEntrustService.findOne(nativeSql);
            log.info("");
        }
    

    github https://github.com/ronnierry/spring-boot-data/tree/master/spring-data-jpa
    QQ群 : 869658872

    相关文章

      网友评论

        本文标题:Spring-data-jpa EntityManager封装通

        本文链接:https://www.haomeiwen.com/subject/nzgywftx.html