0.前置知识
不管是查询还是更新,我们需要构造查询条件的时候,都是使用wrapper来完成,如果是构造查询条件就是QueryWrapper
,更新则是UpdateWrapper
0.1 QueryWrapper
例如我们查询所有用户名为aaa的用户,应该这样构建查询条件
// 泛型填写你的实体类
QueryWrapper<SysUser> wrapper=new QueryWrapper<>();
// eq代表“equal”,即构建相等条件,第一个参数是数据库表的列名,第二个是查询的值
wrapper.eq("user_name","aaa");
//调用list() 查询所有符合条件的数据并返回List
List<SysUser> users = list(wrapper);
除了eq
以外,还有 in
表示某个列的值必须在某个范围里面,如查询id
为1、2、3、4、5
中的用户
List<Integer> ids= Lists.list(1, 2, 3, 4, 5);
QueryWrapper<SysUser> wrapper=new QueryWrapper<>();
wrapper.in("id",ids);
List<SysUser> users = list(wrapper);
除了这些以外,还有一些
0.2 UpdateWrapper
UpdateWrapper
与QueryWrapper
是基本上一致的,多了一个set
方法
例如更新所有用户名为aaa的密码为123456
// 泛型填写你的实体类
UpdateWrapper<SysUser> wrapper=new UpdateWrapper<>();
// eq代表“equal”,即构建相等条件,第一个参数是数据库表的列名,第二个是查询的值
//set方法第一个参数为你想更新的列,第二个是更新的值
wrapper.eq("user_name","aaa")
.set("password","123456");
//调用update方法,传入更新条件,返回值表示是否更新成功
boolean update = update(wrapper);
0.3 进阶(推荐,重要)
- 前面我们写的wrapper都必须要手动写数据库表的列名,非常繁琐,而且一不小心还可能写错,并且如果数据库表发生变化可能需要修改所有用到这个列名的地方,并且无法通过IDE的引用跳转。
- 所以这里引入
lambdaQuery
,使用方法引用
来代替手写的列名
还是以第一个例子来演示:
例如我们查询所有用户名为aaa的用户,应该这样构建查询条件
// 泛型填写你的实体类
List<SysUser> users = list(Wrappers.<SysUser>lambdaQuery()
.eq(SysUser::getUserName,"aaa"));
使用lambdaQuery
Wrappers.<SysUser>lambdaQuery().eq(SysUser::getUserName,"aaa")
其中SysUser::getUserName
就是方法引用,使用实体类的get方法代替我们写的列名user_name
1.查询
1.1 通过主键id查询
直接调用getById()
即可
SysUser user = getById(1);
1.2 根据条件查询单条数据
调用getByOne()
即可,参数是一个wrapper,但是注意,如果查出来的条数大于1条将会报错抛异常!
SysUser user = getOne(Wrappers.<SysUser>lambdaQuery()
.eq(SysUser::getUserName,"aaa"));
1.3 获取表中所有的数据
相当于 select * from
直接调用list(),不传参
1.4 获取表指定条件的所有数据
将wrapper作为参数传入list()中即可
List<Integer> ids= Lists.list(1, 2, 3, 4, 5);
List<SysUser> users = list(Wrappers.<SysUser>lambdaQuery()
.in(SysUser::getId,ids));
2.更新
更新操作实际上与查询操作差不多,都是构建语句
其中updateBatch则是批量更新
构建lambda的时候,应该是Wrappers.<SysUser>lambdaUpdate()
3.插入
插入是调用save
方法,直接传入对象即可完成插入
带有batch的则是批量插入,saveOrUpdate
则是插入或更新,它是通过主键判断,在实体类的主键字段上加上@TableId
则表示是主键字段
4.删除
删除调用remove
方法,传入一个wrapper表示删除条件即可