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实战开发经验。

  • 相关阅读:
    apache安全—用户访问控制
    hdu 3232 Crossing Rivers 过河(数学期望)
    HDU 5418 Victor and World (可重复走的TSP问题,状压dp)
    UVA 11020 Efficient Solutions (BST,Splay树)
    UVA 11922 Permutation Transformer (Splay树)
    HYSBZ 1208 宠物收养所 (Splay树)
    HYSBZ 1503 郁闷的出纳员 (Splay树)
    HDU 5416 CRB and Tree (技巧)
    HDU 5414 CRB and String (字符串,模拟)
    HDU 5410 CRB and His Birthday (01背包,完全背包,混合)
  • 原文地址:https://www.cnblogs.com/bingyang-py/p/12422725.html
Copyright © 2011-2022 走看看