哈喽,大家好,我是指北君。
之前有一篇文章,我们介绍过通过 Mybatis Plus 进行增删改查。如下这段代码:

  1. /**
  2. _ 根据 id 修改
  3. _ UPDATE user SET user_name=?, user_age=? WHERE (id = ?)
  4. */
  5. @Test
  6. public void testudpateById(){
  7. User user = new User();
  8. user.setUserAge("25");
  9. user.setUserName("test update");
  10. UpdateWrapper updateWrapper = new UpdateWrapper();
  11. updateWrapper.eq("id","3");
  12. int num = userMapper.update(user, updateWrapper);
  13. System.out.println("修改的记录数为:"+num);
  14. }
  15. /**
  16. _ 查询指定记录
  17. _ SELECT id,user_name,user_age FROM user WHERE (user_name = ?)
  18. */
  19. @Test
  20. public void testSelectWrapper(){
  21. QueryWrapper wrapper = new QueryWrapper();
  22. wrapper.eq("user_name","IT 可乐");
  23. List users = userMapper.selectList(wrapper);
  24. users.forEach(x-> System.out.println(x.getId()+"-"+x.getUserName()+"-"+x.getUserAge()));
  25. }

上面两个方法分别是根据 id 修改表记录,和根据 user_name 查询记录。构造的条件使用了 UpdateWrapper 和 QueryWrapper ,那么这是什么呢?其实 mybatis plus 通过条件构造器可以组成复杂的 SQL 语句。本篇博客我们将详细介绍。

1、Wrapper

Mybatis Plus 提供的几种条件构造器,关系如下:

条件构造器书写 MybatisPlus 复杂 SQL 语句 - 图1

我们主要通过 QueryWrapper 和 UpdateWrapper 进行条件构造,这两个和 LambdaQueryWrapper、LambdaUpdateWrapper 差不多是等价的,只不过后者采用了 JDK1.8 提供的 lambda 语法,使用起来更简洁。

2、语法详情总结

关于条件构造器的各个用法介绍,可以参考官网:https://mp.baomidou.com/guide/wrapper.html#abstractwrapper

这里我们做一下总结:

