当前位置: 首页 > news >正文

最新版SpringBoot整合Mybatis-plus,实现增删改查(CRUD)

文章目录

  • 前言
  • 第一:创建一张数据库的表,并导入数据(两种方式)
    • 第一种:命令行方式创建
    • 第二种:使用可视化工具navicat创建
  • 第二步:新建SpringBoot项目工程,并准备好所有配置
  • 第三:新建文件夹,确定开发的结构
    • 一、在controller文件夹新建一个UserController类:
    • 二、在service文件夹新建一个UserService类
    • 三、在mapper包下新建一个UserMapper接口类,用于继承BaseMapper<User>(实体类):
    • 四、在entity文件夹下建一个User实体类就好了,字段名与数据库相对应:
  • 第四:测试方法,并输出结果
    • 一、查询结果
    • 二、增加结果
    • 三、更新结果
    • 四、删除结果
  • 第五:条件构造器
  • 第六:总结

前言

自上一篇写了最新版SpringBoot整合Mybatis,实现增删改查(CRUD),这一篇就得写一写Mybatis-plus了,为什么写了Mybatis之后得写Mybatis-plus呢,这两者有什么区别呢?或者这两种谁更好呢?
其实他们俩看名字就能看得出来,他们非常相似。不过也确实是的,Mybatis-plus其实就是Mybatis的增强版,Mybatis-plus就是弥补了一些Mybatis的不足的地方,Mybatis-plus文档上也说了,Mybatis-plus对比于Mybatis来说,只做增强,不做改变;让我们在编写代码的时候,不用在和Mybatis一样,每次在编写业务逻辑的时候都需要在DAO层写一个方法,在mapper.xml文件中写一个sql语句的,所以Mybatis-plus可以减少我们写代码的数量,让我们的开发效率更高,开发更便捷,非常的nice。下面让我们一起来学习学习吧!😁😁😁

在这里插入图片描述

第一:创建一张数据库的表,并导入数据(两种方式)

第一种:命令行方式创建

创建一张名为user的数据表

DROP TABLE IF EXISTS user;

CREATE TABLE user
(
    id BIGINT(20) NOT NULL COMMENT '主键ID',
    name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
    age INT(11) NULL DEFAULT NULL COMMENT '年龄',
    email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
    PRIMARY KEY (id)
);

创建好user表之后,导入数据

DELETE FROM user;

INSERT INTO user (id, name, age, email) VALUES
(1, 'Jone', 18, 'test1@baomidou.com'),
(2, 'Jack', 20, 'test2@baomidou.com'),
(3, 'Tom', 28, 'test3@baomidou.com'),
(4, 'Sandy', 21, 'test4@baomidou.com'),
(5, 'Billie', 24, 'test5@baomidou.com');

第二种:使用可视化工具navicat创建

右键点击数据库,新建表即可 (无论是用命令行还是用可视化工具记得后续都要勾选主键自动递增)

在这里插入图片描述

第二步:新建SpringBoot项目工程,并准备好所有配置

点击IDEA左上角的的File选项,然后新建project即可,如下图所示:

在这里插入图片描述

在这里插入图片描述

在pom.xml文件下引入Mybatis-plus的依赖

     <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.2</version>
        </dependency>

测试数据库是否能连接成功,第二张图的红色框依次代表:上图创建的表名(user)、用户名、用户密码、数据库名,填好之后点击箭头指向的Test Connection,在点击OK即可

在这里插入图片描述

在这里插入图片描述

配置application.yml文件(如果初始是application.properties文件可以将后缀名properties改为yml)

server:
  port: 8080  # 端口号

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/数据库名?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai
    username: root  # 数据库用户名
    password: 123456  # 数据库密码

# 打印Mybatis-plus的日志

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

在SpringBootApplication加一个MapperScan注解,扫描的包的路径是创建的接口类(我创建的接口类在mapper包下,所以我扫描的是mapper文件夹,如果创建的是dao可以扫描dao文件夹)

在这里插入图片描述

第三:新建文件夹,确定开发的结构

