1.注解内拼写 Mybatis SQL 脚本

@Repository
public interface CustomerFeedMapper extends BaseCrudMapper<CustomerFeed> { @Select("<script>"
+ "SELECT customer_id,COUNT(customer_id) total "
+ "FROM t_customer_feed "
+ "<where> "
+ "<if test='feedQO.feedTypes != null and feedQO.feedTypes.size()>0'> "
+ "type IN "
+ "<foreach item='type' collection='feedQO.feedTypes' open='(' close=')' separator=','> "
+ "#{type}"
+ "</foreach> AND "
+ "</if>"
+ "<if test='feedQO.customerIds != null and feedQO.customerIds.size()>0'> "
+ "customer_id IN "
+ "<foreach item='customerId' collection='feedQO.customerIds' open='(' close=')' separator=','> "
+ "#{customerId}"
+ "</foreach> AND "
+ "</if>"
+ "<if test='feedQO.timePoint != null'>"
+ "create_time > #{feedQO.timePoint} "
+ "</if>"
+ "</where>"
+ "GROUP BY customer_id "
+ "ORDER BY create_time DESC "
+ "</script>")
@Results({
@Result(property = "customerId", column = "customer_id"),
@Result(property = "total", column = "total")
})
List<CustomerFeedSummaryVO> summary(@Param("feedQO") CustomerFeedQO feedQO);
}

  

2.基于org.apache.ibatis.jdbc.SQL对象构建SQL

Mapper 接口

在 mapper 接口的方法上添加注解 @SelectProvider 配置其两个属性 type (构建SQL的类)和 method (构建 SQL 的类中的方法)

@Repository
public interface UserCustomerRelationMapper extends BaseCrudMapper<UserCustomerRelation> {
/**
* Page by customer attrs list.
* @param userCustomerRelationQO the user customer relation qo
* @return the list
*/
@SelectProvider(type = UserCustomerRelationProvider.class, method = "listByCustomerAttr")
List<UserCustomerRelation> pageByCustomerAttrs(@Param("condition") UserCustomerRelationCondition userCustomerRelationQO);
}

  

electProvider 类实现

此 Provider 类无需继承实现其他类,只要实现接口方法中注解 @SelectProvider 的 method 属性指定的方法 listByCustomerAttr ,Mapper 接口中的参数,将以 Map<String,Object> 的形式传入我们实现的指定方法。

public class UserCustomerRelationProvider {

    /**
* List by customer attr string.
* @param params the params
* @return the string
*/
public String listByCustomerAttr(Map<String, Object> params) { UserCustomerRelationCondition qo = (UserCustomerRelationCondition) params.get("condition"); SQL querySql = new SQL();
querySql.SELECT("ucr.user_id as userId,ucr.customer_id as customerId,ucr.create_time as createTime,ucr.update_time as updateTime")
.FROM("t_user_customer_relation ucr", "t_customer_attr ca")
.WHERE("ucr.customer_id=ca.objectId");
String userId = qo.getUserId();
if (StringUtils.isNotBlank(userId)) {
querySql.WHERE("ucr.user_id=#{condition.userId}");
}
Long customerId = qo.getCustomerId();
if (customerId != null) {
querySql.WHERE("ucr.customer_id=#{condition.customerId}");
}
List<CustomerAttr> customerAttrs = qo.getCustomerAttrs();
if (!CollectionUtils.isEmpty(customerAttrs)) {
for (CustomerAttr customerAttr : customerAttrs) {
String key = customerAttr.getKey();
if (StringUtils.isNotBlank(key)) {
querySql.WHERE(String.format("ca.`key`='%s'", key));
}
String value = customerAttr.getValue();
if (StringUtils.isNotBlank(value)) {
querySql.WHERE(String.format("ca.`value`='%s'", value));
}
}
}
return querySql.toString();
} }

  

