暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Mybatis-Plus中Wrapper的用法教程(三)

程序员恰恰 2023-04-08
3073



一、条件构造器关系介绍

二、wapper介绍

三、函数与对应的sql语句

四、测试案例


一、条件构造器关系介绍

箭头为父子类关系,箭头由子类指向父类, 绿色框为抽象类abstract,蓝色框为正常class类,可new()对象
二、wapper介绍 
Wrapper :条件构造抽象类,最顶端父类
AbstractWrapper :用于查询条件封装,生成 sql 的 where 条件
QueryWrapper :Entity 对象封装操作类,不是用lambda语法
UpdateWrapper :Update 条件封装,用于Entity对象更新操作
AbstractLambdaWrapper :Lambda 语法使用 Wrapper统一处理解析 lambda 获取 column。
LambdaQueryWrapper :看名称也能明白就是用于Lambda语法使用的查询Wrapper
 LambdaUpdateWrapper :Lambda 更新封装Wrapper
三、函数与对应的sql语句
四、测试案例
4.1 、建表语句如下
CREATE TABLE `tb_student` (
  `id` int unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
  `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '姓名',
  `age` int DEFAULT NULL COMMENT 'age',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  `del_flag` tinyint(1) DEFAULT NULL COMMENT '0:存在,1:删除',
  `manager_id` int DEFAULT NULL COMMENT '上级领导id',
  `email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT 'email',
  `sex` int DEFAULT NULL COMMENT '1:男,2:女:3未知',
  PRIMARY KEY (`id`)
) ENGINE
=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
4.2、插入几条测试数据
INSERT INTO `tb_student` (`id`, `name`, `age`, `create_time`, `update_time`, `del_flag`, `manager_id`, `email`, `sex`)
VALUES
 (1'孙悟空'99'2023-04-07 01:57:28''2023-04-07 02:01:25'04'sunwukong@qq.com'1),
 (2'猪八戒'40'2023-04-07 01:57:28', NULL, 04'zhubajie@qq.com'1),
 (3'孙悟空'99'2023-04-07 01:57:28', NULL, 04'sunwukong@qq.com'1),
 (4'唐僧'99'2023-04-07 01:57:28''2023-04-07 02:01:25'00'tangseng@qq.com'2),
 (5'白龙马'40'2023-04-07 01:57:28', NULL, 04'bailongma@qq.com'1),
 (6'猪悟能'40'2023-04-07 01:57:28', NULL, 04'zhuwuneng@qq.com'1);