从上一篇文章我们知道Mybatis的结构是:Entity(实体类)、Dao、Service、Controller,数据的流向是,从Controller层接收,再调用Service的方法,而Service层负责实现Dao接口中定义的方法,Dao与Mapper.xml文件是有关联的,Dao接口中的方法名与Mapper,xml文件的方法名想对应,而参数方面则是Entity实体类想对应,最后数据返回是这样的:Entity->Dao(与Mapper.xml相结合)->Service->Controller;而Mybatis-plus则是将Dao和Mapper.xml相结合(可以创建mapper、dao),不用再写SQL,只需要在接口层继承一个类就可以了,下面我们来看看包的结构(❁´◡`❁)

在这里插入图片描述

一、在controller文件夹新建一个UserController类:

Controller层只做一个接收和一个返回的作用,具体的业务实现还得看Service层

import com.example.mp_test.entity.User;
import com.example.mp_test.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;

    //查询全部用户
    @GetMapping("/queryUser")
    List<User> querUser(@RequestBody User userTO){
        return userService.queryUser(null);
    }

    //查询单个用户
    @GetMapping("/queryUserById")
    User queryUserById(@RequestBody User user){
        return userService.queryUserById(user);
    }

    //查询多个用户
    @GetMapping("/queryUserBatchIds")
    List<User> queryUserBatchIds(@RequestBody List<User> users){
        return userService.queryUserBatchIds(users);
    }

    //条件查询
    @GetMapping("/queryUserByMap")
    List<User> queryUserByMap(@RequestBody User user){
        return userService.queryUserByMap(user);
    }

    //分页查询
    @GetMapping("/queryUserPage")
    List<User> queryUserPage(@RequestParam Long current,@RequestParam Long size){
        return userService.queryUserPage(current,size);
    }

    //模糊查询
    @GetMapping("/queryUserLike")
    List<Map<String,Object>> queryUserLike(@RequestBody User user){
        return userService.queryUserLike(user);
    }

    //增加用户
    @PostMapping("/addUser")
    int addUser(@RequestBody User user){
        return userService.addUser(user);
    }

    //更新用户
    @PutMapping("/updateUser")
    int updateUser(@RequestBody User user){
        return userService.updateUser(user);
    }

    //删除用户
    @DeleteMapping("/deleteUser")
    int deleteUser(@RequestBody User user){
        return userService.deleteUser(user);
    }
}

二、在service文件夹新建一个UserService类

Service层主要是处理业务的,一些逻辑判断和一些数据检验都是在这里面完成的,Mybatis-plus很多的方法都已经实现了,所以我们只需要知道使用的方法的传入参数和传出参数基本就可以使用这个方法了,代码如下:

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.mp_test.entity.User;
import com.example.mp_test.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service("UserService")
public class UserService {
    @Autowired
    private UserMapper userMapper;

    //用户全部查询,既然是全部用户,就不应输入具体条件了
    public List<User> queryUser(User user) {
        return userMapper.selectList(null);
    }

    //单个用户查询,这里的传入参数是用户的ID号,我用了实体,实体中的id属性是我传入的ID号,这里可以自己改入参的
    public User queryUserById(User user) {
        //单个用户查询
        User list = userMapper.selectById(user.getId());
        return list;
    }

    //多个用户查询,多个用户和上面的也一样,自己可以更改入参的
    public List<User> queryUserBatchIds(List<User> users) {
        //(多用户查询)
        List<User> list1 = userMapper.selectBatchIds(Arrays.asList(users.get(0).getId(), users.get(1).getId(), users.get(2).getId()));
        return list1;
    }


    //条件查询,需要用Map集合,key对应数据库的字段,而value则对应数据库字段中的值,很好理解
    public List<User> queryUserByMap(User user) {
        Map<String, Object> map = new HashMap<>();
        //定义查询条件,比如我们查询姓名是Jack,还有年龄是20岁的用户信息
        map.put("name", user.getName());
        map.put("age", user.getAge());
        List<User> list = userMapper.selectByMap(map);
        return list;
    }

    //分页查询,这一块一定要引入Mybatis-plus的分页插件,也就是我的MybatisPlusConfig类,不然没用效果
    public List<User> queryUserPage(Long current, Long size) {
        Page<User> page = new Page<>(current, size);
        userMapper.selectPage(page, null);
        List<User> list = page.getRecords();
        return list;
    }

    //模糊查询,这里条件构造器是一个很重要的点,QueryWrapper可以将自己想要的条件添加进去进行查询
    public List<Map<String, Object>> queryUserLike(User user) {
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.like("name", "o").like("age", "8");
        return userMapper.selectMaps(queryWrapper);
    }

    //增加用户,这里要设置主键自增,而且这里的ID生成用了一种雪花算法,我觉得很好,感兴趣的可以去了解
    public int addUser(User user) {
        return userMapper.insert(user);
    }

    //根据传入的用户ID更新用户
    public int updateUser(User user) {
        return userMapper.updateById(user);
    }

    //根据传入的用户ID删除用户
    public int deleteUser(User user) {
        return userMapper.deleteById(user);
    }
}

三、在mapper包下新建一个UserMapper接口类,用于继承BaseMapper(实体类):

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.mp_test.entity.User;
import org.springframework.stereotype.Repository;

@Repository
public interface UserMapper extends BaseMapper<User> {
}

四、在entity文件夹下建一个User实体类就好了,字段名与数据库相对应:


import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private Long id;
    private String name;
    private Integer age;
    private String email;
}

第四:测试方法,并输出结果

一、查询结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、增加结果

在这里插入图片描述
在这里插入图片描述

三、更新结果

在这里插入图片描述
在这里插入图片描述

四、删除结果

在这里插入图片描述
在这里插入图片描述

第五:条件构造器

Mybatis提供了调价构造器,这一块很重要,我觉得这一块可以动态调整你需要的SQL条件,比如你查询用户时,你是多条件的就可以用条件构造器追加条件,如下是查询一个name不为空、email邮箱等于123@qq.com、年龄小于30的用户:

在这里插入图片描述
根据条件构造器我们可以更多的去实现自己想要i的需求,我觉得这是Mybatis-plus非常好的一个地方,需要去掌握😁

第六:总结

写到这里已经是深夜一点半了,主要是简单的对Mybatis-plus做一个简单的入门,如果需要详细学习的话,还是需要去参考Mybatis-plus的官方文档,文档中写的非常详细,建议大家可以点进一个类去看看这个方法是怎么用的,初学阶段会用就ok了。学了Mybatis-plus之后,后续可能会用Mybatis-plus进行项目的开发了,毕竟这个写增删改查(CRUD)非常快,接下来会更新一下前端的一些内容,也可以帮助博主记录一下,忘了的时候可以看看。
如果这篇文章帮助到了你,可以给个小小的赞,后续会继续更新😁😁😁

在这里插入图片描述

相关文章:

  • 【JavaEE】多线程
  • 消息队列RabbitMQ的安装及使用
  • ccf202112-2
  • 基于微信小程序的新冠疫苗预约系统 uinapp
  • 消息队列kafka组件的安装及使用
  • PHP PDO简单安全的用户注册和登录表单
  • 第7章 C语言的函数指针与指针函数 (三)
  • apt 的 update 和 upgrade 命令的区别是什么?
  • 【从零学Python】一些工具类的使用:SummaryWriter()、tqdm()
  • 计算机毕业设计ssm+vue基本微信小程序的考试刷题及分析系统小程序
  • MMlab 官方教程链接汇总
  • win10你的设备遇到问题,需要重启的五种解决方法
  • 【MyBatis笔记12】MyBatis中二级缓存相关配置内容
  • EasyExcel 官网观看建议
  • 再苦再累也必须要弄懂的:ES6的ES Module
  • avalon2.2的VM生成过程
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • DOM的那些事
  • golang中接口赋值与方法集
  • java第三方包学习之lombok
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • Rancher如何对接Ceph-RBD块存储
  • sublime配置文件
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 从重复到重用
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • PostgreSQL之连接数修改
  • ​flutter 代码混淆
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • ​你们这样子,耽误我的工作进度怎么办?
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • #{} 和 ${}区别
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • (Note)C++中的继承方式
  • (二)c52学习之旅-简单了解单片机
  • (九十四)函数和二维数组
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (算法)Travel Information Center
  • (一) storm的集群安装与配置
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (转)shell调试方法
  • .cn根服务器被攻击之后
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .Net Remoting常用部署结构
  • .NET Standard 的管理策略
  • .net2005怎么读string形的xml,不是xml文件。
  • .net反混淆脱壳工具de4dot的使用
  • .NET中两种OCR方式对比
  • /*在DataTable中更新、删除数据*/
  • @property python知乎_Python3基础之:property
  • [ element-ui:table ] 设置table中某些行数据禁止被选中,通过selectable 定义方法解决