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

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

  • 先赞后看,养成习惯

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

SpringBoot图文教程11—从此不写mapper文件「SpringBoot集成MybatisPlus」的更多相关文章

  1. SpringBoot图文教程12—SpringData Jpa的基本使用

    有天上飞的概念,就要有落地的实现 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例都敲一遍 先赞后看,养成习惯 SpringBoot 图文教程系列文章目录 SpringBoot图文教程1「概念+ ...

  2. SpringBoot图文教程14—SpringBoot集成EasyExcel「上」

    有天上飞的概念,就要有落地的实现 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例都敲一遍 先赞后看,养成习惯 SpringBoot 图文教程系列文章目录 SpringBoot图文教程1「概念+ ...

  3. SpringBoot图文教程15—项目异常怎么办?「跳转404错误页面」「全局异常捕获」

    有天上飞的概念,就要有落地的实现 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例都敲一遍 先赞后看,养成习惯 SpringBoot 图文教程系列文章目录 SpringBoot图文教程1-Spr ...

  4. SpringBoot图文教程17—上手就会 RestTemplate 使用指南「Get Post」「设置请求头」

    有天上飞的概念,就要有落地的实现 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例都敲一遍 先赞后看,养成习惯 SpringBoot 图文教程系列文章目录 SpringBoot图文教程1-Spr ...

  5. SpringBoot图文教程「概念+案例 思维导图」「基础篇上」

    有天上飞的概念,就要有落地的实现 概念+代码实现是本文的特点,教程将涵盖完整的图文教程,代码案例 每个知识点配套自测面试题,学完技术自我测试 本文初学向,所以希望文中所有的代码案例都能敲一遍 大哥大姐 ...

  6. SpringBoot图文教程8 — SpringBoot集成MBG「代码生成器」

    有天上飞的概念,就要有落地的实现 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例都敲一遍 先赞后看,养成习惯 SpringBoot 图文教程系列文章目录 SpringBoot图文教程1「概念+ ...

  7. SpringBoot图文教程5—SpringBoot 中使用Aop

    有天上飞的概念,就要有落地的实现 概念+代码实现是本文的特点,教程将涵盖完整的图文教程,代码案例 文章结尾配套自测面试题,学完技术自我测试更扎实 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例 ...

  8. SpringBoot图文教程6—SpringBoot中过滤器的使用

    有天上飞的概念,就要有落地的实现 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例都敲一遍 先赞后看,养成习惯 SpringBoot 图文系列教程技术大纲 鹿老师的Java笔记 SpringBo ...

  9. SpringBoot图文教程4—SpringBoot 实现文件上传下载

    有天上飞的概念,就要有落地的实现 概念+代码实现是本文的特点,教程将涵盖完整的图文教程,代码案例 文章结尾配套自测面试题,学完技术自我测试更扎实 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例 ...

随机推荐

  1. shell_xtrabackup_backup_mysql

    #!/bin/bash# Name: xtra_back_mysql.sh# Desc:该脚本使用xtrabackup工具对mysql数据库进行增量备份,根据自己需求可以自行修改# Usage:./x ...

  2. Hibernate/JPA中@Where使用时注意

    在使用Hibernate或者JPA时,我们经常会使用@Where注解实现查询过滤,在实体类上.实体属性上.查询语句上都有应用. 例如: @Where(clause = "status != ...

  3. 2018SEERC Points and Rectangles (CDQ分治)

    题:http://codeforces.com/gym/101964/problem/K 分析:https://blog.csdn.net/qq_43202683/article/details/98 ...

  4. Object.prototype.toString.call(obj).slice(8,-1)

    1.Object.prototype.toString() 该方法返回描述某个对象数据类型的字符串,如自定义的对象没有被覆盖,则会返回“[object type]”,其中,type则是实际的对象类型. ...

  5. mysql操作命令梳理-grant授权和revoke回收权限

    在mysql维护工作中,做好权限管理是一个很重要的环节.下面对mysql权限操作进行梳理: mysql的权限命令是grant,权限撤销的命令时revoke:grant授权格式:grant 权限列表 o ...

  6. 88)PHP,PDOStatement对象

    PDOStatement类,称之为PDO语句对象,SQL执行完(处理完)产生的结果对象. fetchColumn(index=) 允许传递参数,表示获得第一条记录的第几个字段的值. 相当于 getOn ...

  7. Python面向对象三大特征

    继承 面向对象中的继承就是继承的类直接拥有被继承类的属性而不需要在自己的类体中重新再写一遍,其中被继承的类叫做父类.基类,继承的类叫做派生类.子类.在python3中如果不指定继承哪个类,默认就会继承 ...

  8. 阿里云系统安装部署Freeswitch

    1.安装vim apt-get install vim 2.修改镜像源 将/etc/apt/source.list的原有源注释掉,添加下面的源: deb http://mirrors.163.com/ ...

  9. Klotski's Blog

    教材: 唐朔飞 编著 "计算机组成原理(第2版)"高等教育出版社 2008年1月 习题指导教材: 唐朔飞 编著 "计算机组成原理–学习指导与习题解答(第2版)" ...

  10. CSS面试题&知识点汇总

    问题&答案 介绍一下标准的CSS的盒子模型?低版本IE的盒子模型有什么不同的? 有两种, IE 盒子模型.W3C 盒子模型: 盒模型: 内容(content).填充(padding).边界(m ...