条件构造器 condition 作用
我们看源码lt接口
default Children lt(R column, Object val) {
return lt(true, column, val);
}
Children lt(boolean condition, R column, Object val);
这个condition代表是否加入sql语句中。假设我们有这样的需求,如果'age'字段存在,则必须小于120。我们可以写成下面方式
lt(StringUtils.isNotEmpty(age), 'age', age)
创建条件构造器时传入实体对象
User user = new User();
user.setAge(33);
user.setUserId(1);
QueryWrapper<User> queryWrapper = new QueryWrapper<>(user);
设置的条件加入到Where语句中WHERE user_id=? AND age=?
。默认是等值的。如果我们需要对默认行为进行更改。
@TableField(condition = "%s<#{%s}")
private int age;
allEq
对于等值查询的更加细粒度的控制。
allEq(Map<R, V> params)
allEq(Map<R, V> params, boolean null2IsNull)
allEq(boolean condition, Map<R, V> params, boolean null2IsNull)
- 简单使用
Map<String, Object> map = new HashMap<>();
map.put("name", "ceshi");
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.allEq(map);
- age 字段返回的是null
map.put("age", null);
这时候SQL语句为WHERE name = ? AND age IS NULL
这时候allEq 的第二个参数null2IsNull
,代表值为null时候是否忽略(默认为true)。如果传递false则默认忽略null情况
- 传递lambda更加细粒度控制
只保留name
字段条件 'user WHERE name = ?'
queryWrapper.allEq((k,v) -> k.equals("name"), map);
selectMaps
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.select("user_id", "name");
List<User> users = userMapper.selectList(queryWrapper);
users.forEach(System.out::println);
上面返回有大量的null的值
User(userId=1, realName=null, age=0, createTime=null)
我们使用selectMaps
List<Map<String, Object>> users = userMapper.selectMaps(queryWrapper);
看到返回结果只有需要的字段{name=chenshi, userId=1}
selectCount
Integer count = userMapper.selectCount(queryWrapper);
SQL 语句
SELECT COUNT( 1 ) FROM user
selectOne
用于只返回一条语句的值
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("age",33).eq("name","chenshi");
User users = userMapper.selectOne(queryWrapper);
如果返回多条值,则会报错。
lambda条件构造器
LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(User::getAge, 30);
相比之前的条件构造器的形式,lambda条件构造器的好处可以在编译的时候进行检查
使用条件构造器的自定义SQL
- 使用注解方法
@Select("select * from user ${ew.customSqlSegment}")
List<User> selectAll(@Param(Constants.WRAPPER)Wrapper<User> wrapper);
- 使用XML方式
- 配置MP扫描路径
mybatis-plus:
mapper-locations: com/naruto/mamba/mapper/*
- 定义XML文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.naruto.mamba.dao.UserMapper">
<select id="selectAll" resultType="com.naruto.mamba.entity.User">
select * from user ${ew.customSqlSegment}
</select>
</mapper>
- Mapper中关联自定义SQL
public interface UserMapper extends BaseMapper<User> {
List<User> selectAll(@Param(Constants.WRAPPER)Wrapper<User> wrapper);
}