baomidou mybatisplus日常操作语法
下面 baomidou mybatisplus 简称 mybatisplus
比如查询的语法非常简单,如下:
QueryWrapper<User> qw = new QueryWrapper<>();
qw.eq("sex", 1);
int count = userMapper.selectCount(qw);
声明一个QueryWrapper对象,然后设置查询参数,eq()即等于,key是列名,value是值。接着调用mybatisplus封装的增删改查接口,就能执行我们想要的SQL操作。
如上面这段代码,自动拼装后的SQL语句如下:
SELECT COUNT( 1 ) FROM user WHERE deleted=0 AND (sex = ?)
Tips: mybatisplus逻辑删除
细心的小朋友注意到SQL语句里多了“deleted=0”,这是修改baomidou mybatisplus的配置后,mybatisplus在拼接SQL语句时自动添加的逻辑删除。
YAML配置如下:
mybatis-plus:
global-config:
db-config:
logic-delete-field: deleted # 全局逻辑删除的列名(since 3.3.0)
logic-delete-value: 1 # 逻辑已删除值(默认为 1)
logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
实体类配置如下:
/**
* 是否删除: 0 未删除, 1已删除
*/
@TableLogic
private Integer deleted;
掉坑场景
查询user表sex=1的行数,接着查询user表sex=2的行数。
QueryWrapper<User> qw = new QueryWrapper<>();
qw.eq("sex", 1);
int count = userMapper.selectCount(qw);
qw.eq("sex", 2);
count = userMapper.selectCount(qw);
mybatisplus这种设参操作是不是很方便,类似日常Map集合的操作。如果你也这么认为,那就离掉坑里不远了。
以上代码拼装后执行的的SQL语句如下:
==> Preparing: SELECT COUNT( 1 ) FROM user WHERE deleted=0 AND (sex = ?)
==> Parameters: 1(Integer)
==> Preparing: SELECT COUNT( 1 ) FROM user WHERE deleted=0 AND (sex = ? AND sex = ?)
==> Parameters: 1(Integer), 2(Integer)
坑来了,第二条SQL语句是“WHERE deleted=0 AND (sex = 1 AND sex = 2) ”,怎么会是这样呢?
Map集合设值时,如果key相同默认会覆盖value呀!
Map<String, Object> param = new HashMap<>();
param.put("sex", 1);
log.info("{}", param); //打印{sex=1}
param.put("sex", 2);
log.info("{}", param); //打印{sex=2}
但QueryWrapper不是Map呀,只是操作语法像Map,哈哈!
解决办法
方法一:
QueryWrapper<Worker> qw = new QueryWrapper<>();
qw.eq("sex", 1);
int count = workerMapper.selectCount(qw);
qw.clear();
qw.eq("sex", 2);
count = workerMapper.selectCount(qw);
使用同一个QueryWrapper对象,使用完后通过qw.clear()清空参数,再重新设值使用。
方法二:
QueryWrapper<Worker> qw = new QueryWrapper<>();
qw.eq("sex", 1);
int count = workerMapper.selectCount(qw);
qw = new QueryWrapper<>();
qw.eq("sex", 2);
count = workerMapper.selectCount(qw);
声明两个QueryWrapper对象去封装参数。