Mybatis 使用注解和Provider类实现动态条件查询的更多相关文章

  1. mybatis+maven+父子多模块进行crud以及动态条件查询

    使用IDEA创建maven项目,File→New→Project→maven→Next→填写GroupId(例:com.zyl)和ArtifactId(mybatis-demo-parent)→Nex ...

  2. 【Oracle】曾经的Oracle学习笔记(4-7)多表联合查询,子查询,动态条件查询

    一.多表联合查询 二.子查询 三.动态条件查询 LESSON 4 Displaying Data from Multiple Tables------------------------------- ...

  3. mybatis使用注解替代xml配置,动态生成Sql

    mybatis使用注解替代xml配置时,遇到判断条件是否为null或者为空时,@Select很难搞定,不知道怎么办? mybatis3中增加了使用注解来配置Mapper的新特性,使用 SelectPr ...

  4. Spring Data JPA,一种动态条件查询的写法

    我们在使用SpringData JPA框架时,进行条件查询,如果是固定条件的查询,我们可以使用符合框架规则的自定义方法以及@Query注解实现. 如果是查询条件是动态的,框架也提供了查询接口. Jpa ...

  5. spring-data-jpa动态条件查询

    //获取动态条件的集合List<Long> list = new ArrayList<Long>(); Long sysUserId = currentUser.getSysU ...

  6. Mybatis中多个参数的问题&&动态SQL&&查询结果与类的对应

    ### 1. 抽象方法中多个参数的问题 在使用MyBatis时,接口中的抽象方法只允许有1个参数,如果有多个参数,例如: Integer updatePassword( Integer id, Str ...

  7. 小峰mybatis(5)mybatis使用注解配置sql映射器--动态sql

    一.使用注解配置映射器 动态sql: 用的并不是很多,了解下: Student.java 实体bean: package com.cy.model; public class Student{ pri ...

  8. Mybatis使用generator自动生成的Example类使用OR条件查询

    参考:https://blog.csdn.net/qq_36614559/article/details/80354511 public List<AssetsDevicetypeRefacto ...

  9. 阶段3 1.Mybatis_06.使用Mybatis完成DAO层的开发_5 Mybatis中使用Dao实现类的执行过程分析-查询方法1

    继续运行testFindAll方法.把其他类的断点都删除掉. 只在这里加了断点,所以直接就跳转到这里了.RoutingStatementHandler里面的query方法 继续往下走,断点又回到了这里 ...

随机推荐

  1. 「USACO08DEC」「LuoguP2921」在农场万圣节Trick or Treat on the Farm(tarjan

    题意翻译 题目描述 每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N<=100,000)个牛棚隔间中留下的糖果,以此来庆祝美国秋天的万圣节. 由于牛棚不太大,FJ通过指定 ...

  2. bzoj 3267: KC采花&&3272&&3638&&3502 线段树

    题目大意 给定一个长为n的序列,维护两种操作: 1.单点修改 2.在[l,r]这段区间中取k个互不相交的子段,使子段之和最大. \(n \leq 50000,k \leq 20\) 题解 四倍经验.( ...

  3. COGS 2581 无聊的会议V2

    传送 题目大意 给定一个长为\(n\)的序列,定义\(y\)在三元对\((x,y,z)\)中成为中心轴当且仅当同时满足:\(a_x = a_y = a_z,y-x=z-y,x<y<z\)对 ...

  4. 【Lintcode】137.Clone Graph

    题目: Clone an undirected graph. Each node in the graph contains a label and a list of its neighbors. ...

  5. bzoj 2865 字符串识别 —— 后缀数组

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2865 唯一出现的子串就是每个后缀除去和别的后缀最长的 LCP 之外的前缀: 所以用这个更新一 ...

  6. CodeFlex AutoUpdate

    http://autoupdaterdotnet.codeplex.com/downloads/get/888100

  7. 性能测试之Jmeter学习(十)

    分布式部署(转载) 一.分布式介绍: Jmeter 是java 应用,对于CPU和内存的消耗比较大,因此,当需要模拟数以千计的并发用户时,使用单台机器模拟所有的并发用户就有些力不从心,甚至会引起JAV ...

  8. 利用oracle session context 向oracle传值

    有时候,我们在执行数据库请求时,需要向数据库传一些应用程序的上下文信息,比如当前应用的用户.举个场景,我们要通过触发器记录对某些关键表的修改日志,日志包括修改的表,字段,字段的值,修改的时间,当然非常 ...

  9. Linux 之问题集锦(一)

    1. 打开目录时,怎么只显示一个窗口 计算机 -- 编辑 -- 首选项 -- 行为 -- 总是总浏览器窗口中打开 2. linux中添加PATH时出现 Found a swap file by the ...

  10. JS 检查是否在微信浏览器

    /** * 检查是否在微信浏览器 * zengkai */ function isWeixinBrowser(){ var ua = navigator.userAgent.toLowerCase() ...