十八,Spring Boot 整合 MyBatis-Plus 的详细配置
文章目录
- [十八,Spring Boot 整合 MyBatis-Plus 的详细配置](#十八,Spring Boot 整合 MyBatis-Plus 的详细配置)
- [1. MyBatis-Plus 的基本介绍](#1. MyBatis-Plus 的基本介绍)
- [2. Spring Boot 整合 MyBatis Plus 的详细配置](#2. Spring Boot 整合 MyBatis Plus 的详细配置)
- [3. Spring Boot 整合 MyBatis plus 注意事项和细节](#3. Spring Boot 整合 MyBatis plus 注意事项和细节)
- [4. MyBatisx 插件的安装和使用](#4. MyBatisx 插件的安装和使用)
-
- [4.1 MyBatisx 核心功能](#4.1 MyBatisx 核心功能)
-
- [4.1.1 XML 映射跳转](#4.1.1 XML 映射跳转)
- [4.1.2 代码生成](#4.1.2 代码生成)
- [4.1.3 重置模板](#4.1.3 重置模板)
- [4.1.4 JPA 风格提示](#4.1.4 JPA 风格提示)
- [4.1.5 生成的表名与预期不符?](#4.1.5 生成的表名与预期不符?)
- [5. 最后:](#5. 最后:)
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 的详细配置
- 准备数据库,和数据表。如下图所示:
sql
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);
- 我们导入相关的
jar
依赖。这里我们使用 Druid 数据库连接池。
对于 Mybatis-puls 相关的
jar
包,大家可以在:✏️✏️✏️ https://mvnrepository.com/找到所需要的版本。
这里我使用的是:3.4.3 的版本。
xml
<!-- 引入 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
依赖。
xml
<!-- 引入 druid 依赖-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.17</version>
</dependency>
完整的 pom.xml
的编写的 jar 依赖
xml
<?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>
- 编写对应 数据表的在Java当中对应的 Bean 对象。
特殊说明:
这里使用
@JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
注解。来设置数据表当中的时间赋值到该 Bean 对象上的时间属性的一个时间格式。
pattern = "yyyy-MM-dd"
是设置时间显示的格式样式timezone = "GMT+8"
是设置时区差。这里我们中国是东半球,时差为 + 8 个小时。需要注意的是:这个注解只对前端显示,有效果,后端,控制台显示无效。
- 将Spring Boot 默认的 HikariCP 数据库连接池,切换为我们想要的
Druid
数据库连接池。
这里我们通过配置类的方式,进行切换。
java
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 数据库连接池的信息。如下:
yaml
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 的打印显示日志信息的。
yamlmybatis-plus: configuration: # 进行mybatis-puls配置,配置项和mybatis是一样的 开启日志 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
完整的 application.yaml 的文件内容的编写。如下:
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
- 编写项目的场景启动器。
运行测试,我们是否成功切换为了,我们想要的 Duird 数据连接池,因为在 Spring Boot 当中测试的话,必须要编写好对应的项目启动器,不然,是无法测试的,会报错。同时也测试我们的 MyBatis puls 是否配置上去了。
java
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());
}
}
- 建一个mapper/dao 的包,在该包下创建一个名为
MonsterMapper
的接口,通过代理类的方式,在该接口下,编写我们要执行业务的 SQL 语句的方法。
java
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 加载的时候,会扫描这个类。从而找到这个类。这样我们就不需要额外的配置,包扫描了 。
运行测试:
java
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);
}
}
- 编写对应的 Severl 业务处理
首先编写接口。
java
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();
}
特别说明:
- 传统方式:在接口中定义方法/声明方法,然后在实现类中进行实现
- 在mybatis-plus中,我们可以继承父接口 IService
- 这个 IService 接口声明很多方法,比如crud。
4. 如果默认提供方法不能满足需要,我们可以再声明需要的方法,然后在实现类中进行实现即可。
在编写其接口的实现类:
java
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() {
}
}
特别说明,重点内容:
- 传统方式:在实现类中直接进行 implements MonsterService
- 在mybatis-puls 中,我们开发Service 实现类,需要继承
ServiceImpl
*
3. 我们观察看到 ServiceImpl 类实现 IService 接口,MonsterService 接口它继承了 IService 接口,这里MonsterServiceImpl 就可以认为是实现了 MonsterService接口,这样MonsterService就可以使用IService接口方法,也可以理解可以使用 MonsterService 方法。
4. 如果 MonsterService接口中,声明了其它的方法/自定义方法,那么我们依然需要在MonsterService类,进行实现 。
运行测试:
java
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);
}
}
}
- 编写对应的 Controller 控制器,在前端处理显示。
java
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 和 数据库表中的表名不一致,不能映射上。则可以通过
java
@TableName指定
@TableName("monster_") // 填数据库表当中定义的表名
我们在该 Bean 类上添加上
@TableName
注解。
@TableName("monster_")
value 值指明为:对应数据库当中的数据表,为那张数据表进行一个映射处理。
4. MyBatisx 插件的安装和使用
MybatisX 是一款专为 IntelliJ IDEA 设计的快速开发插件,旨在提升 MyBatis 与 MyBatis-Plus 框架的开发效率。
官网文档地址:https://baomidou.com/guides/mybatis-x/
安装:
- 打开 IntelliJ IDEA。
- 进入
File -> Settings -> Plugins -> Browse Repositories
。- 在搜索框中输入
mybatisx
。- 找到 MybatisX 插件并点击安装。
4.1 MyBatisx 核心功能
4.1.1 XML 映射跳转
MybatisX 提供了便捷的 XML 映射文件与 Java 接口之间的跳转功能,让开发者能够快速地在两者之间切换,提高开发效率。
4.1.2 代码生成
通过 MybatisX,您可以轻松地根据数据库表结构生成对应的 Java 实体类、Mapper 接口及 XML 映射文件。
4.1.3 重置模板
MybatisX 允许您重置代码生成模板,以恢复到默认设置或自定义模板内容。
4.1.4 JPA 风格提示
MybatisX 支持 JPA 风格的代码提示,包括新增、查询、修改和删除操作的自动代码生成。
- 生成新增操作
- 生成查询操作
- 生成修改操作
- 生成删除操作
4.1.5 生成的表名与预期不符?
MybatisX 根据以下规则确定表名:
- 实体类上的 JPA 注解,如:
@Table(name="t_user")
。 - 实体类上的 mybatis-plus 注解,如:
@TableName("t_user")
。 - 实体类上的注释,如:
@TableName com.xx.xx.UserModel
。 - 若以上规则均不满足,则将驼峰命名的类名转换为下划线命名,如:
UserModel
对应表名user_model
。
5. 最后:
"在这个最后的篇章中,我要表达我对每一位读者的感激之情。你们的关注和回复是我创作的动力源泉,我从你们身上吸取了无尽的灵感与勇气。我会将你们的鼓励留在心底,继续在其他的领域奋斗。感谢你们,我们总会在某个时刻再次相遇。"