Spring-data-jpa EntityManager封装通用Dao
由于在项目中添加新的业务,该项目使用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

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
java源码 - ReentrantReadWriteLock写锁介绍
开篇 这篇文章主要从源码角度讲解ReentrantReadWriteLock的WriteLock的加锁和减锁过程。 ReentrantReadWriteLock的WriteLock加锁解锁过程依赖于AbstractQueuedSynchronizer(AQS)类,所以有些相同的逻辑可以看看ReentrantLock的逻辑。 ReentrantReadWriteLock的数据结构介绍 java源码 - ReentrantReadWriteLock读锁介绍 java源码 - ReentrantReadWriteLock写锁介绍 加锁过程 WriteLock的lock()内部通过sync.acquire(1)获取锁。 尝试通过tryAcquire获取写锁,如果获取成功那么就成功占用写锁。 获取写锁失败后,将当前线程添加到写锁唤醒队列当中acquireQueued(addWaiter(Node.EXCLUSIVE), arg))。 acquireQueued(addWaiter(Node.EXCLUSIVE), arg))的操作逻辑和ReentrantLock的逻辑一致。 public s...
- 下一篇
Python学习笔记 (2)变量、常量和数据类型
变量 顾名思义,变量就是一个会变的量,用一个变量名表示,指向内存中一片区域,而指向的区域存的是什么,这个变量就是什么数据类型,和C/C++挺不一样的。变量数据类型可以通过赋值变来变去(这就叫动态语言,区别于静态语言)。 创建和赋值 python中创建变量时只需给变量赋一个值,像这样a = 1,然后变量名就指向存着那个值(1)的一片区域(表述不太对,应该是引用而不是指向)。用id() 可以查看该变量的地址。 还可以像这样赋值a, b = 1, 2 (a=1,b=2),或是这样a=b=1。 “可以把任何数据都看成一个“对象”,而变量就是在程序中用来指向这些数据对象的,对变量赋值就是把数据和变量给关联起来。” 举个例子,我们给a赋值为1,a=1,就相当于创建了变量a,于是解释器在内存地址XXX中创建一个Number对象1,然后把a和XXX中的对象1关联起来。调用id(a) ,能得到内存地址XXX。 然后我们给a加上1a=a+1 或是给a赋值为2a=2,就会再次创建一个在内存地址YYY中的Number对象2,然后a就被关联到了对象2上,至于对象1,也不知道是留着还是回收了,这里先留坑。 再调用...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- SpringBoot2全家桶,快速入门学习开发网站教程
- Docker安装Oracle12C,快速搭建Oracle学习环境
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- 设置Eclipse缩进为4个空格,增强代码规范