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

news2024/11/17 17:40:48

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

在这里插入图片描述

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. 启动主程序,测试分页接口

在这里插入图片描述

  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都内置了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/111523.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【并发】深入理解JMM并发三大特性(一)

【并发】深入理解JMM&并发三大特性&#xff08;一&#xff09; 今天是2022.11.16&#xff0c;在此之前我已经学习完了图灵课堂MySQL的课程&#xff0c;也是想这篇文章一样用CSDN博客的形式来记录这些知识点。 在并发中&#xff0c;JMM在大多数人眼中&#xff0c;它是整个…

Zookeeper 2 Zookeeper 安装与配置 2.1 Zookeeper 安装与配置

Zookeeper 【黑马程序员Zookeeper视频教程&#xff0c;快速入门zookeeper技术】 文章目录Zookeeper2 Zookeeper 安装与配置2.1 Zookeeper 安装与配置2.1.1 Zookeeper 下载安装2 Zookeeper 安装与配置 2.1 Zookeeper 安装与配置 2.1.1 Zookeeper 下载安装 【其实这块内容 学…

搜狗趁势而来,输入法江湖风云再起

在2022腾讯数字生态大会上&#xff0c;搜狗输入法正式推出面向B端的开放平台&#xff0c;这是自去年9月完成退市、并入腾讯以来&#xff0c;这家输入法C端王者第一个大动作&#xff0c;宣告着其进军B端的野心。几乎与此同时&#xff0c;如今已是自家兄弟的微信&#xff0c;悄然…

vue调用百度api时跨域的解决方案

今天在开发一个项目中发现vue前端调用百度ocr识别接口出现了跨域问题&#xff01; 百度api 的接口&#xff1a; https://aip.baidubce.com/oauth/2.0/token 和百度开发工程师沟通一个多小时&#xff0c;未找到解决方案&#xff0c;忽然想到了是不是nginx配置的问题&#xff0…

TCManager——中药房管理系统大作业

简介 由于最近一个月世界变化有点大&#xff0c;所以一直在同步自己的大脑&#xff0c;没有写博客。 上个月花了5天&#xff08;3天后端2天前端&#xff09;写了个经典的springbootvue2的中药房管理系统大作业——TCManager。项目已在gitee上&#xff08;校园网差&#xff0c;…

vscode自动添加头注释和函数注释

下载koroFileHeader插件 然后点它的wiki文档 会跳到它的github 配置字段 OBKoro1/koro1FileHeader Wiki GitHub 先找到vscdoe的setting文件&#xff0c;两种方法&#xff1a; 1&#xff0c; 然后点这里&#xff1a; 或者去搜索框搜索&#xff1a;FileHeader 出现如下&…

你的团队是王者还是青铜(下)

我们接着上篇继续聊。 问题4&#xff1a;谁动了团队的时间&#xff1f;如果重来一个迭代&#xff0c;你有7*40个小时的投资&#xff0c;你要如何决策团队的工作安排&#xff1f; “小溪&#xff0c;一会约开卡&#xff1b;小溪&#xff0c;我这有个问题&#xff1b;小溪&#…

SpringBoot+Vue物流仓储管理系统

项目背景 在信息化的时代&#xff0c;效率和速度就变得尤为重要了&#xff0c;具有高效率和速度就具有更好的竞争力&#xff0c;更受客户欢迎。与此同时&#xff0c;网购与人们的生活息息相关&#xff0c;顾客在网上购买的商品需要通过物流公司对这些商品进行管理和配送&#x…

十五、Docker 网络

1、概述 Docker 容器和服务如此强大的原因之一是您可以将它们连接在一起&#xff0c;或将它们连接到非 Docker 工作负载。Docker 容器和服务甚至不需要知道它们部署在 Docker 上&#xff0c;或者它们的对等体是否也是 Docker 工作负载。无论您的 Docker 主机运行 Linux、Window…

Doo Prime 为泰国 SOS 儿童村送温暖,公益有起点爱心无疆界

一年一度的圣诞节即将来临&#xff0c;在这欢乐的时刻&#xff0c; Doo Prime 荣幸地宣布 &#xff0c;向泰国 SOS 儿童村捐赠了 35 万泰铢 ( 约合 1.23 万美元 )&#xff0c;作为泰国南部城市合艾府 SOS 儿童村的房屋翻修费用。 Doo Prime 希望 SOS 儿童村的孩子们都能在温馨…

