wapper条件构造器
1 什么是条件构造器Wrapper
条件构造器Wrapper按照官方的给出的解释是用于生成 sql 的where 条件,但在使用的过程中,发现Wrapper不仅仅是用于拼接where条件,可以用于拼接set 语法,select语法。所以,wrapper准确的来说,更像mybatis中的<sql></sql>
动态标签在sql任意位置完成sql片段组装。
2 wapper类体系结构
2.1 wapper类图结构
2.2 wapper各个类的介绍
- Wapper:条件构造抽象类,最顶端父类
- AbstractWrapper :用于查询条件封装,生成 sql的 where 条件
- QueryWrapper: 查询条件封装
- UpdateWrapper : Update 条件封装
- AbstractLambdaWrapper : Lambda 语法使用 Wrapper统一处理解析lambda 获取 column.
- LambdaQueryWrapper: 通过lambda语法进行查询条件封装
- LambdaUpdateWrapper :通过lambda语法进行Update 条件封装
- AbstractWrapper :用于查询条件封装,生成 sql的 where 条件
3.项目实例
- 实体类
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
@Data
public class Employee {
@TableId(type = IdType.AUTO)
private Long id;
private String name;
private String password;
private String email;
private int age;
}
3.1 更新Wrapper
需求:将id=1的员工name修改为zhangsanfeng
3.1.1 UpdateWrapper
- setsql方式
//需求:将id=1的员工name修改为zhangsanfeng
//UPDATE employee SET name='zhangsanfeng’ WHERE (id = ?)
@Test
public void testUpdate01(){
UpdateWrapper<Employee> wrapper = new UpdateWrapper<>();
wrapper.eq("id",1);
wrapper.setSql("name='zhangsanfeng'");
//将语句提交到数据库
employeeMapper.update(null,wrapper);
}
- set方式
//需求:将id=1的员工name修改为zhangsanfeng
//UPDATE employee SET name=? WHERE (id = ?)
@Test
public void testUpdate02(){
UpdateWrapper<Employee> wrapper = new UpdateWrapper<>();
wrapper.eq("id",1);
wrapper.set("name='zhangsanfeng'");
//将语句提交到数据库
employeeMapper.update(null,wrapper);
}
- setsql与set的区别
setsql : 是将sql片段直接拼接到sql语句中
set :通过占位符拼接SQL语句
3.1.2 LambdaUpdateWrapper
//需求:将id=1的员工name修改为zhangsanfeng
//UPDATE employee SET name=? WHERE (id = ?)
@Test
public void testUpdate03(){
LambdaUpdateWrapper<Employee> wrapper = new LambdaUpdateWrapper<>();
wrapper.eq(Employee::getId,1);
wrapper.set(Employee::getName,"zhangsanfeng");
//将语句提交到数据库
employeeMapper.update(null,wrapper);
}
- LambdaUpdateWrapper的好处
通过lambda解析对象获得值这样可以防止参数出错
3.2 查询Wrapper
需求:查询name=zhangsan , age=18 的员工信息只需查id,name 2列
3.2.1 QueryWrapper
//需求:查询name=zhangsan , age=18 的员工信息只需查id,name 2列
//SELECT id,name FROM employee WHERE (name = ? AND age = ?)
@Test
public void testUpdate04(){
QueryWrapper<Employee> wrapper = new QueryWrapper<>();
wrapper.select("id","name");
wrapper.eq("name","zhangsan");
wrapper.eq("age",18);
//将语句提交到数据库处理
employeeMapper.selectList(wrapper);
}
3.2.2 LambdaQueryWrapper
//需求:查询name=zhangsan , age=18 的员工信息只需查id,name 2列
//SELECT id,name FROM employee WHERE (name = ? AND age = ?)
@Test
public void testUpdate05(){
LambdaQueryWrapper<Employee> wrapper = new LambdaQueryWrapper<>();
wrapper.select(Employee::getId, Employee::getName);
wrapper.eq(Employee::getName,"zhangsan");
wrapper.eq(Employee::getAge,18);
employeeMapper.selectList(wrapper);
}
拓展
updatewrapper和queryWrapper可以相互替换吗?
- 可以相互替换,只不过一般推荐使用queryWrapper
//需求:将id=1的员工name修改为zhangsanfeng
//UPDATE employee SET name='zhangsanfeng’ WHERE (id = ?)
@Test
public void testUpdate01(){
//UpdateWrapper与QueryWrapper这两种的到的数据是一样的
//UpdateWrapper<Employee> wrapper = new UpdateWrapper<>();
QueryWrapper<Employee> wrapper = new QueryWrapper<>();
wrapper.eq("id",1);
wrapper.setSql("name='zhangsanfeng'");
//将语句提交到数据库
employeeMapper.update(null,wrapper);
}
- 对于这种替换,可以将UpdateWrapper和QueryWrapper理解为动态where,eq则为where后面的条件语句。