方法名 说明 用法实例 等价 SQL
官网地址 https://mp.baomidou.com/guide/wrapper.html#abstractwrapper ——: :——:
allEq(Map params) 全部等于 map.put(“id”,”3”);map.put(“user_name”,”IT 可乐 “);allEq(map) user_name = “IT 可乐” AND id = 3
eq(R column, Object val) 等于 = eq(“id”,”3”) id = 3
ne(R column, Object val) 不等于 <> ne(“id”, “3”) id <> 3
gt(R column, Object val) 大于 > gt(“user_age”,”18”) user_age > 18
ge(R column, Object val) 大于等于 >= ge(“user_age”,”18”) user_age >= 18
lt(R column, Object val) 小于 < lt(“user_age”,”18”) user_age < 18
le(R column, Object val) 小于等于 <= le(“user_age”,”18”) user_age <= 18
between(R column, Object val1, Object val2) BETWEEN 值 1 AND 值 2 between(“user_age”,”18”,”25”) user_age BETWEEN 18 AND 25
notBetween(R column, Object val1, Object val2) NOT BETWEEN 值 1 AND 值 2 notBetween(“user_age”,”18”,”25”) user_age NOT BETWEEN 18 AND 25
like(R column, Object val) LIKE ‘% 值 %’ like(“user_name”,” 可乐 “) like ‘% 可乐 %’
notLike(R column, Object val) NOT LIKE ‘% 值 %’ notLike(“user_name”,” 可乐 “) not like ‘% 可乐 %’
likeLeft(R column, Object val) LIKE ‘% 值’ likeLeft(“user_name”,” 可乐 “) like ‘% 可乐’
likeRight(R column, Object val) LIKE ‘值 %’ likeRight(“user_name”,” 可乐 “) like ‘可乐 %’
isNull(R column) 字段 IS NULL isNull(“user_name”) user_name IS NULL
isNotNull(R column) 字段 IS NOT NULL isNotNull(“user_name”) user_name IS NOT NULL
in(R column, Collection<?> value) 字段 IN (value.get(0), value.get(1), …) in(“user_age”,{1,2,3}) user_age IN (?,?,?)
notIn(R column, Collection<?> value) 字段 NOT IN (value.get(0), value.get(1), …) notIn(“user_age”,{1,2,3}) user_age NOT IN (?,?,?)
inSql(R column, String inValue) 字段 IN (sql 语句) inSql(“id”,”select id from user”) id IN (select id from user)
notInSql(R column, String inValue) 字段 NOT IN (sql 语句) notInSql(“id”,”select id from user where id> 2”) id NOT IN (select id from user where id> 2
groupBy(R… columns) 分组:GROUP BY 字段, … groupBy(“id”,”user_age”) GROUP BY id,user_age
orderByAsc(R… columns) 排序:ORDER BY 字段, … ASC orderByAsc(“id”,”user_age”) ORDER BY id ASC,user_age ASC
orderByDesc(R… columns) 排序:ORDER BY 字段, … DESC orderByDesc(“id”,”user_age”) ORDER BY id DESC,user_age DESC
orderBy(boolean condition, boolean isAsc, R… columns) ORDER BY 字段, … orderBy(true,true,”id”,”user_age”) ORDER BY id ASC,user_age ASC
having(String sqlHaving, Object… params) HAVING (sql 语句) having(“sum(user_age)>{0}”,”25”) HAVING sum(user_age)>25
or() 拼接 OR eq(“id”,1).or().eq(“user_age”,25) id = 1 OR user_age = 25
and(Consumerconsumer) AND 嵌套 and(i->i.eq(“id”,1).ne(“user_age”,18)) id = 1 AND user_age <> 25
nested(Consumerconsumer) 正常嵌套 不带 AND 或者 OR nested(i->i.eq(“id”,1).ne(“user_age”,18)) id = 1 AND user_age <> 25
apply(String applySql, Object… params) 拼接 sql(不会有 SQL 注入风险) apply(“user_age>{0}”,”25 or 1=1”) user_age >’25 or 1=1’
last(String lastSql) 拼接到 sql 的最后, 多次调用以最后一次为准 (有 sql 注入的风险) last(“limit 1”) limit 1
exists(String existsSql) 拼接 EXISTS (sql 语句) exists(“select id from user where user_age = 1”) EXISTS (select id from user where user_age = 1)
notExists(String notExistsSql) 拼接 NOT EXISTS (sql 语句) notExists(“select id from user where user_age = 1”) NOT EXISTS (select id from user where user_age = 1)

3、语法详情演示

对于上表出现的每个语法,这里通过代码展示出来。

更多可以参考地址:https://github.com/YSOcean/mybatisplusstudy.git

  1. package com.ys.mybatisplusstudy;
  2. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  3. import com.ys.mybatisplusstudy.entry.User;
  4. import com.ys.mybatisplusstudy.mapper.UserMapper;
  5. import org.junit.jupiter.api.Test;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.boot.test.context.SpringBootTest;
  8. import java.util.ArrayList;
  9. import java.util.HashMap;
  10. import java.util.List;
  11. import java.util.Map;
  12. @SpringBootTest
  13. public class WrapperTest {
  14. @Autowired
  15. private UserMapper userMapper;
  16. /**
  17. _ 新增一条记录
  18. _/
  19. @Test
  20. public void testInsert(){
  21. User user = new User();
  22. user.setId(4L);
  23. user.setUserName("test insert");
  24. user.setUserAge("1");
  25. int insert = userMapper.insert(user);
  26. System.out.println("影响记录数:"+insert);
  27. }
  28. /**
  29. _ allEq 全部等于
  30. _ 实例 SQL:SELECT id,user_name,user_age FROM user WHERE (user_name = ? AND id = ?)
  31. */
  32. @Test
  33. public void testAllEq(){
  34. QueryWrapper queryWrapper = new QueryWrapper();
  35. Map map = new HashMap<>();
  36. map.put("id","3");
  37. map.put("user_name","IT 可乐");
  38. queryWrapper.allEq(map);
  39. List list = userMapper.selectList(queryWrapper);
  40. System.out.println(list);
  41. }
  42. /**
  43. _ eq 等于
  44. _ 实例 SQL:SELECT id,user_name,user_age FROM user WHERE (id = ?)
  45. */
  46. @Test
  47. public void testEq(){
  48. QueryWrapper queryWrapper = new QueryWrapper();
  49. queryWrapper.eq("id","3");
  50. List list = userMapper.selectList(queryWrapper);
  51. System.out.println(list);
  52. }
  53. /**
  54. _ ne 不等于
  55. _ 实例 SQL:SELECT id,user_name,user_age FROM user WHERE (id <> ?)
  56. */
  57. @Test
  58. public void testNe(){
  59. QueryWrapper queryWrapper = new QueryWrapper();
  60. queryWrapper.ne("id","3");
  61. List list = userMapper.selectList(queryWrapper);
  62. System.out.println(list);
  63. }
  64. /**
  65. _ gt 大于
  66. _ 实例 SQL:SELECT id,user_name,user_age FROM user WHERE (user_age> ?)
  67. */
  68. @Test
  69. public void testGt(){
  70. QueryWrapper queryWrapper = new QueryWrapper();
  71. queryWrapper.gt("user_age","18");
  72. List list = userMapper.selectList(queryWrapper);
  73. System.out.println(list);
  74. }
  75. /**
  76. _ ge 大于等于
  77. _ 实例 SQL:SELECT id,user_name,user_age FROM user WHERE (user_age>= ?)
  78. */
  79. @Test
  80. public void testGe(){
  81. QueryWrapper queryWrapper = new QueryWrapper();
  82. queryWrapper.ge("user_age","18");
  83. List list = userMapper.selectList(queryWrapper);
  84. System.out.println(list);
  85. }
  86. /**
  87. _ lt 小于
  88. _ 实例 SQL:SELECT id,user_name,user_age FROM user WHERE (user_age < ?)
  89. */
  90. @Test
  91. public void testLt(){
  92. QueryWrapper queryWrapper = new QueryWrapper();
  93. queryWrapper.lt("user_age","18");
  94. List list = userMapper.selectList(queryWrapper);
  95. System.out.println(list);
  96. }
  97. /**
  98. _ le 小于等于
  99. _ 实例 SQL:SELECT id,user_name,user_age FROM user WHERE (user_age <= ?)
  100. */
  101. @Test
  102. public void testLe(){
  103. QueryWrapper queryWrapper = new QueryWrapper();
  104. queryWrapper.le("user_age","18");
  105. List list = userMapper.selectList(queryWrapper);
  106. System.out.println(list);
  107. }
  108. /**
  109. _ between 值 1 和值 2 之间, 两边临界值都包含
  110. _ 实例 SQL:SELECT id,user_name,user_age FROM user WHERE (user_age BETWEEN ? AND ?)
  111. */
  112. @Test
  113. public void testBetween(){
  114. QueryWrapper queryWrapper = new QueryWrapper();
  115. queryWrapper.between("user_age","18","25");
  116. List list = userMapper.selectList(queryWrapper);
  117. System.out.println(list);
  118. }
  119. /**
  120. _ notBetween 不在值 1 和值 2 之间,两边临界值都包含
  121. _ 实例 SQL:SELECT id,user_name,user_age FROM user WHERE (user_age NOT BETWEEN ? AND ?)
  122. */
  123. @Test
  124. public void testNoBetween(){
  125. QueryWrapper queryWrapper = new QueryWrapper();
  126. queryWrapper.notBetween("user_age","18","25");
  127. List list = userMapper.selectList(queryWrapper);
  128. System.out.println(list);
  129. }
  130. /**
  131. _ like 模糊查询,会在参数左右两边加上 %
  132. _ 实例 SQL:SELECT id,user_name,user_age FROM user WHERE (user_name LIKE ?)
  133. */
  134. @Test
  135. public void testLike(){
  136. QueryWrapper queryWrapper = new QueryWrapper();
  137. queryWrapper.like("user_name","可乐");
  138. List list = userMapper.selectList(queryWrapper);
  139. System.out.println(list);
  140. }
  141. /**
  142. _ notLike NOT LIKE ‘%parameter%’
  143. _ 实例 SQL:SELECT id,user_name,user_age FROM user WHERE (user_name NOT LIKE ?)
  144. */
  145. @Test
  146. public void testNotLike(){
  147. QueryWrapper queryWrapper = new QueryWrapper();
  148. queryWrapper.notLike("user_name","可乐");
  149. List list = userMapper.selectList(queryWrapper);
  150. System.out.println(list);
  151. }
  152. /**
  153. _ likeLeft LIKE ‘%parameter’
  154. _ 实例 SQL:SELECT id,user_name,user_age FROM user WHERE (user_name LIKE '%parameter')
  155. */
  156. @Test
  157. public void testLikeLeft(){
  158. QueryWrapper queryWrapper = new QueryWrapper();
  159. queryWrapper.likeLeft("user_name","可乐");
  160. List list = userMapper.selectList(queryWrapper);
  161. System.out.println(list);
  162. }
  163. /**
  164. _ likeRight LIKE ‘parameter%’
  165. _ 实例 SQL:SELECT id,user_name,user_age FROM user WHERE (user_name LIKE 'parameter%')
  166. */
  167. @Test
  168. public void testLikeRight(){
  169. QueryWrapper queryWrapper = new QueryWrapper();
  170. queryWrapper.likeRight("user_name","可乐");
  171. List list = userMapper.selectList(queryWrapper);
  172. System.out.println(list);
  173. }
  174. /**
  175. _ isNull 判断字段为 null
  176. _ 实例 SQL:SELECT id,user_name,user_age FROM user WHERE (user_name IS NULL)
  177. */
  178. @Test
  179. public void testIsNull(){
  180. QueryWrapper queryWrapper = new QueryWrapper();
  181. queryWrapper.isNull("user_name");
  182. List list = userMapper.selectList(queryWrapper);
  183. System.out.println(list);
  184. }
  185. /**
  186. _ isNotNull 判断字段不为 null
  187. _ 实例 SQL:SELECT id,user_name,user_age FROM user WHERE (user_name IS NOT NULL)
  188. */
  189. @Test
  190. public void testIsNotNull(){
  191. QueryWrapper queryWrapper = new QueryWrapper();
  192. queryWrapper.isNotNull("user_name");
  193. List list = userMapper.selectList(queryWrapper);
  194. System.out.println(list);
  195. }
  196. /**
  197. _ in 范围定值查询
  198. _ 实例 SQL:SELECT id,user_name,user_age FROM user WHERE (user_age IN (?,?,?))
  199. */
  200. @Test
  201. public void testIn(){
  202. QueryWrapper queryWrapper = new QueryWrapper();
  203. List queryList = new ArrayList<>();
  204. queryList.add(18);
  205. queryList.add(1);
  206. queryList.add(25);
  207. queryWrapper.in("user_age",queryList);
  208. List list = userMapper.selectList(queryWrapper);
  209. System.out.println(list);
  210. }
  211. /**
  212. _ notIn
  213. _ 实例 SQL:SELECT id,user_name,user_age FROM user WHERE (user_age IN (?,?,?))
  214. */
  215. @Test
  216. public void testNotIn(){
  217. QueryWrapper queryWrapper = new QueryWrapper();
  218. List queryList = new ArrayList<>();
  219. queryList.add(18);
  220. queryList.add(1);
  221. queryList.add(25);
  222. queryWrapper.notIn("user_age",queryList);
  223. List list = userMapper.selectList(queryWrapper);
  224. System.out.println(list);
  225. }
  226. /**
  227. _ inSql
  228. _ 实例 SQL:SELECT id,user_name,user_age FROM user WHERE (id IN (select id from user))
  229. */
  230. @Test
  231. public void testInSql(){
  232. QueryWrapper queryWrapper = new QueryWrapper();
  233. // 查询所有数据
  234. queryWrapper.inSql("id","select id from user");
  235. List list = userMapper.selectList(queryWrapper);
  236. System.out.println(list);
  237. }
  238. /**
  239. _ notInSql
  240. _ 实例 SQL:SELECT id,user_name,user_age FROM user WHERE (id NOT IN (select id from user where id> 2))
  241. */
  242. @Test
  243. public void testNotInSql(){
  244. QueryWrapper queryWrapper = new QueryWrapper();
  245. // 查询所有数据
  246. queryWrapper.notInSql("id","select id from user where id> 2");
  247. List list = userMapper.selectList(queryWrapper);
  248. System.out.println(list);
  249. }
  250. /**
  251. _ groupBy 分组
  252. _ 下面 SQL 有个问题,在 MySQL8.0 版本中,是可以执行下面 SQL 语句的,select user_name 并没有出现在 group by 语句中
  253. _ 实例 SQL:SELECT id,user_name,user_age FROM user GROUP BY id,user_age
  254. _/
  255. @Test
  256. public void testGroupBy(){
  257. QueryWrapper queryWrapper = new QueryWrapper();
  258. queryWrapper.groupBy("id","user_age");
  259. List list = userMapper.selectList(queryWrapper);
  260. System.out.println(list);
  261. }
  262. /**
  263. _ orderByAsc 升序
  264. _ 实例 SQL:SELECT id,user_name,user_age FROM user ORDER BY id ASC,user_age ASC
  265. */
  266. @Test
  267. public void testOrderByAsc(){
  268. QueryWrapper queryWrapper = new QueryWrapper();
  269. queryWrapper.orderByAsc("id","user_age");
  270. List list = userMapper.selectList(queryWrapper);
  271. System.out.println(list);
  272. }
  273. /**
  274. _ orderByDesc 降序
  275. _ 实例 SQL:SELECT id,user_name,user_age FROM user ORDER BY id DESC,user_age DESC
  276. */
  277. @Test
  278. public void testOrderByDesc(){
  279. QueryWrapper queryWrapper = new QueryWrapper();
  280. queryWrapper.orderByDesc("id","user_age");
  281. List list = userMapper.selectList(queryWrapper);
  282. System.out.println(list);
  283. }
  284. /**
  285. _ orderBy 指定顺序排序
  286. _ 实例 SQL:SELECT id,user_name,user_age FROM user ORDER BY id ASC,user_age ASC
  287. */
  288. @Test
  289. public void testOrderBy(){
  290. QueryWrapper queryWrapper = new QueryWrapper();
  291. queryWrapper.orderBy(true,true,"id","user_age");
  292. List list = userMapper.selectList(queryWrapper);
  293. System.out.println(list);
  294. }
  295. /**
  296. _ having
  297. _ 实例 SQL:SELECT id,user_name,user_age FROM user GROUP BY id,user_age HAVING sum(user_age)>?
  298. */
  299. @Test
  300. public void testHaving(){
  301. QueryWrapper queryWrapper = new QueryWrapper();
  302. queryWrapper.groupBy("id","user_age");
  303. queryWrapper.having("sum(user_age)>{0}","25");
  304. List list = userMapper.selectList(queryWrapper);
  305. System.out.println(list);
  306. }
  307. /**
  308. _ having
  309. _ 实例 SQL:SELECT id,user_name,user_age FROM user WHERE (id = ? OR user_age = ?)
  310. */
  311. @Test
  312. public void testOr(){
  313. QueryWrapper queryWrapper = new QueryWrapper();
  314. queryWrapper.eq("id",1);
  315. queryWrapper.or();
  316. queryWrapper.eq("user_age",25);
  317. List list = userMapper.selectList(queryWrapper);
  318. System.out.println(list);
  319. }
  320. /**
  321. _ and
  322. _ 实例 SQL:SELECT id,user_name,user_age FROM user WHERE ((id = ? AND user_age <> ?))
  323. */
  324. @Test
  325. public void testAnd(){
  326. QueryWrapper queryWrapper = new QueryWrapper<>();
  327. queryWrapper.and(i->i.eq("id",1).ne("user_age",18));
  328. List list = userMapper.selectList(queryWrapper);
  329. System.out.println(list);
  330. }
  331. /**
  332. _ nested
  333. _ 实例 SQL:SELECT id,user_name,user_age FROM user WHERE ((id = ? AND user_age <> ?))
  334. */
  335. @Test
  336. public void testNested(){
  337. QueryWrapper queryWrapper = new QueryWrapper<>();
  338. queryWrapper.nested(i->i.eq("id",1).ne("user_age",18));
  339. List list = userMapper.selectList(queryWrapper);
  340. System.out.println(list);
  341. }
  342. /**
  343. _ apply
  344. _ 实例 SQL:SELECT id,user_name,user_age FROM user WHERE (user_age>?)
  345. */
  346. @Test
  347. public void testApplyd(){
  348. QueryWrapper queryWrapper = new QueryWrapper<>();
  349. queryWrapper.apply("user_age>{0}","25 or 1=1");
  350. List list = userMapper.selectList(queryWrapper);
  351. System.out.println(list);
  352. }
  353. /**
  354. _ last
  355. _ 实例 SQL:SELECT id,user_name,user_age FROM user limit 1
  356. */
  357. @Test
  358. public void testLast(){
  359. QueryWrapper queryWrapper = new QueryWrapper<>();
  360. queryWrapper.last("limit 1");
  361. List list = userMapper.selectList(queryWrapper);
  362. System.out.println(list);
  363. }
  364. /**
  365. _ exists
  366. _ 实例 SQL:SELECT id,user_name,user_age FROM user WHERE (EXISTS (select id from user where user_age = 1))
  367. */
  368. @Test
  369. public void testExists(){
  370. QueryWrapper queryWrapper = new QueryWrapper<>();
  371. queryWrapper.exists("select id from user where user_age = 1");
  372. List list = userMapper.selectList(queryWrapper);
  373. System.out.println(list);
  374. }
  375. /**
  376. _ notExists
  377. _ 实例 SQL:SELECT id,user_name,user_age FROM user WHERE (EXISTS (select id from user where user_age = 1))
  378. */
  379. @Test
  380. public void testNotExists(){
  381. QueryWrapper queryWrapper = new QueryWrapper<>();
  382. queryWrapper.notExists("select id from user where user_age = 1");
  383. List list = userMapper.selectList(queryWrapper);
  384. System.out.println(list);
  385. }
  386. }

4、LambdaQueryWrapper 和 LambdaUpdateWrapper(推荐)

LambdaQueryWrapper 和 LambdaUpdateWrapper 这是相对于 QueryWrapper 及 UpdateWrapper 的 Lmbda 语法实现方式。

分别通过如下两种方式获取:

// 两种方式        
LambdaQueryWrapper queryLambda = new QueryWrapper().lambda();
LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>();

// 两种方式
LambdaUpdateWrapper updateLambda = new UpdateWrapper().lambda();
LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper();


/**
注意:获取 LambdaQueryWrapper 和 LambdaUpdateWrapper 对象时,为了使用 lambda 语法,要使用泛型。

下面我演示几个实例:
**/
/**
 _ LambdaQueryWrapper
 _ SQL 实例:SELECT id,user_name,user_age FROM user WHERE (id = ? AND user_age <> ?)
 */
@Test  
public void testLambdaQueryWrapper(){
    LambdaQueryWrapper queryLambda = new LambdaQueryWrapper<>();
    queryLambda.eq(User::getId,"1").ne(User::getUserAge,25);
    List users = userMapper.selectList(queryLambda);
    System.out.println(users);

}

/**
 _ LambdaQueryWrapper
 _ SQL 实例:UPDATE user SET user_name=? WHERE (user_name = ?)
 */
@Test  
public void testLambdaUpdateWrapper(){
    User user = new User();
    user.setUserName("LambdaUpdateWrapper");
    LambdaUpdateWrapper userLambdaUpdateWrapper = new LambdaUpdateWrapper<>();
    userLambdaUpdateWrapper.eq(User::getUserName,"IT 可乐");
    userMapper.update(user,userLambdaUpdateWrapper);

}

5、总结

对于 mybatis plus 中的四种条件构造器,我们就到此结束了,大家可以按照我的实例敲一遍代码,基本上就没啥问题了。

有没有发现使用 Lambda 语法很爽,语法简洁,另外有个优点是,使用 QueryWrapper 或者 UpdateWrapper 时,对于条件的某个列,我们是写的字符串配置,比如 QueryWrapper.eq(“id”,1); 这里的 id 是数据库表的列名,很有可能我们会写错,但是通过 lambda 的方式,LambdaQueryWrapper.eq(User::getId,1),这样就不会有写错的可能了。所以推荐大家使用 Lambda 的方式。

至此,mybatis plus 的常规用法就全部介绍结束了,当然,事情还远没有结束,为了让大家用得更爽,后续将给大家介绍一些高阶玩法。