06---SpringBoot整合MybatisPlus 实现增删改查和分页

时间:2022-12-25 08:04:23

1、Mybatis-plus简介

  1. 为什么要用MP?
  • MyBatisPlus可以节省我们大量工作时间,所有的CRUD代码都可以自动化完成
  • 偷懒用的~
  • 如果是对sql语言不太熟练的建议先用mybatis,熟练后再用mybatis-plus
  1. 简述
  • 官网https://baomidou.com/
  • 为简化开发而生
  • MyBatis-Plus(简称 MP)是一个 MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
  1. 特性
  • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
  • 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作,BaseMapper
  • 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
  • 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
  • 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可*配置,完美解决主键问题
  • 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
  • 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
  • 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
  • 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
  • 分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
  • 内置性能分析插件:可输出 SQL 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
  • 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作

2、整合MyBatis-Plus

  • 如果因为时间问题,版本迭代和代码有所不同,可以参考官网http://baomidou.com/来学习整合!
  1. 导入依赖
<!--        整合mybatis-plus-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.2</version>
        </dependency>
  • 版本去官网看,用最新版的就行
  • 建议用MP的话,就把Mybatis依赖删除…避免版本不合
  1. 写配置config

MyBatisPlusConfig.java

@Configuration   //组件,添加到容器
@MapperScan("com.xqh.mapper")  //开启mapper接口扫描  
public class MybatisPlusConfig {
    /**
     * 新的分页插件,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题(该属性会在旧插件移除后一同移除)
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }

}
  1. 写配置文件
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  mapper-locations: classpath:/mapper/*.xml
  • log-impl:用来打印sql日志
  • mapper-locations: classpath:/mapper/*.xml mapper映射位置
  1. UserMapper改造

UserMapper.java

@Repository
public interface UserMapper extends BaseMapper<User> {

}
  • 继承一个类 BaseMapper,MP内置的,自动实现增删改查
  1. UserService改造

UserService.java

@Service
public class UserService extends ServiceImpl<UserMapper,User> {}
  • 继承ServiceImpl类,也是MP自带
  1. 启动主程序,看看能不能跑起来

  2. 出现bug

Error creating bean with name ‘userController’: Unsatisfied dependency expressed through field ‘userService’;…not found class User…

解决:

这种报错一般就是没有实体层、service层、mapper层没有映射上,此时我们的mapper已经写好了地址,所以加一个实体类的位置就可以了,在配置文件application.yml中补充:

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  mapper-locations: classpath:/mapper/*.xml
  type-aliases-package: com.xqh.entity   # 实体类也映射上

重新启动,启动成功,整合MP成功

  1. 实体层也需要改造一下

User.java

@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName(value = "user")
public class User {
    @TableId(type = IdType.AUTO)
    private Integer id;
    private String username;
//密码可以不展示, @JsonIgnore 意思就是给前端传数据时忽略某个字段
    @JsonIgnore
    private String password;
    private String nickname;
    private String email;
    private String phone;
    private String address;
}

  • 关于这些注解对应的意思可以去官网上找,都是为了和数据库中字段对应上。

3、实现增删改查

  1. 因为涉及的不是复杂查询,不需要自定义sql,所以UserMapper.xml里的sql语句可以都删除掉(不删除后面会出现一个bug)

UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xqh.mapper.UserMapper">
</mapper>

  1. UserController.java
@RestController  //返回json
@RequestMapping("/user")   //加前缀,这下面的所有接口都要加/user前缀
public class UserController {
    @Autowired
    private UserService userService;


    //插入和修改操作  , 需要外界发送数据,用post
    @PostMapping
    public boolean save(@RequestBody User user){
        return userService.saveOrUpdate(user);
    }

    //查询所有数据
    @GetMapping
    public List<User> findAll(){
        return userService.list();
    }

    //删除
    @DeleteMapping("/{id}")
    public boolean delete(@PathVariable Integer id){
        return userService.removeById(id);
    }
}
  • 这些方法都是MP自带的…不需要在service层实现,不用写繁琐重读的增删改查代码了。
  1. UserService.java
@Service
public class UserService extends ServiceImpl<UserMapper,User> {}
  • 普通的增删改查不需要重复写业务代码,MP自动实现了,就是通过继承的这个实现类
  1. 同样,UserMapper.java也不用写代码,省去很多重复的工作

  2. 启动主程序,打开swagger页面测试接口 http://localhost:8081/swagegr-ui.html

06---SpringBoot整合MybatisPlus 实现增删改查和分页

4、实现分页查询

  1. UserController,java

分页需要自己重写一个方法,不过也很方便有了MP

   //分页查询
    @GetMapping("/page")
    public IPage<User> findPage(@RequestParam Integer pageNum,
                                @RequestParam Integer pageSize,
                                @RequestParam(defaultValue = "") String username,
                                @RequestParam(defaultValue = "") String nickname){
      return userService.findPage(pageNum,pageSize,username,nickname);

    }
  • 定义一个findPage()方法实现翻页,去service层实现
  • username和nickname设置一个默认值为“”空字符串,这样就不会使得我们只想改其中一个数据的时候运行不了
  1. UserService.java
 public IPage<User> findPage( Integer pageNum,
                                 Integer pageSize,
                                  String username,
                                 String nickname) {
        IPage<User> page = new Page<>(pageNum, pageSize);
        QueryWrapper<User>queryWrapper=new QueryWrapper<>();
        if (! "".equals(username)){
            queryWrapper.like("username",username);
        }
        if (! "".equals(nickname)){
            queryWrapper.like("nickname",nickname);
        }

//       queryWrapper.like("username",username);
//        queryWrapper.like("nickname",nickname);
        return this.page(page,queryWrapper);




        //queryWrapper.or().like("nickname",nickname);//出现or,那么前面的条件都失效...只要or后面成立的都会筛选出来,慎用


  • 因为我们设置了默认值为“ ”,所以当我们不输入其中一个条件时,那么默认这个条件为“”而不是null,这个时候数据库查询是连着一个条件为“ ”来查询,导致查不到我们想要的只符合一个条件的…所以这个时候需要加一个判断条件,只有在条件不等于“ ”的时候才去模糊查询,当其中一个条件不写时(默认值就是“ ”)那么就不把它and在一起模糊查询。
  • queryWrapper.or().like(“nickname”,nickname);//出现or,那么前面的条件都失效…只要or后面成立的都会筛选出来,慎用
  1. 用了MP后,复杂的sql才需要自定义,简单的crud可以直接使用。
  2. 启动主程序,测试分页接口

06---SpringBoot整合MybatisPlus 实现增删改查和分页

  1. 成功实现分页查询和增删改查。比起只用mybatis,简化了很多的操作。
  2. 出现报错

Parameter ‘username’ not found. Available parameters are [ew, page, param1, param2]

测试分页的时候,报500错误,控制台给出的错误信息

  • 找了好久,发现是因为自己mapper.xml文件中,写了一个selectPage的方法的sql,这个方法和MP里自带的selectPage重复了,所以报错。把mapper.xml里的sql语句删除就好,因为本身也没用到它们了,MP都内置了。