4.3、Mybatis-plus代码 
4.4、实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class TbStudent implements Serializable {
    private static final long serialVersionUID = 1L;
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    private String name;
    private Integer age;
    private Date createTime;
    private Date updateTime;
    private int delFlag;
    private Integer managerId;
    private String email;
    private Integer sex;
4.5、测试代码:
@Resource
private TbStudentMapper tbStudentMapper;

/**
* 1.通过单个ID主键进行查询
*/
@Test
public void selectById() {
    TbStudent tbStudent = tbStudentMapper.selectById(1);
    System.out.println(tbStudent);
}
/**
* 2. 通过多个ID主键查询
* WHERE id IN ( 1, 2 )
*/
@Test
public void selectByList() {
    List<Long> longs = Arrays.asList(1L2L);
    List<TbStudent> students = tbStudentMapper.selectBatchIds(longs);
    students.forEach(System.out::println);
}
/**
* 3. 通过Map参数进行查询
* WHERE name = '唐僧'
*/
@Test
public void selectByMap() {
    Map<String, Object> params = new HashMap<>();
    params.put("name""唐僧");
    List<TbStudent> students = tbStudentMapper.selectByMap(params);
    students.forEach(System.out::println);
}
/**
* Wrapper条件构造器使用
*/

/**
* 4.名字包含悟空并且年龄小于40
* WHERE (name LIKE %悟空% AND age < 40)
*/
@Test
public void selectByWrapperOne() {
    QueryWrapper<TbStudent> wrapper = new QueryWrapper();
    wrapper.like("name""悟空").lt("age"40);
    List<TbStudent> students = tbStudentMapper.selectList(wrapper);
    students.forEach(System.out::println);
}
/**
* 5.名字包含悟空年龄大于20小于40邮箱不能为空
* WHERE name LIKE '%雨%' AND age BETWEEN 20 AND 40 AND email IS NOT NULL
*/
@Test
public void selectByWrapperTwo() {
    QueryWrapper<TbStudent> wrapper = Wrappers.query();
    wrapper.like("name""悟空").between("age"2040).isNotNull("email");
    List<TbStudent> students = tbStudentMapper.selectList(wrapper);
    students.forEach(System.out::println);
}
/**
* 6.名字为猪姓或者年龄大于等于25,按照年龄降序排序,年龄相同按照id升序排序
* <p>
* WHERE name LIKE '猪%' or age >= 25 ORDER BY age DESC , id ASC
*/
@Test
public void selectByWrapperThree() {
    QueryWrapper<TbStudent> wrapper = Wrappers.query();
    wrapper.likeRight("name""猪").or()
            .ge("age"25).orderByDesc("age").orderByAsc("id");
    List<TbStudent> students = tbStudentMapper.selectList(wrapper);
    students.forEach(System.out::println);
}
/**
* 7. 查询创建时间为2019年2月14 并且上级领导姓唐
* WHERE date_format(create_time,'%Y-%m-%d') = '2019-02-14' AND manager_id IN (select id from user where name like '王%')
*/
@Test
public void selectByWrapperFour() {
    QueryWrapper<TbStudent> wrapper = Wrappers.query();
    wrapper.apply("date_format(create_time,'%Y-%m-%d') = {0}""2019-02-14")
            .inSql("manager_id""select id from tb_student where name like '唐%'");
    List<TbStudent> students = tbStudentMapper.selectList(wrapper);
    students.forEach(System.out::println);
}
/**
* 8.查询猪姓,并且年龄小于40或者邮箱不为空
* WHERE name LIKE '猪%' AND ( age < 40 OR email IS NOT NULL )
*/
@Test
public void selectByWrapperFive() {
    QueryWrapper<TbStudent> wrapper = Wrappers.query();
    wrapper.likeRight("name""猪").and(qw -> qw.lt("age"40).or().isNotNull("email"));
    List<TbStudent> students = tbStudentMapper.selectList(wrapper);
    students.forEach(System.out::println);
}
/**
* 9.查询猪姓,或者 年龄大于20 、年龄小于40、邮箱不能为空
* WHERE name LIKE ? OR ( age BETWEEN ? AND ? AND email IS NOT NULL )
*/
@Test
public void selectByWrapperSix() {
    QueryWrapper<TbStudent> wrapper = Wrappers.query();
    wrapper.likeRight("name""猪").or(
            qw -> qw.between("age"2040).isNotNull("email")
    );
    List<TbStudent> students = tbStudentMapper.selectList(wrapper);
    students.forEach(System.out::println);
}
/**
* 10.(年龄小于40或者邮箱不为空) 并且名字姓猪
* WHERE ( age < 40 OR email IS NOT NULL ) AND name LIKE '王%'
*/
@Test
public void selectByWrapperSeven() {
    QueryWrapper<TbStudent> wrapper = Wrappers.query();
    wrapper.nested(qw -> qw.lt("age"40).or().isNotNull("email"))
            .likeRight("name""猪");
    List<TbStudent> students = tbStudentMapper.selectList(wrapper);
    students.forEach(System.out::println);
}

/**
* 11.查询年龄为23, 42, 54
* WHERE age IN (?,?,?)
*/
@Test
public void selectByWrapperEight() {
    QueryWrapper<TbStudent> wrapper = Wrappers.query();
    wrapper.in("age", Arrays.asList(234254));
    List<TbStudent> students = tbStudentMapper.selectList(wrapper);
    students.forEach(System.out::println);
}
/**
* 12.查询一条数据
* limit 1
*/
@Test
public void selectByWrapperNine() {
    QueryWrapper<TbStudent> wrapper = Wrappers.query();
    wrapper.in("age", Arrays.asList(234254)).last("limit 1");
    List<TbStudent> students = tbStudentMapper.selectList(wrapper);
    students.forEach(System.out::println);
}
/**
* 13.根据条件删除数据
* DELETE FROM tb_student WHERE (name IS NULL AND age >= ? AND email IS NOT NULL)
*/
@Test
public void testDelete() {
    QueryWrapper<TbStudent> queryWrapper = new QueryWrapper<>();
    queryWrapper
            .isNull("name")
            .ge("age"12)
            .isNotNull("email");
    int result = tbStudentMapper.delete(queryWrapper);
    System.out.println("delete return count = " + result);
}
/**
* 14.eq的用法
* tb_student WHERE (name = ?)
*
* @return
*/

@Test
public void testSelectOne() {
    QueryWrapper<TbStudent> queryWrapper = new QueryWrapper<>();
    queryWrapper.eq("name""孙悟空");
    TbStudent students = tbStudentMapper.selectOne(queryWrapper);
    System.out.println(students);
}
/**
* 14.between、notBetween用法
* between、notBetween
* WHERE (age BETWEEN ? AND ?)
* 包含大小边界
*/
@Test
public void testSelectCount() {
    QueryWrapper<TbStudent> queryWrapper = new QueryWrapper<>();
    queryWrapper.between("age"1050);
    Integer count = tbStudentMapper.selectCount(queryWrapper);
    System.out.println(count);
}
/**
* 15.allEq的用法
* WHERE (name = ? AND id = ? AND age = ?)
*/
@Test
public void testSelectList() {

    QueryWrapper<TbStudent> queryWrapper = new QueryWrapper<>();
    Map<String, Object> map = new HashMap<>();
    map.put("id"4);
    map.put("name""唐僧");
    map.put("age"12);
    queryWrapper.allEq(map);
    List<TbStudent> students = tbStudentMapper.selectList(queryWrapper);
    students.forEach(System.out::println);
}
/**
* 16.like、notLike、likeLeft、likeRight的用法
* WHERE (name NOT LIKE %唐% AND email LIKE tang%)
*/
@Test
public void testSelectMaps() {
    QueryWrapper<TbStudent> queryWrapper = new QueryWrapper<>();
    queryWrapper
            .notLike("name""唐")
            .likeRight("email""tang");
    //返回值是Map列表
    List<Map<String, Object>> maps = tbStudentMapper.selectMaps(queryWrapper);
    maps.forEach(System.out::println);
}
/**
* 17.in、notIn 的用法
* WHERE (id NOT IN (1,2,3))
*/
@Test
public void testIn() {
    QueryWrapper<TbStudent> queryWrapper = new QueryWrapper<>();
    queryWrapper.notIn("id"123);
    //返回值是Map列表
    List<Map<String, Object>> maps = tbStudentMapper.selectMaps(queryWrapper);
    maps.forEach(System.out::println);
}
/**
* 18. inSql、notinSql:实现子查询
* <p>
* WHERE (id IN (select id from tb_student where id < 3))
*/
@Test
public void testSelectObjs() {
    QueryWrapper<TbStudent> queryWrapper = new QueryWrapper<>();
    queryWrapper.inSql("id""select id from tb_student where id < 3");
    //返回值是Object列表
    List<Object> objects = tbStudentMapper.selectObjs(queryWrapper);
    objects.forEach(System.out::println);
}
/** * 19 or、and 用法
* 注意:这里使用的是 UpdateWrapper 不调用or则默认为使用 and 连
* UPDATE tb_student SET age=40, create_time='2023-04-07' WHERE (name LIKE %唐% OR age BETWEEN 20 AND 88)
*/
@Test
public void testUpdate1() {
    //修改值
    TbStudent student = new TbStudent();
    student.setAge(40);
    student.setCreateTime(new Date());
    //修改条件
    UpdateWrapper<TbStudent> studentUpdateWrapper = new UpdateWrapper<>();
    studentUpdateWrapper
            .like("name""唐")
            .or()
            .between("age"2088);
    int result = tbStudentMapper.update(student, studentUpdateWrapper);
    System.out.println(result);
}
/**
* 20、嵌套or、嵌套and
* 这里使用了lambda表达式,or中的表达式最后翻译成sql时会被加上圆括号
* UPDATE tb_student SET age=?, update_time=? WHERE (name LIKE ? OR (name = ? AND age <> ?))
*/
@Test
public void testUpdate2() {

    //修改值
    TbStudent student = new TbStudent();
    student.setAge(99);
    student.setUpdateTime(new Date());
    //修改条件
    UpdateWrapper<TbStudent> studentUpdateWrapper = new UpdateWrapper<>();
    studentUpdateWrapper
            .like("name""唐")
            .or(i -> i.eq("name""孙悟空").ne("age"20));
    int result = tbStudentMapper.update(student, studentUpdateWrapper);
    System.out.println(result);
}
/**
* 21 orderBy、orderByDesc、orderByAsc
* FROM tb_student ORDER BY id DESC
*/

@Test
public void testSelectListOrderBy() {
    QueryWrapper<TbStudent> queryWrapper = new QueryWrapper<>();
    //queryWrapper.orderByDesc("id");
    //queryWrapper.orderByAsc("id");

    //ORDER BY age ASC
    queryWrapper.orderBy(truetrue"age");
    List<TbStudent> users = tbStudentMapper.selectList(queryWrapper);
    users.forEach(System.out::println);
}
/**
* 22.last用法
* 代表直接拼接到 sql 的最后
* 注意:只能调用一次,多次调用以最后一次为准 有sql注入的风险,请谨慎使用
* FROM tb_student limit 1
*/
@Test
public void testSelectListLast() {
    QueryWrapper<TbStudent> queryWrapper = new QueryWrapper<>();
    queryWrapper.last("limit 1");
    List<TbStudent> students = tbStudentMapper.selectList(queryWrapper);
    students.forEach(System.out::println);
}
/**
* 23.指定要查询的列
* SELECT id,name,age FROM tb_student
*/
@Test
public void testSelectListColumn() {
    QueryWrapper<TbStudent> queryWrapper = new QueryWrapper<>();
    queryWrapper.select("id""name""age");
    List<TbStudent> users = tbStudentMapper.selectList(queryWrapper);
    users.forEach(System.out::println);
}
/**
* 24、set、setSql的用法
* 最终的sql会合并 user.setAge(),以及 userUpdateWrapper.set() 和 setSql() 中 的字段
* UPDATE tb_student SET age=99 name='孙悟空', email = 'sunwukong@qq.com' WHERE (name LIKE %沙和尚%()
*/
@Test
public void testUpdateSet() {
    //修改值
    TbStudent student = new TbStudent();
    student.setAge(99);
    //修改条件
    UpdateWrapper<TbStudent> studentUpdateWrapper = new UpdateWrapper<>();
    studentUpdateWrapper
            .like("name""沙和尚")
            //除了可以查询还可以使用set设置修改的字段
            .set("name""孙悟空")
            //可以有子查询
            .setSql(" email = 'sunwukong@qq.com'");
    int result = tbStudentMapper.update(student, studentUpdateWrapper);
    System.out.println(result);
}
/**
* 25. LambdaQueryWrapper使用方式
* FROM tb_student WHERE (age = ? AND name = ?)
*/
@Test
public void lambdaQueryWrappertest1() {
    LambdaQueryWrapper<TbStudent> wrapper = new LambdaQueryWrapper<>();
    wrapper.eq(TbStudent::getAge, "88");
    wrapper.eq(TbStudent::getName, "唐三藏");
    List<TbStudent> students = tbStudentMapper.selectList(wrapper);
    students.forEach(System.out::println);
}
/**
* 26.ge le ge,between等比较方法
* WHERE (age BETWEEN ? AND ?)
*/
@Test
public void lambdaQueryWrappertest2() {
    LambdaQueryWrapper<TbStudent> wrapper = new LambdaQueryWrapper<>();
    wrapper.between(TbStudent::getAge, 2388);
    List<TbStudent> students = tbStudentMapper.selectList(wrapper);
    students.forEach(System.out::println);
}

点赞+在看,谢谢大家支持!

文章转载自程序员恰恰,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论