V1.0 已更新为 V-2.0 传送门→ (V-2.0)Mybatis-Plus中的查(select)和QueryWrapper条件构造器
前言
本文介绍 mybatis-plus 中查询方法 ( select ) 和 Wrapper 条件构造器的使用,目的 mapper 方法中对数据库的处理。代码中都用到了 Wrappers 类中的静态方法生成 LambdaQueryWrapper LambdaUpdateWrapper 。相比较 QueryWrapper,UpdateWrapper 前两者好处多多。
如需了解 Wrappers 使用小技巧 请移步另一篇博客 →→→ Wrappers使用小技巧
1,selectOne()方法。
根据 QueryWrapper 的条件 查询返回一条数据,查询出多条数据则报错。
QueryWrapper<T> queryWrapper = new QueryWrapper<T>();
User user = userMapper.selectOne(QueryWrapper < T > queryWrapper);
SQL 语句如下:
==> Preparing: SELECT id,name,sex,age,address FROM user WHERE (id = ?)
==> Parameters: 13(Integer)
<== Total: 0
2,selectList()方法。
根据 QueryWrapper 的条件 查询返回多条数据(List<T> 集合)。
QueryWrapper<T> queryWrapper = new QueryWrapper<T>();
List<User> users = userMapper.selectList(QueryWrapper<T> queryWrapper);
SQL 语句如下:
==> Preparing: SELECT id,name,sex,age,address FROM user WHERE (age > ?)
==> Parameters: 12(Integer)
<== Columns: id, name, sex, age, address
<== Row: 7, null, 男, 13, kks
<== Row: 8, null, 男, 13, kks
<== Total: 2
3,selectCount()方法。
根据 QueryWrapper 的条件 查询返回总数据的条数。
QueryWrapper<T> queryWrapper = new QueryWrapper<T>();
Integer integer = userMapper.selectCount(QueryWrapper < T > queryWrapper);
SQL 语句如下:
==> Preparing: SELECT COUNT( * ) FROM user WHERE (age > ?)
==> Parameters: 12(Integer)
<== Columns: COUNT( * )
<== Row: 2
<== Total: 1
4,selectMaps()方法。
根据 QueryWrapper 的条件 查询返回多条数据(List<Map<String,Object>> ListMap集合)。
QueryWrapper<T> queryWrapper = new QueryWrapper<T>();
List<Map<String, Object>> maps = userMapper.selectMaps(QueryWrapper < T > queryWrapper);
SQL 语句如下:
==> Preparing: SELECT id,name,sex,age,address FROM user WHERE (age > ?)
==> Parameters: 12(Integer)
<== Columns: id, name, sex, age, address
<== Row: 7, null, 男, 13, kks
<== Row: 8, null, 男, 13, kks
<== Total: 2
{address=kks, sex=男, id=7, age=13}
{address=kks, sex=男, id=8, age=13}
5,selectByMap()方法。
根据 columnMap 封装的条件 查询返回多条数据(List<T> 集合)。
Map<String, Object> columnMap = new HashMap<>();
columnMap.put("id", 7);
columnMap.put("sex", "男");
List<User> users = userMapper.selectByMap(Map<String, Object>columnMap);
SQL 语句如下:
==> Preparing: SELECT id,name,sex,age,address FROM user WHERE sex = ? AND id = ?
==> Parameters: 男(String), 7(Integer)
<== Columns: id, name, sex, age, address
<== Row: 7, null, 男, 13, kks
<== Total: 1
6,selectById()方法。
根据传入的 id 进行查询 查询成功返回单条数据,否则返回 null
User user = userMapper.selectById(Serializable id);
SQL 语句如下:
==> Preparing: SELECT id,name,sex,age,address FROM user WHERE id=?
==> Parameters: 7(Integer)
<== Columns: id, name, sex, age, address
<== Row: 7, null, 男, 13, kks
<== Total: 1
7,selectBatchIds()方法。
根据传入的 idList 集合 进行查询返回多条数据(List<T> 集合)。。
List<Integer> idList = new ArrayList<>();
idList.add(5);
idList.add(6);
List<User> users = userMapper.selectBatchIds(Collection<? extends Serializable> idList);
SQL 语句如下:
==> Preparing: SELECT id,name,sex,age,address FROM user WHERE id IN ( ? , ? )
==> Parameters: 5(Integer), 6(Integer)
<== Total: 0
8,selectPage()方法。
9,selectMapsPage()方法。
10,QueryWrapper 的使用。
10.1, allEq() 方法。
allEq( Map < String, Object > params )
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
// 封装的条件 即便 map 参数的值为 null 仍然查询
Map<String, Object> map = new HashMap<>();
map.put("id", 7);
map.put("age", null);
queryWrapper.allEq(Map < String, Object > params);
List<User> users = userMapper.selectList(queryWrapper);
SQL 语句如下:
==> Preparing: SELECT id,name,sex,age,address FROM user WHERE (id = ? AND age IS NULL)
==> Parameters: 7(Integer)
<== Total: 0
allEq( Map < String, Object > params,boolean null2IsNull )
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
/**
* 封装的条件 map 参数的值为 null 自动忽略
*/
Map<String, Object> map = new HashMap<>();
map.put("id", 7);
map.put("age", null);
// 布尔值为 false 时自动忽略 map 参数值为空 true 时跟上边一样
queryWrapper.allEq(Map < String, Object > params,boolean null2IsNull);
List<User> users = userMapper.selectList(queryWrapper);
SQL 语句如下:
==> Preparing: SELECT id,name,sex,age,address FROM user WHERE (id = ?)
==> Parameters: 7(Integer)
<== Columns: id, name, sex, age, address
<== Row: 7, null, 男, 13, kks
<== Total: 1
10.2, eq() 方法。
eq( String column,Object val )
List<User> userList = userMapper.selectList(Wrappers.<User>lambdaQuery()
/**
* 多用于 判断单个字段值是否相等
* column: 数据库字段名
* val: 字段值
* */
.eq(User::getName,"张三")
.eq(User::getSex,"男")
);
SQL 语句如下:
==> Preparing: SELECT id,name,sex,age,address,card FROM user WHERE (name = ? AND sex = ?)
==> Parameters: 张三(String), 男(String)
<== Total: 0
eq(boolean condition,String column,0bject val)
和上一个相比此方法多一个布尔值条件,用于条件的拼接,true 表示拼接此条件,false 表示不拼接此条件,如下图可以看出区别。 日常代码中可能需要此业务/(ㄒoㄒ)/~~
10.3, ne() 方法。
ne( String column,Object val )
List<User> userList = userMapper.selectList(Wrappers.<User>lambdaQuery()
/**
* 不等于某个值
* column: 数据库字段名
* val: 字段值
* */
.ne(User::getName,"张三")
.ne(User::getSex,"男")
);
SQL 语句如下:
==> Preparing: SELECT id,name,sex,age,address,card FROM user WHERE (name <> ? AND sex <> ?)
==> Parameters: 赵六(String), 男(String)
<== Columns: id, name, sex, age, address, card
<== Row: 29, 李四, 女, 33, 整修后是, null
<== Row: 44, 王八蛋, 鬼怪, 0, 整修后是, 410482111
<== Total: 2
ne(boolean condition,String column,0bject val)
和上一个相比此方法多一个布尔值条件,用于条件的拼接,true 表示拼接此条件,false 表示不拼接此条件。 图解,看 eq 方法讲解即可。
10.4, gt() 方法。
gt( String column,Object val )
List<User> userList = userMapper.selectList(Wrappers.<User>lambdaQuery()
/**
* 大于某个值
* column: 数据库字段名
* val: 字段值
* */
.gt(User::getAge,100)
.gt(User::getId,2)
);
SQL 语句如下:
==> Preparing: SELECT id,name,sex,age,address,card FROM user WHERE (age > ? AND id > ?)
==> Parameters: 100(Integer), 2(Integer)
<== Total: 0
gt(boolean condition,String column,0bject val)
和上一个相比此方法多一个布尔值条件,用于条件的拼接,true 表示拼接此条件,false 表示不拼接此条件。 图解,看 eq 方法讲解即可。
10.5, ge() 方法。
ge( String column,Object val)
List<User> userList = userMapper.selectList(Wrappers.<User>lambdaQuery()
/**
* 大于等于某个值
* column: 数据库字段名
* val: 字段值
* */
.ge(User::getAge,100)
.ge(User::getId,2)
);
SQL 语句如下:
==> Preparing: SELECT id,name,sex,age,address,card FROM user WHERE (age >= ? AND id >= ?)
==> Parameters: 100(Integer), 2(Integer)
<== Total: 0
ge(boolean condition,String column,0bject val)
和上一个相比此方法多一个布尔值条件,用于条件的拼接,true 表示拼接此条件,false 表示不拼接此条件。 图解,看 eq 方法讲解即可。
10.6, lt() 方法。
lt( String column,Object val )
List<User> userList = userMapper.selectList(Wrappers.<User>lambdaQuery()
/**
* 小于某个值
* column: 数据库字段名
* val: 字段值
* */
.lt(User::getAge,100)
.lt(User::getId,2)
);
SQL 语句如下:
==> Preparing: SELECT id,name,sex,age,address,card FROM user WHERE (age < ? AND id < ?)
==> Parameters: 100(Integer), 2(Integer)
<== Total: 0
lt(boolean condition,String column,0bject val)
和上一个相比此方法多一个布尔值条件,用于条件的拼接,true 表示拼接此条件,false 表示不拼接此条件。 图解,看 eq 方法讲解即可。
10.7, le() 方法。
le( String column,Object val )
List<User> userList = userMapper.selectList(Wrappers.<User>lambdaQuery()
/**
* 小于等于某个值
* column: 数据库字段名
* val: 字段值
* */
.le(User::getAge,100)
.le(User::getId,2)
);
SQL 语句如下:
==> Preparing: SELECT id,name,sex,age,address,card FROM user WHERE (age <= ? AND id <= ?)
==> Parameters: 100(Integer), 2(Integer)
<== Total: 0
le(boolean condition,String column,0bject val)
和上一个相比此方法多一个布尔值条件,用于条件的拼接,true 表示拼接此条件,false 表示不拼接此条件。 图解,看 eq 方法讲解即可。
10.8, between() 方法。
between( String column,Object val1,Object val2 )
List<User> userList = userMapper.selectList(Wrappers.<User>lambdaQuery()
/**
* 在某个区间内 闭区间 包含两头的数字
* column: 数据库字段名
* val1: 起始值
* val2: 终止值
* */
.between(User::getAge,100,200)
.between(User::getId,2,20)
);
SQL 语句如下:
==> Preparing: SELECT id,name,sex,age,address,card FROM user WHERE (age BETWEEN ? AND ? AND id BETWEEN ? AND ?)
==> Parameters: 100(Integer), 200(Integer), 2(Integer), 20(Integer)
<== Total: 0
between(boolean condition,String column,Object val1,Object val2)
和上一个相比此方法多一个布尔值条件,用于条件的拼接,true 表示拼接此条件,false 表示不拼接此条件。 图解,看 eq 方法讲解即可。
10.9, notBetween 方法。
notBetween( String column,Object val1,Object val2 )
List<User> userList = userMapper.selectList(Wrappers.<User>lambdaQuery()
/**
* 不在某个区间内 闭区间 包含两头的数字
* column: 数据库字段名
* val1: 起始值
* val2: 终止值
* */
.notBetween(User::getAge,2,20)
.notBetween(User::getId,28,200)
);
SQL 语句如下:
==> Preparing: SELECT id,name,sex,age,address,card FROM user WHERE (age NOT BETWEEN ? AND ? AND id NOT BETWEEN ? AND ?)
==> Parameters: 2(Integer), 20(Integer), 28(Integer), 200(Integer)
<== Total: 0
notBetween(boolean condition,String column,Object val1,Object val2)
和上一个相比此方法多一个布尔值条件,用于条件的拼接,true 表示拼接此条件,false 表示不拼接此条件。 图解,看 eq 方法讲解即可。
10.10, like() 方法。
like( String column,Object val )
List<User> userList = userMapper.selectList(Wrappers.<User>lambdaQuery()
/**
* 模糊查询 相当于 %XX%
* column: 数据库字段名
* val: 字段值
* */
.like(User::getAge, 1)
.like(User::getCard,"上海")
);
SQL 语句如下:
==> Preparing: SELECT id,name,sex,age,address,card FROM user WHERE (age LIKE ? AND card LIKE ?)
==> Parameters: %1%(String), %上海%(String)
<== Total: 0
like(boolean condition,String column,Object val)
和上一个相比此方法多一个布尔值条件,用于条件的拼接,true 表示拼接此条件,false 表示不拼接此条件。 图解,看 eq 方法讲解即可。
10.11, notLike() 方法。
notLike( String column,Object val )
List<User> userList = userMapper.selectList(Wrappers.<User>lambdaQuery()
/**
* 模糊查询 查询没有某个值
* column: 数据库字段名
* val: 字段值
* */
.notLike(User::getAge, 1)
.notLike(User::getCard,"上海")
);
SQL 语句如下:
==> Preparing: SELECT id,name,sex,age,address,card FROM user WHERE (age NOT LIKE ? AND card NOT LIKE ?)
==> Parameters: %1%(String), %上海%(String)
<== Total: 0
notLike(boolean condition,String column,Object val)
和上一个相比此方法多一个布尔值条件,用于条件的拼接,true 表示拼接此条件,false 表示不拼接此条件。 图解,看 eq 方法讲解即可。
10.12,likeLeft() 方法。
likeLeft( String column,Object val )
List<User> userList = userMapper.selectList(Wrappers.<User>lambdaQuery()
/**
* 左模糊查询 相当于 %XX
* column: 数据库字段名
* val: 字段值
* */
.likeLeft(User::getAge, 2)
.likeLeft(User::getCard,"李")
);
SQL 语句如下:
==> Preparing: SELECT id,name,sex,age,address,card FROM user WHERE (age LIKE ? AND card LIKE ?)
==> Parameters: %2(String), %李(String)
<== Total: 0
likeLeft(boolean condition,String column,Object val)
和上一个相比此方法多一个布尔值条件,用于条件的拼接,true 表示拼接此条件,false 表示不拼接此条件。 图解,看 eq 方法讲解即可。
10.13, likeRight() 方法。
likeRight( String column,Object val )
List<User> userList = userMapper.selectList(Wrappers.<User>lambdaQuery()
/**
* 右模糊查询 相当于 XX%
* column: 数据库字段名
* val: 字段值
* */
.likeRight(User::getAge, 2)
.likeRight(User::getName,"李")
);
SQL 语句如下:
==> Preparing: SELECT id,name,sex,age,address,card FROM user WHERE (age LIKE ? AND name LIKE ?)
==> Parameters: 2%(String), 李%(String)
<== Total: 0
likeRight(boolean condition,String column,Object val)
和上一个相比此方法多一个布尔值条件,用于条件的拼接,true 表示拼接此条件,false 表示不拼接此条件。 图解,看 eq 方法讲解即可。
10.14, isNull() 方法。
isNull( String column )
List<User> userList = userMapper.selectList(Wrappers.<User>lambdaQuery()
/**
* 查询字段值为 null 的数据
* */
.isNull(User::getAge)
);
SQL 语句如下:
==> Preparing: SELECT id,name,sex,age,address,card FROM user WHERE (age IS NULL)
==> Parameters:
<== Columns: id, name, sex, age, address, card
<== Row: 28, 李1四, 男, null, 上海, 410482
<== Total: 1
isNull(boolean condition,String column)
和上一个相比此方法多一个布尔值条件,用于条件的拼接,true 表示拼接此条件,false 表示不拼接此条件。 图解,看 eq 方法讲解即可。
10.15, isNotNull() 方法。
isNotNull( String column )
List<User> userList = userMapper.selectList(Wrappers.<User>lambdaQuery()
/**
* 查询字段值为 null 的数据
* */
.isNotNull(User::getCard)
);
SQL 语句如下:
==> Preparing: SELECT id,name,sex,age,address,card FROM user WHERE (card IS NOT NULL)
==> Parameters:
<== Columns: id, name, sex, age, address, card
<== Row: 28, 李1四, 男, null, 上海, 410482
<== Total: 1
isNotNull(boolean condition,String column)
和上一个相比此方法多一个布尔值条件,用于条件的拼接,true 表示拼接此条件,false 表示不拼接此条件。 图解,看 eq 方法讲解即可。
10.16, in() 方法。
in( String column,Object... values )
List<User> userList = userMapper.selectList(Wrappers.<User>lambdaQuery()
/**
* column: 字段名
* values: 字段值 可变字符串
* */
.in(User::getId,"55","56")
);
in( String column,Collection<?> coll )
List<String> coll = Arrays.asList("55", "56");
List<User> userList = userMapper.selectList(Wrappers.<User>lambdaQuery()
/**
* column: 字段名
* values: 字段值 集合
* */
.in(User::getId, coll)
);
SQL 语句如下:
==> Preparing: SELECT id,name,sex,age,address,card FROM user WHERE (id IN (?,?))
==> Parameters: 55(String), 56(String)
<== Columns: id, name, sex, age, address, card
<== Row: 55, 赵六, 女, 33, 整修后是, null
<== Row: 56, 赵六, 女, 33, 整修后是, null
<== Total: 2
in(boolean condition,String column,Object... values)
和上二个相比此方法多一个布尔值条件,用于条件的拼接,true 表示拼接此条件,false 表示不拼接此条件。 图解,看 eq 方法讲解即可。
10.17, notIn() 方法。
notIn( String column,Collection<?> coll )
List<User> userList = userMapper.selectList(Wrappers.<User>lambdaQuery()
/**
* column: 字段名
* values: 字段值
* */
.notIn(User::getId, "55","56")
);
notIn( String column,Object... values )
List<String> coll = Arrays.asList("55", "56");
List<User> userList = userMapper.selectList(Wrappers.<User>lambdaQuery()
/**
* column: 字段名
* values: 字段值
* */
.notIn(User::getId, coll)
);
SQL 语句如下:
==> Preparing: SELECT id,name,sex,age,address,card FROM user WHERE (id NOT IN (?,?))
==> Parameters: 55(String), 56(String)
<== Columns: id, name, sex, age, address, card
<== Row: 28, 李1四, 男, null, 上海, 410482
<== Total: 1
notIn(boolean condition,String column,Object... values)
和上二个相比此方法多一个布尔值条件,用于条件的拼接,true 表示拼接此条件,false 表示不拼接此条件。 图解,看 eq 方法讲解即可。
10.18, inSql() 方法。
helpGuanWang
10.19, notInSql() 方法。
helpGuanWang
10.20, groupBy() 方法。(待理解)
groupBy( String... columns )
List<User> userList = userMapper.selectList(Wrappers.<User>lambdaQuery()
/**
* 分组函数 多和 having 一同使用
* columns: 字段名
* */
.groupBy(User::getSex)
);
SQL 语句如下:
==> Preparing: SELECT id,name,sex,age,address,card FROM user GROUP BY sex
==> Parameters:
<== Columns: id, name, sex, age, address, card
<== Row: 29, 李四, 女, 33, 整修后是, null
<== Row: 28, 李1四, 男, null, 上海, 410482
<== Row: 44, 王八蛋, 鬼怪, 0, 整修后是, 410482111
<== Total: 3
groupBy(boolean condition,String... columns)
和上一个相比此方法多一个布尔值条件,用于条件的拼接,true 表示拼接此条件,false 表示不拼接此条件。 图解,看 eq 方法讲解即可。
10.21, orderByAsc() 方法。
orderbyAsc( String... columns )
List<User> userList = userMapper.selectList(Wrappers.<User>lambdaQuery()
/**
* 升序排列 根据字段的顺序优先级
* columns: 字段名
* */
.orderByAsc(User::getId,User::getAge,User::getCard)
);
SQL 语句如下:
==> Preparing: SELECT id,name,sex,age,address,card FROM user ORDER BY id ASC,age ASC,card ASC
==> Parameters:
<== Columns: id, name, sex, age, address, card
<== Row: 28, 李1四, 男, 11, 上海, 410482
<== Row: 29, 李四, 女, 33, 整修后是, null
<== Total: 2
orderbyAsc(boolean condition,String... columns)
和上一个相比此方法多一个布尔值条件,用于条件的拼接,true 表示拼接此条件,false 表示不拼接此条件。 图解,看 eq 方法讲解即可。
10.22, orderByDesc() 方法。
orderByDesc( String... columns )
List<User> userList = userMapper.selectList(Wrappers.<User>lambdaQuery()
/**
* 降序排列 根据字段的顺序优先级
* columns: 字段名
* */
.orderByDesc(User::getId,User::getAge,User::getCard)
);
SQL 语句如下:
==> Preparing: SELECT id,name,sex,age,address,card FROM user ORDER BY id ASC,age ASC,card ASC
==> Parameters:
<== Columns: id, name, sex, age, address, card
<== Row: 30, 李1四, 男, 11, 上海, 410482
<== Row: 29, 李四, 女, 33, 整修后是, null
<== Total: 2
orderByDesc(boolean condition,String... columns)
和上一个相比此方法多一个布尔值条件,用于条件的拼接,true 表示拼接此条件,false 表示不拼接此条件。 图解,看 eq 方法讲解即可。
10.23, orderBy() 方法。
orderBy( boolean condition,boolean isAsc,Object... columns )
List<User> userList = userMapper.selectList(Wrappers.<User>lambdaQuery()
/**
* 参数一: 必须为 true 不然不用使用这个方法
* 参数二: true 表示按照 asc 排序 false 表示按照 desc排序
* 参数三: 排序的字段
* */
.orderBy(true,true,User::getId,User::getAge)
);
SQL 语句如下:
==> Preparing: SELECT id,name,sex,age,address,card FROM user ORDER BY id ASC,age ASC
==> Parameters:
<== Columns: id, name, sex, age, address, card
<== Row: 28, 李1四, 男, 11, 上海, 410482
<== Total: 1
10.24, having() 方法。
having( String sqlHaving,Object... params )
List<User> userList = userMapper.selectList(Wrappers.<User>lambdaQuery()
/**
* 分组函数 多和 having 一同使用 having 第一个参数为 sql 语句 可以用 {0}{1}指定占位符,
* 在后续参数中设置值
*/
.groupBy(User::getAge,User::getSex)
.having("age > {0} and sex ={1}",50,"女")
);
SQL 语句如下:
==> Preparing: SELECT id,name,sex,age,address,card FROM user GROUP BY age,sex HAVING age > ? and sex =?
==> Parameters: 50(Integer), 女(String)
<== Total: 0
having(boolean condition,String sqlHaving,Object... params)
和上一个相比此方法多一个布尔值条件,用于条件的拼接,true 表示拼接此条件,false 表示不拼接此条件。 图解,看 eq 方法讲解即可。
10.25, or() 方法。
helpGuanWang
10.26, last() 方法。
last( String lastSql )
List<User> userList = userMapper.selectList(Wrappers.<User>lambdaQuery()
/**
* 只能调用一次,多次调用以最后一次为准 有sql注入的风险,请谨慎使用
* limit 从下标 0 开始 取 一条值
* */
.last("limit 0,2")
);
SQL 语句如下:
==> Preparing: SELECT id,name,sex,age,address,card FROM user limit 0,2
==> Parameters:
<== Columns: id, name, sex, age, address, card
<== Row: 28, 李1四, 男, 11, 上海, 410482
<== Row: 29, 李四, 女, 33, 整修后是, null
<== Total: 2
last(boolean condition,String lastSql)
和上一个相比此方法多一个布尔值条件,用于条件的拼接,true 表示拼接此条件,false 表示不拼接此条件。 图解,看 eq 方法讲解即可。