【小程序】网络数据请求

目录 1. 小程序中网络数据请求的限制 2. 配置 request 合法域名 3. 发起 GET 请求 4. 发起 POST 请求 5. 在页面刚加载时请求数据 5. 跳过 request 合法域名校验 6. 关于跨域和 Ajax 的说明 1. 小程序中网络数据请求的限制 出于安全性方面的考虑&#xff0c;小程序官方…

【目标检测】Objects as Points

目录概述细节anchor-base vs anchor free网络结构标注损失函数学习资料概述 本文是一个anchor-free的目标检测算法。 【2019】【CenterNet】 研究的问题&#xff1a; 如何更好地将目标检测问题建模为关键点检测问题 提出的方法&#xff1a; 一个简单高效的目标检测方法Cent…

抖音年货节增长秘籍:横向做阵地,纵向定节奏,提前深种草

抖音好物年货节即将到来&#xff0c;对于品牌来说&#xff0c;这将是新一年首次生意爆发的机会。为了更好的融入抖音电商生态&#xff0c;做好数字化经营主阵地&#xff0c;品牌面临多个新挑战&#xff1a; 大促Bigday流量费用高&#xff0c;品牌怎样更高效获取流量&#xff1f…

数据库设计说明书(GB8567——88)基于协同的在线表格forture-sheet

数据库设计说明书&#xff08;GB8567——88&#xff09; 1引言 1.1编写目的 数据库的设计是为了以后编码、测试以及维护阶段的后台数据的存储做准备。应用于系统开发前期&#xff0c;为后期数据库设计指引方向。 预期的读者&#xff1a;系统开发人员、系统测试人员和系统维…

瑞昱rtl819x-SDK-v3.4.14b的watchdog分析

watchdog 看门狗&#xff0c;又叫watchdog timer&#xff0c;是一个定时器电路&#xff0c;一般有一个输入&#xff0c;叫喂狗或踢狗&#xff1b;一个输出到MCU 的 RST 端&#xff0c;MCU 正常工作的时候&#xff0c;每隔一段时间输出一个信号到喂狗端&#xff0c;给 WDT 清零…

SQL注入渗透与攻防(八)之延时注入

目录 基于时间的SQL盲注 - 延时注入 案列演示 基于时间的SQL盲注 - 延时注入 关于延时注入的使用场景一般在我们测试的注入点没有报错信息又没有回显点的情况下进行的。通过对于时间的延时判断来猜解数据。在实战过程中并不推荐大家通过延时注入去判断数据库&#xff0c;因为…

转行做程序员,难吗

在互联网急速发展的这几年里&#xff0c;程序员这个职业&#xff0c;成为了很多人的心之所向。虽然高薪背后往往伴随着高强度的工作节奏和压力&#xff0c;但是也不妨碍大量的人在编程培训或者自学编程的道路上前仆后继。 那么转行程序员真的容易吗&#xff1f;下面就跟大家分享…

无需编程即可将chatgpt接入自己的微信公众号

ChatGpt是openai推出的GPT3文本生成机器人。该机器人主要完成文本生成相关任务。机器人可以自主进行写作、翻译、修改语法、角色扮演的&#xff0c;甚至编写程序。网上有很多接入方法&#xff0c;大部份需要编程&#xff0c;并且需要注册openai账号获取appkey。本文所介绍的方法…

datagridview如何根据不同的按钮显示不同的表

以我设计的为例&#xff1a; 双击按钮&#xff0c;会自动创建三个事件 以第一个按钮为例&#xff1a;在其中添加如下代码 SqlConnection sqlcon new SqlConnection(); sqlcon.ConnectionString "";//双引号内填入你的数据库连接字符 sqlcon.Open(); string sql &…

UG NX二次开发(C#)-获取模型文件的预览图片

文章目录 1.前言2. 模型文件预览图介绍3.采用二次开发的方法获取模型的预览图4.验证1.前言 UG NX保持的prt文件中保存了模型的预览位图,但是采用UG NX二次开发时不能直接提取出来,本文讲解一下将prt文件的预览位图提取出来并单独保存。 2. 模型文件预览图介绍 如果我们在UG…