十八,Spring Boot 整合 MyBatis-Plus 的详细配置


1. MyBatis-Plus 的基本介绍

MyBatis-Plus 官网文档:https://baomidou.com/

在这里插入图片描述

MyBatis-Plus 是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

在这里插入图片描述

MyBatis puls (简称 MP) 是一个Mybatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发,提供效率而生。

强大的CRUD操作:内置通用Mapper,通用 Service,通过少量配置即可实现单表大部分的CRUD操作,更有强大的条件构造器,满足各类使用需求

关于 MyBatis Plus 的更多详细内容,大家可以移步至✏️✏️✏️ MyBatis-Plus_ChinaRainbowSea的博客-CSDN博客

2. Spring Boot 整合 MyBatis Plus 的详细配置

  1. 准备数据库,和数据表。如下图所示:

在这里插入图片描述


CREATE DATABASE `springboot_mybatispuls`

USE `springboot_mybatispuls`


CREATE TABLE `monster` (
`id` int not null auto_increment,
`age` int not null,
`birthday` DATE DEFAULT NULL,
`email` VARCHAR(255) DEFAULT NULL,
`gender` CHAR(1) DEFAULT null,
`name` VARCHAR(255) DEFAULT NULL,
`salary` DOUBLE not NULL,
PRIMARY KEY(`id`)
)

SELECT * from monster



INSERT INTO  `monster` (`id`,`age` ,`birthday`,`email`,`gender`,`name`,`salary`) 
VALUES (1,20,'2000-10-10','nmw@sohu.com','男','牛魔王',9000.99);
INSERT INTO  `monster` (`id`,`age` ,`birthday`,`email`,`gender`,`name`,`salary`)
VALUES (2,10,'2000-12-12','bgj@sohu.com','女','白骨精',9999.99);

  1. 我们导入相关的 jar 依赖。这里我们使用 Druid 数据库连接池。

对于 Mybatis-puls 相关的 jar 包,大家可以在:✏️✏️✏️ https://mvnrepository.com/ 找到所需要的版本。

在这里插入图片描述

在这里插入图片描述

这里我使用的是:3.4.3 的版本。

<!--        引入 mybatis-puls starter-->
        <!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.3</version>
        </dependency>

在这里插入图片描述

引入 Druid 数据库的 jar 依赖。

在这里插入图片描述

<!--        引入 druid 依赖-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.17</version>
        </dependency>

完整的 pom.xml 的编写的 jar 依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.rainbowsea</groupId>
    <artifactId>springboot_mybatispuls</artifactId>
    <version>1.0-SNAPSHOT</version>




    <!--    导入SpringBoot 父工程-规定写法-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.3</version>
    </parent>

    <!--    导入web项目场景启动器:会自动导入和web开发相关的jar包所有依赖【库/jar】-->
    <!--    后面还会在说明spring-boot-starter-web 到底引入哪些相关依赖-->
    <dependencies>
        <!--        引入 web starter 依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>


        <!--        引入 mysql 驱动: 这里老师使用版本仲裁 8.0.26-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <!--        引入配置处理器-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
        </dependency>


        <!--引入lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <!--        引入 test stater -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>

        <!--        引入 druid 依赖-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.17</version>
        </dependency>

<!--        引入 mybatis-puls starter-->
        <!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.3</version>
        </dependency>

    </dependencies>

</project>
  1. 编写对应 数据表的在Java当中对应的 Bean 对象。

在这里插入图片描述

特殊说明:

这里使用 @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") 注解。来设置数据表当中的时间赋值到该 Bean 对象上的时间属性的一个时间格式。

  • pattern = "yyyy-MM-dd" 是设置时间显示的格式样式
  • timezone = "GMT+8" 是设置时区差。这里我们中国是东半球,时差为 + 8 个小时。

需要注意的是:这个注解只对前端显示,有效果,后端,控制台显示无效。

在这里插入图片描述

  1. 将Spring Boot 默认的 HikariCP 数据库连接池,切换为我们想要的 Druid 数据库连接池。

这里我们通过配置类的方式,进行切换。

在这里插入图片描述

package com.rainbowsea.springboot.mybatis.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;

