• MyBatis-Plus学习笔记


    1.MyBatis-Plus简介:

            MyBatis-Plus是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。MyBatis-Plus提供了通用的mapper和service,可以在不编写任何SQL语句的情况下,快速的实现对单表的CRUD批量、逻辑删除、分页等操作。

    2.BaseMapper提供的CRUD功能

      2.1 添加功能:

    1. @Test
    2. public void insert(){
    3. User user = new User();
    4. user.setName("users");
    5. user.setAge(43);
    6. user.setEmail("users@xja.com");
    7. int result = this.userMapper.insert(user);
    8. }

      2.2 删除功能:

        2.2.1 deleteById:

    1. @Test
    2. public void deleteById(){
    3. int result = this.userMapper.deleteById(1696801209841856514L);
    4. }

        2.2.2 deleteByMap:

    1. @Test
    2. public void deleteByMap(){
    3. Map map = new HashMap<>();
    4. map.put("name","admin");
    5. map.put("age",40);
    6. int result = this.userMapper.deleteByMap(map);
    7. }

        2.2.3 deleteBatchIds(批量删除):

    1. @Test
    2. public void deleteBatchIds(){
    3. List ids = Arrays.asList(1L, 2L, 3L);
    4. int result = this.userMapper.deleteBatchIds(ids);
    5. }

         2.2.4 delete(根据条件删除):

    1. @Test
    2. public void delete() {
    3. User user = new User();
    4. user.setName("zhangsan");
    5. user.setAge(40);
    6. QueryWrapper wrapper = new QueryWrapper<>(user);
    7. this.userMapper.delete(wrapper);
    8. }

    2.3 修改功能:

        2.3.1 updateById:

    1. @Test
    2. public void updateById(){
    3. User user = new User();
    4. user.setId(1L);
    5. user.setName("Tom");
    6. user.setAge(40);
    7. int result = this.userMapper.updateById(user);
    8. }

        2.3.2 update(根据条件修改):

    1. @Test
    2. public void update() {
    3. User user = new User();
    4. user.setAge(80); // 需要更新的字段
    5. QueryWrapper wrapper = new QueryWrapper<>();
    6. wrapper.eq("name", "Jack"); // 设置更新条件
    7. // 执行更新操作
    8. int result = this.userMapper.update(user, wrapper);
    9. }

      2.4 查询功能:

        2.4.1 selectById:

    1. @Test
    2. public void selectById() {
    3. User user = this.userMapper.selectById(1L);
    4. System.out.println(user);
    5. }

        2.4.2 selectBatchIds:

    1. @Test
    2. public void selectBatchIds() {
    3. List ids = Arrays.asList(1L, 2L, 3L, 4L, 5L);
    4. List users = this.userMapper.selectBatchIds(ids);
    5. users.forEach(System.out::println);
    6. }

        2.4.3 selectOne:

    1. @Test
    2. public void selectOne() {
    3. QueryWrapper wrapper = new QueryWrapper<>();
    4. wrapper.eq("name", "Tom");
    5. // 只能查询一条数据,如果超过一条则报错
    6. User user = this.userMapper.selectOne(wrapper);
    7. System.out.println(user);
    8. }

        2.4.4 selectAll:

    1. @Test
    2. public void selectAll(){
    3. //通过条件构造器查询一个list集合,若没有条件,则可以设置null 为参数
    4. List userList = this.userMapper.selectList(null);
    5. userList.forEach(System.out::println);
    6. }

        2.4.5 selectCount(根据wrapper查询中记录数):

    1. @Test
    2. public void selectCount() {
    3. QueryWrapper wrapper = new QueryWrapper<>();
    4. wrapper.gt("age", 23); //查询年龄大于23岁的成员信息
    5. Integer count = this.userMapper.selectCount(wrapper);
    6. System.out.printf("总记录数:%d", count);
    7. }

        2.4.6 selectList:

    1. @Test
    2. public void selectList() {
    3. QueryWrapper wrapper = new QueryWrapper<>();
    4. wrapper.lt("age", 50); // 年龄小于50岁
    5. List users = this.userMapper.selectList(wrapper);
    6. users.forEach(System.out::println);
    7. }

     3. IService(通用Service)提供的CRUD功能:

      3.1 添加功能:

        3.1.1 insertMore(批量添加):

    1. @Test
    2. public void insertMore(){
    3. List users = new ArrayList<>();
    4. for (int i = 0 ; i <= 5 ; i++ ){
    5. User user = new User();
    6. user.setAge(20);
    7. user.setName("刘备");
    8. users.add(user);
    9. }
    10. boolean b = this.iUserService.saveBatch(users);
    11. System.out.println("成功与否:" + b);
    12. }

      3.2 删除功能:

      3.3 修改功能:

      3.4 查询功能:

        3.4.1 getById:

    1. @Test
    2. public void getById(){
    3. User user = this.iUserService.getById(1L);
    4. System.out.println("user:" + user);
    5. }

        3.4.2 getCount:

    1. @Test
    2. public void getCount(){
    3. int count = this.iUserService.count();
    4. System.out.println("查询的总记录数为:" + count);
    5. }

     4. 常用注解:

      4.1 @TableName:

    作用:设置实体类所对应的表名,如@TableName("t_user")

      4.2 @TableId:

    作用:将属性所对应的字段指定为主键,value属性用于指定主键的字段,type属性设置主键生成策略

    描述
    IdType.ASSIGN_ID(默认)基于雪花算法的策略生成数据id,与数据库id是否设置自增无关
    IdType.AUTO使用数据库的自增策略,注意,该类型请确保数据库设置了id自增,否则无效

      4.3  @TableField:

    作用:指定属性所对应的字段名,如@TableField("user_name")

      4.4 @TableLogic:

    作用:在实体类中表示删除状态的字段上加该注解,会将MyBatis-Plus提供的删除方法自动转为更新该条记录为删除状态,查询方法会自动转为查询不为删除状态的记录;

    0为未删除状态,1为删除状态。

     5. Wapper(条件构造器)学习:

      5.1 Wapper介绍:

    Wrapper:条件构造抽象类,最顶端父类

            AbstractWrapper: 用于查询条件封装,生成 sql的 where 条件
                    QueryWrapper : 查询条件封装
                    UpdateWrapper: Update 条件封装
                    AbstractLambdaWrapper : 使用Lambda 语法
                            LambdaQueryWrapper : 用于Lambda语法便用的查询Wrapper
                            LambdaUpdateWrapper : Lambda 更新封装Wrapper

      5.2 QueryWrapper 学习:

    常用方法:

    eq:equals,等于

    gt:greater than ,大于 >

    ge:greater than or equals,大于等于≥

    lt:less than,小于<

    le:less than or equals,小于等于≤

    between:相当于SQL中的BETWEEN

    like:模糊匹配。like(“name”,“黄”),相当于SQL的name like ‘%黄%’

    likeRight:模糊匹配右半边。likeRight(“name”,“黄”),相当于SQL的name like ‘黄%’

    likeLeft:模糊匹配左半边。likeLeft(“name”,“黄”),相当于SQL的name like ‘%黄’

    notLike:notLike(“name”,“黄”),相当于SQL的name not like ‘%黄%’

    isNull

    isNotNull

    and:SQL连接符AND

    or:SQL连接符OR

    in: in(“age",{1,2,3})相当于 age in(1,2,3)

    groupBy: groupBy(“id”,“name”)相当于 group by id,name

    orderByAsc :orderByAsc(“id”,“name”)相当于 order by id ASC,name ASC

    orderByDesc :orderByDesc (“id”,“name”)相当于 order by id DESC,name DESC
     

        5.2.1 查询用户名包含a,年龄在20到30之间,邮箱信息不为nulL的用户信息:

    1. @Test
    2. public void queryWrapper01(){
    3. //查询用户名包含a,年龄在20到30之间,邮箱信息不为nulL的用户信息
    4. QueryWrapper queryWrapper = new QueryWrapper();
    5. queryWrapper.like("name","a")
    6. .between("age",21,80)
    7. .isNotNull("email");
    8. List userList = this.userMapper.selectList(queryWrapper);
    9. userList.forEach(System.out::println);
    10. }

        5.2.2 查询用户信息,按照年龄的降序排序,若年龄相同,则按照id升序排序:

    1. @Test
    2. public void queryWrapper02(){
    3. //查询用户信息,按照年龄的降序排序,若年龄相同,则按照id升序排序
    4. QueryWrapper queryWrapper = new QueryWrapper();
    5. queryWrapper.orderByDesc("age")
    6. .orderByAsc("id");
    7. List userList = this.userMapper.selectList(queryWrapper);
    8. userList.forEach(System.out::println);
    9. }

        5.2.3 删除邮箱地址为nulL的用户信息:

    1. @Test
    2. public void queryWrapper03(){
    3. //删除邮箱地址为nulL的用户信息
    4. QueryWrapper queryWrapper = new QueryWrapper();
    5. queryWrapper.isNull("email");
    6. int result = this.userMapper.delete(queryWrapper);
    7. System.out.println("==========================");
    8. System.out.println(result);
    9. System.out.println("==========================");
    10. }

        5.2.4 将(年龄大于20并且用户名中包含有a) 或邮箱为null的用户信息修改:

    1. @Test
    2. public void queryWrapper04(){
    3. //将(年龄大于20并且用户名中包含有a) 或邮箱为null的用户信息修改
    4. QueryWrapper queryWrapper = new QueryWrapper();
    5. queryWrapper.gt("age",20)
    6. .like("name","a")
    7. .or()
    8. .isNull("email");
    9. User user = new User();
    10. user.setAge(30);
    11. user.setName("xiaomi");
    12. user.setEmail("admin@xja.com");
    13. int result = this.userMapper.update(user,queryWrapper);
    14. System.out.println("==========================");
    15. System.out.println(result);
    16. System.out.println("==========================");
    17. }

        5.2.5 将用户名中包含有a并且 (年龄大于20或邮箱为null) 的用户信息修改:

    1. @Test
    2. public void queryWrapper05(){
    3. //将用户名中包含有a并且 (年龄大于20或邮箱为null) 的用户信息修改
    4. //Lambda中的条件优先执行
    5. QueryWrapper queryWrapper = new QueryWrapper();
    6. queryWrapper.like("name","a")
    7. .and(i->i.isNull("email").or().gt("age",20));
    8. User user = new User();
    9. user.setAge(25);
    10. user.setName("huawei");
    11. user.setEmail("huawei@xja.com");
    12. int result = this.userMapper.update(user,queryWrapper);
    13. System.out.println("==========================");
    14. System.out.println(result);
    15. System.out.println("==========================");
    16. }

        5.2.6 组装select语句的学习(选择只查询特定字段):

    1. @Test
    2. public void queryWapper06(){
    3. //查询用户的用户名、年龄、邮箱信息
    4. QueryWrapper queryWrapper = new QueryWrapper<>();
    5. queryWrapper.select("name","age","email");
    6. List> maps = this.userMapper.selectMaps(queryWrapper);
    7. maps.forEach(System.out::println);
    8. }

        5.2.6 组装子查询的学习:

    1. @Test
    2. public void queryWrapper(){
    3. //查询id小于等于100的用户信息
    4. //select * from user where id in(select id from user where id <= 4)
    5. QueryWrapper queryWrapper = new QueryWrapper<>();
    6. queryWrapper.inSql("id","select id from user where id <= 4");
    7. List userList = userMapper.selectList(queryWrapper);
    8. userList.forEach(System.out::println);
    9. }

         5.2.7 condition组装条件的学习:

    1. @Test
    2. public void queryWrapper08(){
    3. String name = "a";
    4. Integer ageBegin = null;
    5. Integer ageEnd = 30;
    6. QueryWrapper queryWrapper = new QueryWrapper<>();
    7. queryWrapper.like(StringUtils.isNotBlank(name),"name",name)
    8. .ge(ageBegin!=null,"age",ageBegin)
    9. .le(ageEnd!=null,"age",ageEnd);
    10. List userList = userMapper.selectList(queryWrapper);
    11. userList.forEach(System.out::println);
    12. }

      5.3 UpdateWrapper 学习(参照QueryWrapper):

    1. @Test
    2. public void updateWrapper(){
    3. //将用户名中包含有a并且 (年龄大于20或邮箱为null) 的用户信息修改
    4. UpdateWrapper updateWrapper = new UpdateWrapper<>();
    5. updateWrapper.like("name","a")
    6. .and(i->i.isNull("email").or().gt("age",20));
    7. updateWrapper.set("name","honor").set("email","honor@qq.com");
    8. int result = this.userMapper.update(null, updateWrapper);
    9. System.out.println(result);
    10. }

      5.4 LambdaQueryWrapper学习(对5.2.7的改进):

    1. @Test
    2. public void lambdaQueryWrapper08(){
    3. String name = "a";
    4. Integer ageBegin = null;
    5. Integer ageEnd = 30;
    6. LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>();
    7. lambdaQueryWrapper.like(StringUtils.isNotBlank(name),User::getName,name)
    8. .ge(ageBegin!=null,User::getAge,ageBegin)
    9. .le(ageEnd!=null,User::getAge,ageEnd);
    10. List userList = userMapper.selectList(lambdaQueryWrapper);
    11. userList.forEach(System.out::println);
    12. }

      5.5 LambdaUpdateWrapper学习(对5.3的改进):

    1. @Test
    2. public void lambdaUpdateWrapper(){
    3. //将用户名中包含有a并且 (年龄大于20或邮箱为null) 的用户信息修改
    4. LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
    5. lambdaUpdateWrapper.like(User::getName,"a")
    6. .and(i->i.isNull(User::getEmail).or().gt(User::getAge,20));
    7. lambdaUpdateWrapper.set(User::getName,"honor").set(User::getEmail,"honor@qq.com");
    8. int result = this.userMapper.update(null, lambdaUpdateWrapper);
    9. System.out.println(result);
    10. }
  • 相关阅读:
    深入学习JVM底层(三):垃圾回收器与内存分配策略
    4.【Sharding-JDBC】分库分表
    限流与代理网关集成调研及应用
    2D函数优化实战
    普冉PY32系列(七) SOP8,SOP10,SOP16封装的PY32F002A/PY32F003管脚复用
    【SQL注入】关于GORM的SQL注入问题
    k8s day03
    学习周报02
    Qt学习总结之单选框QRadioButton和QButtonGroup
    Java excel poi 读取已有文件 ,动态插入一列数据
  • 原文地址:https://blog.csdn.net/ONEBEYONDFANS/article/details/132590504