zoukankan      html  css  js  c++  java
  • SpringBoot图文教程11—从此不写mapper文件「SpringBoot集成MybatisPlus」

    有天上飞的概念,就要有落地的实现

    • 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例都敲一遍

    • 先赞后看,养成习惯

    SpringBoot 图文教程系列文章目录

    1. SpringBoot图文教程1「概念+案例 思维导图」「基础篇上」
    2. SpringBoot图文教程2—日志的使用「logback」「log4j」
    3. SpringBoot图文教程3—「‘初恋’情结」集成Jsp
    4. SpringBoot图文教程4—SpringBoot 实现文件上传下载
    5. SpringBoot图文教程5—SpringBoot 中使用Aop
    6. SpringBoot图文教程6—SpringBoot中过滤器的使用
    7. SpringBoot图文教程7—SpringBoot拦截器的使用姿势这都有
    8. SpringBoot图文教程8 — SpringBoot集成MBG「代码生成器」
    9. SpringBoot图文教程9—SpringBoot 导入导出 Excel 「Apache Poi」
    10. SpringBoot图文教程10—模板导出|百万数据Excel导出|图片导出「easypoi」

    前言

    在使用Mybatis进行项目开发的时候,最繁琐的事情就是实体类,dao接口,mapper.xml文件的编写,几乎每个表都需要对应写一套,并且大部分的工作量都在最基本的增删改查上。如果表中的字段进行了修改,那么实体类,mapper文件甚至dao接口都要进行修改。

    在之前的文章中介绍了 MBG(Mybatis 代码生成器) 的使用,今天带来更进一步的简化Mybatis开发的工具 MybatisPlus,后续还会有 通用Mapper,总有一款适合你。

    MybatisPlus

    MybatisPlus 可以认为一个Mybatis的外挂,用了这个技术之后 可以不写mapper文件 可以不写dao接口中的方法 然后实现增删改查 分页查询 条件查询 等等

    什么是Mybatis Plus

    MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

    在 MyBatis 的基础上只做增强不做改变

    意味着 如果你导入了Mybatisplus的依赖 但是不想用Mybatisplus的方法 ,那么 不会影响到Mybatis的正常使用

    官方文档:https://mp.baomidou.com/guide/crud-interface.html#page

    MybatisPlus的使用

    集成项目

    1. 导入Mybatisplus的依赖

      注意:要首先删除Mybatis的依赖,因为Mybatisplus中包含有Mybatis的依赖 不需要独立导入 容易jar包冲突

    
     
       <dependency>
           <groupId>com.baomidou</groupId>
           <artifactId>mybatis-plus-boot-starter</artifactId>
           <version>3.3.1.tmp</version>
       </dependency>
      
    
    1. 修改配置文件

    通过MybatisPlus实现增删改查

    教程新手向,只讲解Mybatis最常用,最基本的API,更多的操作请参考官方文档
    demo使用到的数据库库表如下

    1. 给要数据库操作的实体类加Mybatisplus的注解

      因为Mybatisplus不需要写mapper文件 不需要写sql 那么Mybatisplus怎么知道实体类和数据库表映射关系(ORM) 通过注解表明这种关系

       /**
        * @TableName("cmfz_admin") 将当前的实体类和数据库的表建立联系
        * 注解参数:表名
        */
       @TableName("cmfz_admin")
       @Data
       public class CmfzAdmin implements Serializable {
           /**
            * 主键属性  @TableId
            *
            * value 该属性对应的数据库表中的字段名
            * type 主键自增的类型 AUTO 代表自动递增
            */
           @TableId(value = "id",type = IdType.AUTO)
           private Integer id;
           /**
            * 非主键属性  @TableField
            *  @TableField("username")  参数为该属性对应的数据库表中的字段名
            *
            */
           @TableField("username")
           private String username;
       
           @TableField("password")
           private String password;
       
       }
    
    1. 创建dao接口

      import com.baizhi.entity.CmfzAdmin;
      import com.baomidou.mybatisplus.core.mapper.BaseMapper;
      
      /**
       * 注意:
       * 1.接口中不需要写方法
       * 2.接口需要继承MybatisPlus中的类 BaseMapper  泛型为 当前dao对应的实体类
       */
      public interface CmfzAdminDao extends BaseMapper<CmfzAdmin> {
      }
      
    2. 直接使用Mybatisplus的方法 开始增删改查

          @Test
          public void contextLoads() {
      //        根据id查询
              CmfzAdmin cmfzAdmin = cmfzAdminDao.selectById(1);
      //        System.out.println(cmfzAdmin);
      
      //        查询所有  selectList(null);
              List<CmfzAdmin> cmfzAdmins = cmfzAdminDao.selectList(null);
              for (CmfzAdmin admin : cmfzAdmins) {
                  System.out.println(admin);
              }
          }
      
          /**
           * 添加
           */
          @Test
          public void test1(){
      //        创建一个对象
              CmfzAdmin cmfzAdmin = new CmfzAdmin();
              cmfzAdmin.setUsername("hhhh");
              cmfzAdmin.setPassword("123456");
      
      //        添加  返回值是成功的条数
              int insert = cmfzAdminDao.insert(cmfzAdmin);
              System.out.println(insert);
          }
      
          /**
           * 将id为5的管理员名字修改为lisi
           */
          @Test
          public void test2(){
              CmfzAdmin cmfzAdmin = new CmfzAdmin();
              cmfzAdmin.setId(5);
              cmfzAdmin.setUsername("lisi");
      
      //        根据id更新数据
              int i = cmfzAdminDao.updateById(cmfzAdmin);
      
      //        删除
              /**
               * deleteById() 根据id删除
               * deleteBatchIds() 批量删除 参数是要删除的id的集合
               */
              
          }
      

    实现条件查询 (条件构造器的使用)

     /**
         * 要查询名字有zhangsan的管理员的信息
         */
        @Test
        public void test4(){
            /**
             * selectOne 查询一个方法
             *
             * selectOne 需要一个Wrapper对象 实际上是需要一个条件
             *
             * 条件是 查询名字为zhangsan管理员
             * sql where username = zhangsan
             * 需要 把 sql的条件 封装到 Wrapper对象 对象中
             * 将封装了条件的对象 给 selectOne
             *
             * Wrapper对象 条件构造器  将sql的条件 写入到Java对象中
             * QueryWrapper 查询条件构造器
             * UpdateWrapper 更新的条件构造器
             */
    //        1.创建一个条件构造器 泛型 为要查询数据的实体类类型
            QueryWrapper<CmfzAdmin> queryWrapper = new QueryWrapper<>();
    
    //        2.将 where username = zhangsan 等值查询 这个条件封装到 条件构造器
            // username = zhangsan ---》 eq("username","zhangsan") 参数1 字段名 参数2 要查询的值
            queryWrapper.eq("username","zhangsan");
    
    //        3.通过条件构造器 查询
            CmfzAdmin cmfzAdmin = cmfzAdminDao.selectOne(queryWrapper);
    
            System.out.println(cmfzAdmin);
        }
    
        /**
         * 查询 名字为 lisi 或者 密码为 123456 的管理员
         *
         * sql username = lisi or password = 123456
         *
         * or 和 and 怎么构建?
         * eq("id",1).or().eq("name","老王")--->id = 1 or name = '老王'
         */
        @Test
        public void test5(){
    //        1.创建条件构造器
            QueryWrapper<CmfzAdmin> queryWrapper = new QueryWrapper<>();
    
    //        2.构造条件  条件构造器的方法的第一个参数基本上都是字段名
            queryWrapper.eq("username","lisi").or().eq("password","123456");
    
    //        3.查询
            /**
             * 批量查询 selectList() 方法中如果参数是null 就是查询所有
             */
            List<CmfzAdmin> cmfzAdmins = cmfzAdminDao.selectList(queryWrapper);
    
            for (CmfzAdmin cmfzAdmin : cmfzAdmins) {
                System.out.println(cmfzAdmin);
            }
        }
    

    条件修改:把用户名为zhangsan的管理员密码修改为123456

     /**
         * 用法和查询类似
         * 把用户名为zhangsan的管理员密码修改为123456
         *
         */
        @Test
        public void test6(){
    //        1.创建条件构造器
            UpdateWrapper<CmfzAdmin> updateWrapper = new UpdateWrapper<>();
    
    //        2.构造条件
    //        where username = zhangsan
    //        set password = 123456
            updateWrapper.set("password","123123");
    
            updateWrapper.eq("username","zhangsan");
    
    //        3.使用方法修改
            /**
             * update
             * 参数1  一个管理员对象  可以直接写null
             * 参数2  条件构造器
             */
            cmfzAdminDao.update(null,updateWrapper);
        }
    

    实现分页查询

    1. 配置分页插件 配置在启动类中即可

      @Bean
          public PaginationInterceptor paginationInterceptor() {
              PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
              // 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求  默认false
              // paginationInterceptor.setOverflow(false);
              // 设置最大单页限制数量,默认 500 条,-1 不受限制
              // paginationInterceptor.setLimit(500);
              // 开启 count 的 join 优化,只针对部分 left join
              paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
              return paginationInterceptor;
          }
      
    2. 直接在代码可以使用分页查询

      /**
           * 测试分页查询
           *
           * 获取第二页的数据(页码) 每页显示两条(size)
           */
          @Test
          public void test7(){
      
      //        1.创建一个page对象 封装分页数据
              /**
               * 创建对象的时候 直接写入分页数据
               * 参数1 页码
               * 参数2 每页条数
               */
              Page<CmfzAdmin> adminPage = new Page<>(2,2);
      
      //        2.使用分页查询的方法
              /**
               * 分页查询的方法 selectPage()
               * 参数1 IPage 分页对象 封装分页信息 封装获取第二页的数据(页码) 每页显示两条(size)
               * 参数2 条件构造器 可以直接写null
               */
              Page<CmfzAdmin> cmfzAdminPage = cmfzAdminDao.selectPage(adminPage, null);
      
      //        3.从Page对象中获取查询到的数据
              /**
               * getRecords() 获取查询结果
               * getTotal() 总条数
               */
              System.out.println("总条数:"+cmfzAdminPage.getTotal());
      
              List<CmfzAdmin> adminList = cmfzAdminPage.getRecords();
              for (CmfzAdmin cmfzAdmin : adminList) {
                  System.out.println(cmfzAdmin);
              }
      
          }
      

    总结

    Tips:关于在SpringBoot项目中简化Mybatis的开发,本教程提供三个技术 MBG,MybatisPlus,通用Mapper,总有一款适合你。

    恭喜你完成了本章的学习,为你鼓掌!如果本文对你有帮助,请帮忙点赞,评论,转发,这对作者很重要,谢谢。

    让我们再次回顾本文的学习目标

    • 掌握SpringBoot中MybatisPlus的使用

    要掌握SpringBoot更多的用法,请持续关注本系列教程。

    求关注,求点赞,求转发

    欢迎关注本人公众号:鹿老师的Java笔记,将在长期更新Java技术图文教程和视频教程,Java学习经验,Java面试经验以及Java实战开发经验。

  • 相关阅读:
    servlet的监听器、过滤器、拦截器的区别
    根据一个单词找所有的兄弟单词的思想如何处理
    Maven deploy 部署 jar 到 Nexus 私服
    在vps上搭建hexo博客
    Java解决LeetCode72题 Edit Distance
    学以致用:Python爬取廖大Python教程制作pdf
    puppeteer截图
    Netty接收HTTP文件上传及文件下载
    Docker中执行Shell出现乱码
    Netty URL路由方案探讨
  • 原文地址:https://www.cnblogs.com/bingyang-py/p/12422725.html
Copyright © 2011-2022 走看看