@Configuration
public class DruidDataSourceConfig {


    @ConfigurationProperties(value = "spring.datasource")  // 读取 类路径下的application.yaml
    // 的信息,并为下面的 对应的 setXX 进行赋值操作
    @Bean
    public DataSource dataSource() {
        DruidDataSource druidDataSource = new DruidDataSource();

        return druidDataSource;

    }

}

在 resource 类路径下创建一个,名为 applicaiton.yaml 文件,配置编写,相关对于,Druid 数据库连接池的信息。如下:

在这里插入图片描述

server:
  port: 9090

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/springboot_mybatispuls?useSSL=true&useUnicode=true&characterEncoding=UTF-8
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: MySQL123


在这里插入图片描述

特别说明:我们还可以在 application.yaml 文件当中,配置一下,开启 Mybatis puls 的打印显示日志信息的。

mybatis-plus:
  configuration:  # 进行mybatis-puls配置,配置项和mybatis是一样的 开启日志
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

在这里插入图片描述

完整的 application.yaml 的文件内容的编写。如下:

server:
  port: 9090

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/springboot_mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: MySQL123


mybatis-plus:
  configuration:  # 进行mybatis-puls配置,配置项和mybatis是一样的 开启日志
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

  1. 编写项目的场景启动器。

在这里插入图片描述

运行测试,我们是否成功切换为了,我们想要的 Duird 数据连接池,因为在 Spring Boot 当中测试的话,必须要编写好对应的项目启动器,不然,是无法测试的,会报错。同时也测试我们的 MyBatis puls 是否配置上去了。

在这里插入图片描述

在这里插入图片描述

package com.rainbowsea.springboot.mybatisplus;


import com.rainbowsea.springboot.mybatispuls.Application;
import com.rainbowsea.springboot.mybatispuls.bean.Monster;
import com.rainbowsea.springboot.mybatispuls.mapper.MonsterMapper;
import com.rainbowsea.springboot.mybatispuls.service.MonsterService;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.jdbc.core.JdbcTemplate;

import javax.annotation.Resource;
import java.util.List;

@SpringBootTest(classes = Application.class)
public class ApplicationTest {

    @Resource
    private JdbcTemplate jdbcTemplate;



    @Test
    public void getDruidSourceTest() {
        System.out.println(jdbcTemplate.getDataSource().getClass());
    }



}

  1. 建一个mapper/dao 的包,在该包下创建一个名为 MonsterMapper 的接口,通过代理类的方式,在该接口下,编写我们要执行业务的 SQL 语句的方法。

在这里插入图片描述

package com.rainbowsea.springboot.mybatispuls.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.rainbowsea.springboot.mybatispuls.bean.Monster;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

/**
 * BaseMapper 已经默认提供了很多的crud 方法,可以直接使用
 * 如果BaseMapper 提供的方法不能满足业务需求,我们可以再开发新的方法,
 * 并在MonsterMapper.xml 进行配置 ===> 使用插件开发
 */


@Mapper
public interface MonsterMapper extends BaseMapper<Monster> {




}

特别说明:

BaseMapper 已经默认提供了很多的crud 方法,可以直接使用。

在这里插入图片描述

在这里插入图片描述

如果BaseMapper 提供的方法不能满足业务需求,我们可以再开发新的方法,就像使用 mybatis 一样,我们可以在 。

在这里插入图片描述

如果是: BaseMapper 当中的方法,我们就不需要自行编写对应 SQL 语句的 xml 文件内容了,当然,对于自定义的方法,我们也可以通过 Mybatisx 插件为我们自动生成对应的xml的SQL语句。

这里我们在该 接口类当中,使用了 @Mapper 注解。该注解的作用就是,让Spring Boot 加载的时候,会扫描这个类。从而找到这个类。这样我们就不需要额外的配置,包扫描了

运行测试:

在这里插入图片描述

package com.rainbowsea.springboot.mybatisplus;


import com.rainbowsea.springboot.mybatispuls.Application;
import com.rainbowsea.springboot.mybatispuls.bean.Monster;
import com.rainbowsea.springboot.mybatispuls.mapper.MonsterMapper;
import com.rainbowsea.springboot.mybatispuls.service.MonsterService;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.jdbc.core.JdbcTemplate;

