更多精彩内容,请访问 Spring Boot组件集成实战专栏 !
文章目录
- 1. MyBatis-Plus产生的原因
- 2. MyBatis-Plus解决的问题
- 3. Spring Boot集成Druid
- 2.1 引入依赖
- 2.2 配置application.yml
- 4. Spring Boot集成MyBatis-Plus
- 4.1 引入依赖
- 4.2 配置application.yml
- 4.3 配置启动器、分页插件
- 5. 集成MP代码生成器
-
- 6. 单元测试
- 6.1 测试基本的增删改查
- 6.2 测试分页查询
- 6.3 自定义查询
- 7. 本文源码下载
1. MyBatis-Plus产生的原因
一个技术的出现,必然有它的道理。
提起基于Web的项目框架,都会想到SSM
,是由Spring+MyBatis
框架整合而成的原始Web项目框架。
其中的MyBatis
是一种操作数据库的框架,使用XML
描述符或注释,将对象与存储过程或SQL
语句耦合,将关系型数据库与面向对象应用程序结合使用变得更加容易。其支持定制化SQL
、存储过程,以及高级映射。
而MyBatis
本身存在些许不足,比如配置文件繁多,以及当编写一个业务逻辑时,需要在Dao层写一个方法,再写一个与之对应的SQL语句。
所以,针对这些不足,一个MyBatis
的增强工具,MyBatis-Plus
就产生了。
当然,MyBatis
的增强工具,除了MyBatis-Plus
,还有TK.Mybatis
等。
2. MyBatis-Plus解决的问题
在MyBatis-Plus
官网,是这样介绍MP的:
MyBatis-Plus
是一个 MyBatis
的增强工具,在 MyBatis
的基础上只做增强不做改变,为简化开发、提高效率而生。
MP官网:https://mp.baomidou.com
MyBatis-Plus
的简称是 MP
,后文中,我们可能会过多使用此简称。
MP
除了解决MyBatis
的些许不足外,还具有如下特性。
接下来,详细讲述如何在Spring Boot
项目中集成MP
。
3. Spring Boot集成Druid
Druid 是阿里巴巴开源平台上的一个项目,整个项目由数据库连接池、插件框架和 SQL 解析器组成。该项目主要是为了扩展 JDBC 的一些限制,可以让程序员实现一些特殊的需求,比如向密钥服务请求凭证、统计 SQL 信息、SQL 性能收集、SQL 注入检查、SQL 翻译等,程序员可以通过定制来实现自己需要的功能。
Druid 是目前最好的数据库连接池,在功能、性能、扩展性方面,都超过其他数据库连接池,包括 DBCP、C3P0、BoneCP、Proxool、JBoss DataSource。Druid 已经在阿里巴巴部署了超过 600 个应用,经过多年生产环境大规模部署的严苛考验。Druid 是阿里巴巴开发的号称为监控而生的数据库连接池!
2.1 引入依赖
首先在 pom.xml
文件中引入 druid-spring-boot-starter
依赖:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.6</version>
</dependency>
获取druid-spring-boot-starter
依赖的其他版本,请访问:https://mvnrepository.com/artifact/com.alibaba/druid-spring-boot-starter
然后引入数据库连接 mysql-connector-java
依赖:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
引入结果如下图所示。
通常情况下,增删改
依赖项后,IDEA会自动做相应的加载。
如果未加载,可手动刷新
依赖,如下图所示。
2.2 配置application.yml
在 application.yml
文件中,增加如下配置信息。
spring:
datasource:
druid:
url: jdbc:mysql://127.0.0.1:3306/db_study_mp?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
username: root
password: 123456
initial-size: 1
min-idle: 1
max-active: 20
test-on-borrow: true
driver-class-name: com.mysql.cj.jdbc.Driver
这里需要注意:
配置结果如下图所示。
至此,项目已经集成了Druid
。
4. Spring Boot集成MyBatis-Plus
4.1 引入依赖
在 pom.xml
文件中引入 mybatis-plus-boot-starter
依赖,这是MP的核心依赖。
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3.2</version>
</dependency>
获取mybatis-plus-boot-starter
依赖的其他版本,请访问:https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter
4.2 配置application.yml
在 application.yml
文件中,增加如下配置信息。
mybatis-plus:
mapper-locations: classpath*:/mapper/**/**Mapper.xml
typeAliasesPackage: com.cxhit.mybatisplus.system.entity;
configuration:
map-underscore-to-camel-case: true
auto-mapping-behavior: full
cache-enabled: false
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
global-config:
db-config:
id-type: auto
table-underline: true
logic-delete-value: 1
logic-not-delete-value: 0
此配置的详细说明,注释已经标明,这里不再赘述。
只需要注意 typeAliasesPackage
处,要填写系统实体的包路径。多个包下的实体,可以使用英文分号
或英文逗号
间隔。
关于逻辑删除,将在测试部分演示。
配置结果如下图所示。
4.3 配置启动器、分页插件
1、增加包扫描路径
首先在启动类 ExciteCmsApplication
中增加包扫描的路径。
@MapperScan({"com.cxhit.mybatisplus.system.mapper", ""})
如果有多个包,可以根据此格式,继续追加。
添加后的结果,如下图所示。
2、添加分页插件配置信息
在 config
包下,新建一个名为 MybatisPlusConfig
的 java class
文件,并写入如下配置信息。
package com.cxhit.mybatisplus.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@MapperScan({"com.cxhit.mybatisplus.mapper", ""})
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
如下图所示。
至此,项目已集成MP。
5. 集成MP代码生成器
5.1 引入依赖
在 pom.xml
文件中引入 mybatis-plus-generator
依赖,这是代码生成器的核心依赖。
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
获取mybatis-plus-boot-starter
依赖的其他版本,请访问:https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-generator
注:如果使用的MP代码生成器
版本大于 3.4.1
,如使用3.5.1
版本,请 点击此处 查看最新版使用示例!
5.2 完善并修改生成器
在测试文件夹
下,新建一个名为 CodeGenerator
的 java class
文件,如下图所示。
然后在项目 CodeGenerator
类中,写入如下代码。
package com.cxhit.mybatisplus;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class CodeGenerator {
private static String scanner(String tip) {
Scanner scanner = new Scanner(System.in);
StringBuilder help = new StringBuilder();
help.append("请输入").append(tip).append(":");
System.out.println(help.toString());
if (scanner.hasNext()) {
String ipt = scanner.next();
if (StringUtils.isNotBlank(ipt)) {
return ipt;
}
}
throw new MybatisPlusException("请输入正确的" + tip + "!");
}
public static void main(String[] args) {
AutoGenerator mpg = new AutoGenerator();
String projectPath = System.getProperty("user.dir") + "/study-mybatis-plus";
GlobalConfig globalConfig = new GlobalConfig();
globalConfig
.setOutputDir(projectPath + "/src/main/java")
.setAuthor("拾年之璐")
.setOpen(false)
.setIdType(IdType.AUTO)
.setFileOverride(false)
.setBaseResultMap(true)
.setBaseColumnList(true);
mpg.setGlobalConfig(globalConfig);
DataSourceConfig dsConfig = new DataSourceConfig();
dsConfig
.setUrl("jdbc:mysql://localhost:3306/db_study_mp?useUnicode=true&serverTimezone=UTC&useSSL=false&characterEncoding=utf8")
.setDbType(DbType.MYSQL)
.setDriverName("com.mysql.cj.jdbc.Driver")
.setUsername("chen")
.setPassword("123456");
mpg.setDataSource(dsConfig);
PackageConfig pkConfig = new PackageConfig();
pkConfig.setModuleName(scanner("模块名(系统端建议system,客户端建议client)"));
pkConfig.setParent("com.cxhit.mybatisplus")
.setEntity("entity")
.setXml("mapper")
.setMapper("mapper")
.setService("service")
.setServiceImpl("service.impl")
.setController("controller");
mpg.setPackageInfo(pkConfig);
InjectionConfig cfg = new InjectionConfig() {
@Override
public void initMap() {
}
};
String templatePath = "/templates/mapper.xml.ftl";
List<FileOutConfig> focList = new ArrayList<>();
focList.add(new FileOutConfig(templatePath) {
@Override
public String outputFile(TableInfo tableInfo) {
return projectPath + "/src/main/resources/mapper/" + pkConfig.getModuleName()
+ "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
}
});
cfg.setFileOutConfigList(focList);
mpg.setCfg(cfg);
TemplateConfig templateConfig = new TemplateConfig();
templateConfig.setXml(null);
mpg.setTemplate(templateConfig);
StrategyConfig strategyConfig = new StrategyConfig();
strategyConfig
.setNaming(NamingStrategy.underline_to_camel)
.setColumnNaming(NamingStrategy.underline_to_camel)
.setEntityLombokModel(false)
.setInclude(scanner("表全名,多个英文名称,使用英文逗号间隔").split(","))
.setControllerMappingHyphenStyle(true);
mpg.setStrategy(strategyConfig);
mpg.setTemplateEngine(new FreemarkerTemplateEngine());
mpg.execute();
}
}
如果报错,请检查导入的包
是否一致。
代码中已经给出了详细的注释
。
你需要仔细逐行阅读
,将需要修改的地方(比如作者、数据库名、包路径等信息),修改为自己的项目信息。
在执行代码生成器
之前,我们在测试数据库
中创建了一个名为sys_user
的表单,其内容如下。
此数据库的SQL脚本,在文末的源代码中。
然后点击下图所示的运行
按钮,即可执行代码生成器。
然后根据控制台
的提示,输入相应的信息。
回车键后,即可看到生成文件的日志信息
,如下图所示。
生成的6个文件
详情如下图所示。
至此,项目已集成代码生成器。
如果项目是分模块,则可以使用上图左下角的CodeGeneratorMultiModule
代码生成器,其有详细的配置。
6. 单元测试
接下来通过测试类
,对前文集成的数据库连接池
和MP
进行测试。
首先进入前文创建的ISysUserService
服务接口类中,光标
放置在 ISysUserService
接口名上,按 Alt+Enter
,选择 Create Test
选项,如下图所示。
新弹窗直接点击 OK
即可。
这时,在测试文件夹
下,系统为我们新建了一个测试类
,如下图所示。
以下测试均写在此测试文件中。
6.1 测试基本的增删改查
我们可以从 mapper
层或者service
层进行测试,如下图所示。
如果mapper
层提示Could not autowire. No beans of 'SysUserMapper' type found.
,可以通过为mapper
接口添加 @Repository
注解解决此提示。
如果不添加此注解,虽然有红线提示
,但也可以运行,请自行测试。
接下来,通过几个测试方法
,对基本的增删改查
进行测试。
1、添加一条数据
编写方法如下。
@Test
void createOneTest() {
SysUser user = new SysUser();
user.setNickname("测试用户名");
user.setEmail("10066@domain.com");
user.setPassword("sfdnfjdsfhdsjk");
user.setIsDelete(0);
if (userService.save(user)) {
System.out.println("新增用户成功");
System.out.println(user);
} else {
System.out.println("新增用户失败");
}
}
点击方法左侧的执行
按钮,即可进行测试运行
,控制台输出信息如下图所示。
2、添加一系列数据
编写方法如下。
@Test
void createListTest() {
List<SysUser> userList = new ArrayList<>();
for (int i = 101; i <= 105; i++) {
SysUser user = new SysUser();
user.setNickname("用户" + i);
user.setEmail("10" + i + "@domain.com");
user.setPassword(DigestUtils.md5DigestAsHex(("password" + i).getBytes()));
userList.add(user);
}
System.out.println(userList);
if (userService.saveBatch(userList)) {
System.out.println("新增用户成功");
} else {
System.out.println("新增用户失败");
}
}
执行此方法,输出结果如下图所示。
3、修改一条数据
我们将上图中id
为10018
的用户名
修改为李四
。
编写代码如下。
@Test
void updateOneTest() {
SysUser user = new SysUser();
user.setId(10018);
user.setNickname("李四");
if (userService.updateById(user)) {
System.out.println("修改用户信息成功");
} else {
System.out.println("修改用户信息失败");
}
}
执行此方法,输出结果如下图所示。
4、删除一条数据
我们这里测试一下逻辑删除
。
本文 4.2节 配置MP的application.yml
处,已经开启了逻辑删除
。
首先修改 SysUser
实体,在 isDelete
字段上,增加 @TableLogic
注解,如下图所示。
然后编写删除的测试方法如下。
@Test
void logicDeleteTest() {
if (userService.removeById(10018)) {
System.out.println("删除成功");
} else {
System.out.println("删除失败");
}
}
执行此方法,输出结果如下图所示。
我们可以看到,其执行的是Update
语句。
5、查询一条数据
前文我们删除了ID=10018
的数据。我们执行查询该ID,测试代码如下。
@Test
void getOneTest() {
SysUser user = userService.getById(10018);
if (null != user) {
System.out.println(user);
} else {
System.out.println("查无此用户");
}
}
执行此方法,输出结果如下图所示。
我们可以看到,其执行的SQL语句,末尾自动追加了判断条件。
6.2 测试分页查询
编写分页测试的代码如下。
@Test
void pageTest() {
Page<SysUser> userPage = userService.page(new Page<>(1, 5), null);
List<SysUser> userList = userPage.getRecords();
System.out.println(userList);
System.out.println("当前页:" + userPage.getCurrent());
System.out.println("当前页显示条数:" + userPage.getSize());
System.out.println("总数:" + userPage.getTotal());
}
执行此方法,输出结果如下图所示。
6.3 自定义查询
更多复杂的查询,需要使用QueryWrapper
,其中部分示例,放在本文的项目源码中了,这里就不再赘述。
7. 本文源码下载
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)