條件構(gòu)造器 condition 作用
我們看源碼lt接口
default Children lt(R column, Object val) {
return lt(true, column, val);
}
Children lt(boolean condition, R column, Object val);
這個(gè)condition代表是否加入sql語句中横堡。假設(shè)我們有這樣的需求命贴,如果'age'字段存在,則必須小于120食听。我們可以寫成下面方式
lt(StringUtils.isNotEmpty(age), 'age', age)
創(chuàng)建條件構(gòu)造器時(shí)傳入實(shí)體對象
User user = new User();
user.setAge(33);
user.setUserId(1);
QueryWrapper<User> queryWrapper = new QueryWrapper<>(user);
設(shè)置的條件加入到Where語句中WHERE user_id=? AND age=?
樱报。默認(rèn)是等值的泞当。如果我們需要對默認(rèn)行為進(jìn)行更改。
@TableField(condition = "%s<#{%s}")
private int age;
allEq
對于等值查詢的更加細(xì)粒度的控制笤受。
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);
這時(shí)候SQL語句為WHERE name = ? AND age IS NULL
這時(shí)候allEq 的第二個(gè)參數(shù)null2IsNull
,代表值為null時(shí)候是否忽略(默認(rèn)為true)箩兽。如果傳遞false則默認(rèn)忽略null情況
- 傳遞lambda更加細(xì)粒度控制
只保留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);
看到返回結(jié)果只有需要的字段{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);
如果返回多條值,則會(huì)報(bào)錯(cuò)汗贫。
lambda條件構(gòu)造器
LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(User::getAge, 30);
相比之前的條件構(gòu)造器的形式,lambda條件構(gòu)造器的好處可以在編譯的時(shí)候進(jìn)行檢查
使用條件構(gòu)造器的自定義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中關(guān)聯(lián)自定義SQL
public interface UserMapper extends BaseMapper<User> {
List<User> selectAll(@Param(Constants.WRAPPER)Wrapper<User> wrapper);
}