import javax.annotation.Resource;
import java.util.List;

@SpringBootTest(classes = Application.class)
public class ApplicationTest {



    @Resource
    private MonsterMapper monsterMapper;

    @Test
    public void testMonsterMapper() {
        Monster monster = monsterMapper.selectById(2);
        System.out.println("monster--" + monster);
    }




}

在这里插入图片描述

  1. 编写对应的 Severl 业务处理

首先编写接口。

在这里插入图片描述

package com.rainbowsea.springboot.mybatispuls.service;


import com.baomidou.mybatisplus.extension.service.IService;
import com.rainbowsea.springboot.mybatispuls.bean.Monster;


/**
 * 1.传统方式:在接口中定义方法/声明方法,然后在实现类中进行实现
 * 2. 在mybatis-plus中,我们可以继承父接口 IService
 * 3. 这个 IService 接口声明很多方法,比如crud
 * 4. 如果默认提供方法不能满足需要,我们可以再声明需要的方法,然后在实现类中进行实现即可
 */

// 注意:接口不要添加 @Service
public interface MonsterService extends IService<Monster> {
    // 自定义方法
    public void t1();
}

特别说明:

  1. 传统方式:在接口中定义方法/声明方法,然后在实现类中进行实现
  2. 在mybatis-plus中,我们可以继承父接口 IService
  3. 这个 IService 接口声明很多方法,比如crud。

在这里插入图片描述

在这里插入图片描述

  1. 如果默认提供方法不能满足需要,我们可以再声明需要的方法,然后在实现类中进行实现即可。

在这里插入图片描述

在编写其接口的实现类:

在这里插入图片描述

在这里插入图片描述

package com.rainbowsea.springboot.mybatispuls.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;

import com.rainbowsea.springboot.mybatispuls.bean.Monster;
import com.rainbowsea.springboot.mybatispuls.mapper.MonsterMapper;
import com.rainbowsea.springboot.mybatispuls.service.MonsterService;
import org.springframework.stereotype.Service;


/**
 * 1. 传统方式:在实现类中直接进行implements MonsterService
 * 2. 在mybatis-puls 中,我们开发Service 实现类,需要继承 ServiceImpl
 * 3. 我们观察看到 ServiceImpl 类实现 IService 接口
 * 4. MonsterService 接口它继承了 IService 接口
 * 5. 这里MonsterServiceImpl 就可以认为是实现了 MonsterService接口,这样MonsterService
 * 就可以使用IService接口方法,也可以理解可以使用 MonsterService 方法
 * 6. 如果 MonsterService接口中,声明了其它的方法/自定义方法,那么我们依然需要在MonsterService
 * 类,进行实现
 */

@Service
public class MonsterServiceImpl
    extends ServiceImpl<MonsterMapper, Monster>
        implements MonsterService {


    @Override
    public void t1() {

    }
}

特别说明,重点内容:

  1. 传统方式:在实现类中直接进行 implements MonsterService
  2. 在mybatis-puls 中,我们开发Service 实现类,需要继承 ServiceImpl

在这里插入图片描述

在这里插入图片描述

    1. 我们观察看到 ServiceImpl 类实现 IService 接口,MonsterService 接口它继承了 IService 接口,这里MonsterServiceImpl 就可以认为是实现了 MonsterService接口,这样MonsterService就可以使用IService接口方法,也可以理解可以使用 MonsterService 方法。

    在这里插入图片描述

在这里插入图片描述

  1. 如果 MonsterService接口中,声明了其它的方法/自定义方法,那么我们依然需要在MonsterService类,进行实现 。

运行测试:

在这里插入图片描述

package com.rainbowsea.springboot.mybatisplus;


import com.rainbowsea.springboot.mybatispuls.Application;
import com.rainbowsea.springboot.mybatispuls.bean.Monster;
import com.rainbowsea.springboot.mybatispuls.mapper.MonsterMapper;
import com.rainbowsea.springboot.mybatispuls.service.MonsterService;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.jdbc.core.JdbcTemplate;

import javax.annotation.Resource;
import java.util.List;

