• 基于SpringBoot的SSMP整合案例(开启日志与分页查询条件查询功能实现)


    开启事务

    导入Mybatis-Plus框架后,我们可以使用Mybatis-Plus自带的事务,只需要在配置文件中配置即可
    使用配置方式开启日志,设置日志输出方式为标准输出
    
    • 1
    • 2
    mybatis-plus:
      global-config:
        db-config:
          table-prefix: tb_
          id-type: auto
      configuration:
        log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    只有最后一行有用
    
    • 1

    数据层开发-分页功能

    分页操作需要设定分页对象IPage,Page第一个参数当前页码值,第二个是每一页中条数
    
    • 1
    @Test
        void testPage(){
            IPage page = new Page(2,2);
            bookDao.selectPage(page,null);
            System.out.println(page.getRecords());
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    IPage对象中封装了分页操作中的所有数据
    	 数据
    	 当前页码值
    	 每页数据总量
    	 最大页码值
    	 数据总量
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    这样就直接实现分页了吗?
    答案是否定的

    分页操作是在MyBatisPlus的常规操作基础上增强得到,内部是动态的拼写SQL语句,
    因此需要增强对应的功能,使用MyBatisPlus拦截器实现
    
    • 1
    • 2
    import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
    import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    public class MyConfig {
    
        @Bean
        public MybatisPlusInterceptor mybatisPlusInterceptor(){
            MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
            mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
            return mybatisPlusInterceptor;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    执行测试代码
    
    • 1
    @Test
        void testPage(){
            IPage page = new Page(1,2);
            bookDao.selectPage(page,null);
            System.out.println(page.getRecords());
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述
    可以看出执行了两次查询,第一次执行的查询获取了总条数,为下面的分页做准备

    数据层开发-条件查询功能

    上面的分页查询中 bookDao.selectPage(page,null);
    第二个参数赋成null,你可能好奇它的功能是什么,那里是用来放条件对象QueryWrapper的。
    
    • 1
    • 2

    QueryWrapper解析
    QueryWrapper 是 MyBatis-Plus 的一个核心功能,它是用来构造 SQL 查询语句的。MyBatis-Plus 是一款 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
    QueryWrapper 主要提供了以下几个功能:
    链式调用: QueryWrapper 支持链式调用,使得代码更加简洁易读。
    条件构造器: QueryWrapper 提供了丰富的条件构造方法,如 eq (等于)、ne (不等于)、gt (大于)、ge (大于等于)、lt (小于)、le (小于等于) 等。
    SQL函数支持: QueryWrapper 支持 SQL 函数,比如 count、sum、avg 等。
    子查询支持: QueryWrapper 支持子查询,可以在查询条件中嵌套子查询。
    排序支持: QueryWrapper 支持 orderBy 方法进行排序。

    下面是一个事例
    
    • 1
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.eq("name", "张三")
                .ne("age", 20)
                .like("email", "test")
                .orderByAsc("age");
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    等价于SQL语句
    
    • 1
    SELECT * FROM user WHERE name = '张三' AND age != 20 AND email LIKE '%test%' ORDER BY age ASC;
    
    • 1
    了解完基础知识点,下面是实际使用
    
    • 1
    @Test
        void testGetBy(){
            QueryWrapper<Book> queryWrapper = new QueryWrapper<>();
            queryWrapper.like("name","Spring");
            List list = bookDao.selectList(queryWrapper);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    执行结果
    
    • 1

    在这里插入图片描述

    缺点:有的时候我们可能会打错,比如将name打成了nmae,有没有什么可以解决呢?有LambdaQueryWrapper。
    
    • 1

    LambdaQueryWrapper 是 MyBatis-Plus 提供的一个查询条件构造器,它是 QueryWrapper 的一个变种,主要使用 Java 8 的 Lambda 表达式语法。
    LambdaQueryWrapper 提供了与 QueryWrapper 类似的功能,包括链式调用、条件构造器、SQL函数支持、子查询支持、排序支持等。
    相比于 QueryWrapper,LambdaQueryWrapper 的主要优点在于:
    类型安全:LambdaQueryWrapper 使用了 Java 8 的 Lambda 表达式,使得其具有类型安全的特性。你可以在编译时检查到类型错误,而 QueryWrapper 在编译时无法检查到类型错误,只能在运行时通过抛出异常来发现错误。
    代码可读性更强:由于使用了 Lambda 表达式,LambdaQueryWrapper 的代码可读性更强。你可以直接看到正在操作的是哪个字段,而不需要通过字符串来指定字段名,这样也避免了因为字段名拼写错误导致的问题。

    例如,我们可以使用 LambdaQueryWrapper 构造如下的查询语句:
    
    • 1
    LambdaQueryWrapper<User> lambdaQuery = new QueryWrapper<User>().lambda();
    lambdaQuery.eq(User::getName, "张三")
               .ne(User::getAge, 20)
               .like(User::getEmail, "test")
               .orderByAsc(User::getAge);
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    等价于SQL语句
    
    • 1
    SELECT * FROM user WHERE name = '张三' AND age != 20 AND email LIKE '%test%' ORDER BY age ASC;
    
    • 1
    User::getName 表示字段名是 "name",其他的类推,这样我们就不会因为因为不小心而出错了。
    实战如下
    
    • 1
    • 2
    @Test
        void testGetBy2(){
            LambdaQueryWrapper<Book> queryWrapper = new LambdaQueryWrapper<>();
            queryWrapper.like(Book::getName,"Spring");
            List list = bookDao.selectList(queryWrapper);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    执行结果如下
    
    • 1

    在这里插入图片描述

    仅学习记录,如有错误欢迎指正~
    
    • 1
  • 相关阅读:
    使用水泥路肩培土两用机进行施工一次制作成型
    Function 源码解析与实践
    [NewStarCTF 2023 公开赛道]R!C!E!
    高等数学(第七版)同济大学 习题8-2 个人解答
    [车联网安全自学篇] 五十二. Android安全之本地存储敏感信息挖掘【二】
    【JVM】对象创建与访问
    小程序源码:多功能喝酒神器
    javascrip非标准 json格式转换为标准格式
    指纹浏览器功能对比:AdsPower VS Multilogin
    iPhone相机参数设置,苹果原相机也能拍出大片感
  • 原文地址:https://blog.csdn.net/qq_63524487/article/details/134347163