1 2 3 4 5 6 7 8 9 10 11 12
@Test public void insert () { User user = new User(); user.setName("刘明强" ); user.setAge(31 ); user.setManagerId(1L ); user.setCreateTime(new Date()); int rows = userMapper.insert(user); System.out.println("影响记录数: " + rows); System.out.println("User的新主键是: " + user.getId()); }
官方文档
打开
com.baomidou.mybatisplus.core.conditions.AbstractWrapper
这个类,提供了很多的条件构造方法。为了方便说明,现在已几个需求来进行说明
名字中包含“雨”并且年龄小于40
SQL 是
1 2 3 4 5 6 7
SELECT * FROM user WHERE name LIKE '%雨%' AND age < 40
Java 代码
1 2 3 4 5 6 7 8
@Test public void selectByWrapper () { List<User> users = userMapper.selectList(new QueryWrapper<User>() .like("name" , "雨" ) .lt("age" , 40 )); users.forEach(System.out::println); }
名字中包含“雨”并且年龄大于等于20且小于40并且email不为空
1 2 3 4 5 6 7 8 9
SELECT * FROM user WHERE name LIKE '%雨%' AND age >= 20 AND age <= 40 AND email IS NOT NULL
Java 代码
1 2 3 4 5 6 7 8 9
@Test public void selectByWrapper2 () { List<User> users = userMapper.selectList(new QueryWrapper<User>() .like("name" , "雨" ) .between("age" , 20 , 40 ) .isNotNull("email" )); users.forEach(System.out::println); }
姓王或者年龄大于等于25,按照年龄降序排列,年龄相同按照id升序排列
1 2 3 4 5 6 7 8 9 10
SELECT * FROM user WHERE name LIKE '王%' OR age >= 25 ORDER BY age DESC , id ASC
Java 代码
1 2 3 4 5 6 7 8 9 10 11
@Test public void selectByWrapper3 () { List<User> users = userMapper.selectList(new QueryWrapper<User>() .likeRight("name" , "王" ) .or() .ge("age" , 40 ) .orderByDesc("age" ) .orderByAsc("id" )); users.forEach(System.out::println); }
创建日期为2019年2月14日,并且直属上级姓王
1 2 3 4 5 6 7 8
SELECT * FROM user WHERE date_forma(create_time, '%Y-%m-%d' ) = '2019-02-14' AND manager_id IN (SELECT id FROM user WHERE name LIKE '王%' )
Java代码。这里要使用
apply
和
inSql
apply
用于调用 SQL 的函数。
inSql
用在调用
IN
后面拼接 SQL 语句的场景
1 2 3 4 5 6 7 8
@Test public void selectByWrapper4 () { List<User> users = userMapper.selectList(new QueryWrapper<User>() .apply("date_format(create_time,'%Y-%m-%d') = {0}" , "2019-02-14" ) .inSql("manager_id" , "SELECT id FROM user WHERE name LIKE '王%'" )); users.forEach(System.out::println); }
注意:
使用
apply
的时候推荐使用占位符
{}
,这样可以防止 SQL 注入的风险
姓王并且(年龄小于40或者邮箱不为空)
1 2 3 4 5 6 7
SELECT * FROM user WHERE name LIKE '王%' AND (age < 40 OR email IS NOT NULL )
这里
AND
后面跟着一个括号,括号里也是一个条件判断。这时候要用
and
Java代码
1 2 3 4 5 6 7 8 9 10
@Test public void selectByWrapper5 () { List<User> users = userMapper.selectList(new QueryWrapper<User>() .likeRight("name" , "王" ) .and(qr -> qr.lt("age" , 40 ) .or() .isNotNull("email" ))); users.forEach(System.out::println); }
姓王或者(年龄小于40并且大于20并且邮箱不为空)
1 2 3 4 5 6 7
SELECT * FROM user WHERE name LIKE '王%' OR (age < 40 AND age > 20 AND email IS NOT NULL )
和上面的例子 5 一样,
OR
后面也跟着一对括号。这时候可以用
or
Java代码
1 2 3 4 5 6 7 8 9 10
@Test public void selectByWrapper6 () { List<User> users = userMapper.selectList(new QueryWrapper<User>() .likeRight("name" , "王" ) .or(qr -> qr.lt("age" , 40 ) .gt("age" , 20 ) .isNotNull("email" ))); users.forEach(System.out::println); }
(年龄小于40或者邮箱不为空)并且姓王
1 2 3 4 5 6
SELECT * FROM user WHERE (age < 40 OR email IS NOT NULL ) AND name LIKE '王%'
Java代码
和例子 5 和例子 6 不同。这里是正常嵌套,SQL 句子前面不带
AND
或者
OR
,这时候要借助
nested
1 2 3 4 5 6 7 8 9 10
@Test public void selectByWrapper7 () { List<User> users = userMapper.selectList(new QueryWrapper<User>() .nested(qr -> qr.lt("age" , 40 ) .or() .isNotNull("email" )) .likeRight("name" , "王" )); users.forEach(System.out::println); }
年龄为 30 或者 31 或者 34 或者 35
1 2 3 4 5 6
SELECT * FROM user WHERE age IN (30 , 31 , 34 , 35 )
Java代码
1 2 3 4 5 6 7
@Test public void selectByWrapper8 () { List<User> users = userMapper.selectList(new QueryWrapper<User>() .in("age" , Arrays.asList(30 , 31 , 34 , 35 ))); users.forEach(System.out::println); }
年龄为30、31、34、35,只返回满足条件的其中一条语句即可
1 2 3 4 5 6 7
SELECT * FROM user WHERE age IN (30 , 31 , 34 , 35 ) LIMIT 1
Java代码
1 2 3 4 5 6 7 8
@Test public void selectByWrapper9 () { List<User> users = userMapper.selectList(new QueryWrapper<User>() .in("age" , Arrays.asList(30 , 31 , 34 , 35 )) .last("LIMIT 1" )); users.forEach(System.out::println); }
注意:
last()
方法只能调用 1 次
select
来实现
名字中包含“雨”并且年龄小于40,只列出 id 和 name 字段
1 2 3 4 5 6 7
SELECT id , name FROM user WHERE name LIKE '%雨%' AND age < 40
Java代码
1 2 3 4 5 6 7 8 9
@Test public void selectByWrapper10 () { List<User> users = userMapper.selectList(new QueryWrapper<User>() .select("id" , "name" ) .like("name" , "雨" ) .lt("age" , 40 )); users.forEach(System.out::println); }
名字中包含“雨”并且年龄小于40,除了 create_time 和 manager_id 字段外都列出
1 2 3 4 5 6 7
SELECT id , name , age, email FROM user WHERE name LIKE '%雨%' AND age < 40
Java代码
除了 create_time 和 manager_id 字段外都列出,
select
也支持
1 2 3 4 5 6 7 8 9
@Test public void selectByWrapper11 () { List<User> users = userMapper.selectList(new QueryWrapper<User>().like("name" , "雨" ) .lt("age" , 40 ) .select(User.class, fieldInfo -> !fieldInfo.getColumn().equals("create_time" ) && !fieldInfo.getColumn().equals("manager_id" ))); users.forEach(System.out::println); }
allEq
需要传入一个
Map
。
allEq
方法还可以接受第二个 boolean 类型的参数
null2IsNull
。它表示如果传入的 KV 键值对中 V 是
null
的话,就转换成
K IS NULL
比如,这样的 SQL 语句
1 2 3 4 5 6 7 8
SELECT * FROM user WHERE name = ? AND age = ? AND email IS NULL
使用
allEq
实现的话,Java 代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13
@Test public void selectByWrapperAllEq () { QueryWrapper<User> queryWrapper = new QueryWrapper<>(); Map<String, Object> params = new HashMap<>(); params.put("name" , "刘明强" ); params.put("age" , 31 ); params.put("email" , null ); queryWrapper.allEq(params, true ); List<User> users = userMapper.selectList(queryWrapper); users.forEach(System.out::println); }
如果传入的
null2IsNull
为
false
,那么 KV 键值对中的 V 为
null
的话,就会被忽略
1 2 3 4 5 6 7 8 9 10 11 12 13
@Test public void selectByWrapperAllEq () { QueryWrapper<User> queryWrapper = new QueryWrapper<>(); Map<String, Object> params = new HashMap<>(); params.put("name" , "刘明强" ); params.put("age" , 31 ); params.put("email" , null ); queryWrapper.allEq(params, false ); List<User> users = userMapper.selectList(queryWrapper); users.forEach(System.out::println); }
日志打印的 SQL 语句是
1 2 3 4 5
DEBUG==> Preparing: SELECT id,name,age,email,manager_id,create_time FROM user WHERE name = ? AND age = ? DEBUG==> Parameters: 刘明强(String), 31(Integer) TRACE<== Columns: id, name, age, email, manager_id, create_time TRACE<== Row: 1145231894878457857, 刘明强, 31, null, 1088248166370832385, 2019-06-30 15:25:36 DEBUG<== Total: 1
可以看到
email
-
null
键值对被忽略了
1 2 3 4 5 6 7
List<Object> selectObjs (@Param(Constants.WRAPPER) Wrapper<T> queryWrapper) ;
文档
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
package com.ikutarian.mp.dao;import com.baomidou.mybatisplus.core.conditions.Wrapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;import com.baomidou.mybatisplus.core.toolkit.Constants;import com.ikutarian.mp.entity.User;import org.apache.ibatis.annotations.Param;import org.apache.ibatis.annotations.Select;import java.util.List;public interface UserMapper extends BaseMapper <User > { @Select ("SELECT * FROM user ${ew.customSqlSegment}" ) List<User> selectAll (@Param(Constants.WRAPPER) Wrapper<User> wrapper) ; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14
package com.ikutarian.mp.config;import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;@Configuration public class MybatisPlusConfig { @Bean public PaginationInterceptor paginationInterceptor () { return new PaginationInterceptor(); } }
1 2 3 4 5 6 7
IPage<T> selectPage (IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper) ;
1 2 3 4 5
@Test public void deleteByIds () { int rows = userMapper.deleteBatchIds(Arrays.asList(1 , 2 , 3 )); System.out.println("影响记录数: " + rows); }