@SpringBootTest(classes = Application.class)
public class ApplicationTest {


    @Resource
    private MonsterService monsterService;


    @Test
    public void testMonsterService() {
        Monster monster = monsterService.getById(2);
        System.out.println(monster);

        // 这些 List 都是 monsterService 继承 IService 当中的方法
        List<Monster> list = monsterService.list();

        for (Monster monster1 : list) {
            System.out.println(monster1);
        }
    }




}

在这里插入图片描述

  1. 编写对应的 Controller 控制器,在前端处理显示。

在这里插入图片描述

在这里插入图片描述

package com.rainbowsea.springboot.mybatispuls.controller;



import com.rainbowsea.springboot.mybatispuls.bean.Monster;
import com.rainbowsea.springboot.mybatispuls.service.MonsterService;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.annotation.Resource;
import java.util.List;

@Controller
public class MonsterController {

    @Resource
    private MonsterService monsterService;

    // 方法,根据id 返回对应对象
    @ResponseBody
    @GetMapping("/monster")
    public Monster getMonsterById(@RequestParam(value = "id") Integer id) {
        return monsterService.getById(id);
    }

    // 编写方法,返回所有的monster信息
    // 后面我们还会说分页查询
    @GetMapping("/list")
    @ResponseBody
    public List<Monster> listMonster() {
        return monsterService.list();
    }


}

运行测试:注意:我们这里配置的端口是9090,并不是8080。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3. Spring Boot 整合 MyBatis plus 注意事项和细节

如果这个Java当中的类名 Monster 和 数据库表中的表名不一致,不能映射上。则可以通过

@TableName指定
@TableName("monster_") // 填数据库表当中定义的表名

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

我们在该 Bean 类上添加上 @TableName 注解。

@TableName("monster_") value 值指明为:对应数据库当中的数据表,为那张数据表进行一个映射处理。

在这里插入图片描述

在这里插入图片描述


4. MyBatisx 插件的安装和使用

MybatisX 是一款专为 IntelliJ IDEA 设计的快速开发插件,旨在提升 MyBatis 与 MyBatis-Plus 框架的开发效率。

官网文档地址:https://baomidou.com/guides/mybatis-x/

安装:

  1. 打开 IntelliJ IDEA。
  2. 进入 File -> Settings -> Plugins -> Browse Repositories
  3. 在搜索框中输入 mybatisx
  4. 找到 MybatisX 插件并点击安装。
  5. 在这里插入图片描述

4.1 MyBatisx 核心功能

4.1.1 XML 映射跳转

MybatisX 提供了便捷的 XML 映射文件与 Java 接口之间的跳转功能,让开发者能够快速地在两者之间切换,提高开发效率。

XML 跳转示例

4.1.2 代码生成

通过 MybatisX,您可以轻松地根据数据库表结构生成对应的 Java 实体类、Mapper 接口及 XML 映射文件。

代码生成示例

4.1.3 重置模板

MybatisX 允许您重置代码生成模板,以恢复到默认设置或自定义模板内容。

重置模板示例

4.1.4 JPA 风格提示

MybatisX 支持 JPA 风格的代码提示,包括新增、查询、修改和删除操作的自动代码生成。

  • 生成新增操作生成新增示例
  • 生成查询操作生成查询示例
  • 生成修改操作生成修改示例
  • 生成删除操作生成删除示例

4.1.5 生成的表名与预期不符?

MybatisX 根据以下规则确定表名:

  1. 实体类上的 JPA 注解,如:@Table(name="t_user")
  2. 实体类上的 mybatis-plus 注解,如:@TableName("t_user")
  3. 实体类上的注释,如:@TableName com.xx.xx.UserModel
  4. 若以上规则均不满足,则将驼峰命名的类名转换为下划线命名,如:UserModel 对应表名 user_model

5. 最后:

“在这个最后的篇章中,我要表达我对每一位读者的感激之情。你们的关注和回复是我创作的动力源泉,我从你们身上吸取了无尽的灵感与勇气。我会将你们的鼓励留在心底,继续在其他的领域奋斗。感谢你们,我们总会在某个时刻再次相遇。”

在这里插入图片描述

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