Mybatis plus 条件构造器

条件构造器 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&lt;#{%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

  1. 使用注解方法
@Select("select * from user ${ew.customSqlSegment}")
    List<User> selectAll(@Param(Constants.WRAPPER)Wrapper<User> wrapper);
  1. 使用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);
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容