Mybatis 使用注解和Provider类实现动态条件查询
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类实现动态条件查询的更多相关文章
- mybatis+maven+父子多模块进行crud以及动态条件查询
使用IDEA创建maven项目,File→New→Project→maven→Next→填写GroupId(例:com.zyl)和ArtifactId(mybatis-demo-parent)→Nex ...
- 【Oracle】曾经的Oracle学习笔记(4-7)多表联合查询,子查询,动态条件查询
一.多表联合查询 二.子查询 三.动态条件查询 LESSON 4 Displaying Data from Multiple Tables------------------------------- ...
- mybatis使用注解替代xml配置,动态生成Sql
mybatis使用注解替代xml配置时,遇到判断条件是否为null或者为空时,@Select很难搞定,不知道怎么办? mybatis3中增加了使用注解来配置Mapper的新特性,使用 SelectPr ...
- Spring Data JPA,一种动态条件查询的写法
我们在使用SpringData JPA框架时,进行条件查询,如果是固定条件的查询,我们可以使用符合框架规则的自定义方法以及@Query注解实现. 如果是查询条件是动态的,框架也提供了查询接口. Jpa ...
- spring-data-jpa动态条件查询
//获取动态条件的集合List<Long> list = new ArrayList<Long>(); Long sysUserId = currentUser.getSysU ...
- Mybatis中多个参数的问题&&动态SQL&&查询结果与类的对应
### 1. 抽象方法中多个参数的问题 在使用MyBatis时,接口中的抽象方法只允许有1个参数,如果有多个参数,例如: Integer updatePassword( Integer id, Str ...
- 小峰mybatis(5)mybatis使用注解配置sql映射器--动态sql
一.使用注解配置映射器 动态sql: 用的并不是很多,了解下: Student.java 实体bean: package com.cy.model; public class Student{ pri ...
- Mybatis使用generator自动生成的Example类使用OR条件查询
参考:https://blog.csdn.net/qq_36614559/article/details/80354511 public List<AssetsDevicetypeRefacto ...
- 阶段3 1.Mybatis_06.使用Mybatis完成DAO层的开发_5 Mybatis中使用Dao实现类的执行过程分析-查询方法1
继续运行testFindAll方法.把其他类的断点都删除掉. 只在这里加了断点,所以直接就跳转到这里了.RoutingStatementHandler里面的query方法 继续往下走,断点又回到了这里 ...
随机推荐
- 《c# 实现p2p文件分享与传输系统》 一、 模型
c#实现P2P文件分享与传输系统 一.模型 P2P的概念大家都不陌生,也就是所谓的“点对点传输”,即不直接通过服务器,在两台或多台客户端之间传输数据,实现信息交流和资源共享.P2P技术已经发展了很多年 ...
- bzoj 3456 城市规划 —— 分治FFT / 多项式求逆 / 指数型生成函数(多项式求ln)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3456 首先考虑DP做法,正难则反,考虑所有情况减去不连通的情况: 而不连通的情况就是那个经典 ...
- 【249】◀▶IEW-Unit14
Unit 14 Money and Finance 线图写作技巧 1.Model1对应图片分析 The graph contains information about the price in US ...
- my emacs configuration
modified from https://github.com/flyingmachine/emacs-for-clojure ;;;; ;; Packages ;;;; ;; Define pac ...
- c++控制台 对齐 域宽
包含在头文件 iomanip 设置对齐: cout<<setiosflags(ios::xxx); xxx内填参数 left左对齐 right右对齐 setiosflags还有其他选项, ...
- CSP 201703-4 地铁修建 最小生成树+并查集
地铁修建 试题编号: 201703-4 试题名称: 地铁修建 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 A市有n个交通枢纽,其中1号和n号非常重要,为了加强运输能力, ...
- Linux 程式減肥(strip & objcopy)(转载)
转自:http://calamaryshop.blogspot.com/2011/11/linux-strip-objcopy.html 對於設計嵌入式Linux系統的研發人員來說,記憶體的空間是非常 ...
- 洛谷 - P3952 - 时间复杂度 - 模拟
https://www.luogu.org/problemnew/show/P3952 这个模拟,注意每次进入循环的时候把新状态全部入栈,退出循环的时候就退栈. 第一次就错在发现ERR退出太及时,把剩 ...
- CSS 定位 (Positioning)概述
div.h1 或 p 元素常常被称为块级元素. 这意味着这些元素显示为一块内容,即“块框”. 与之相反,span 和 strong 等元素称为“行内元素”,这是因为它们的内容显示在行中,即“行内框”. ...
- Hadoop 2.7.3 HA 搭建及遇到的一些问题
看了Hadoop的一个7天视频教程,里面给出了搭建的详细步骤,教程中是按2.4.1版本搭建的,我用的是2.7.3版本,好像没什么差别.下面是抄过来的,加了一点注释. hadoop2.0已经发布了稳定版 ...