本篇文章介绍SpringBoot + MyBatisPlus。本文中的部分代码来源于MyBatisPlus(MBP)的官网)。
IDE:IntelliJ IDEA 2019.3.3 ;
Java:jdk1.8;
Spring Boot:2.3.5.RELEASE
MySQL:8.0.15;
一、数据表准备
在你的数据库中准备如下表:
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)
);
然后向其中添加如下信息:
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');
表中将会插入如下信息:
二、引入依赖并配置
根据前面的文章快速搭建一个SpringBoot工程后,向其中的 pom.xml
中添加如下的依赖:
<!-- mybatis plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.2</version>
</dependency>
然后再 application.yml
文件中配置如下信息,主要是数据源信息:
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/springbootdb?serverTimezone=Asia/Shanghai&characterEncoding=utf-8
username: root
password: 123456
在启动类上配置 @MapperScan
注解,主动扫描mapper类,自动注入容器中。
三、业务代码
1)、实体类
实体类于数据表保持一致即可,这里用lombok简化编程:
@Data
@Builder
public class User {
private Long id;
private String name;
private Integer age;
private String email;
}
2)、dao接口
你没看错,就是这么简单!连xml文件都不需要编写甚至创建,只需要继承BaseMapper接口即可完成简单的CRUD操作,怎么样,是不是有回到Spring Data Jpa的感觉了。
public interface UserMapper extends BaseMapper<User> {}
四、测试
这里就简单把测试代码给出来了,结果就不展示了,和前面Jpa、MyBatis一样,CRUD的结果都大差不差的。
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserMapperTest {
@Resource
private UserMapper userMapper;
@Test
public void testInsertUser() {
User user = User.builder().id(6L).name("xiaohua").age(20).email("xiaohua@qq.com").build();
int count = userMapper.insert(user);
System.out.println(count);
}
@Test
public void testUpdateUser() {
User user = User.builder().id(1L).name("xiaohua2").age(20).email("xiaohua@qq.com").build();
int count = userMapper.updateById(user);
System.out.println(count);
}
@Test
public void testQueryUser() {
User user = userMapper.selectById(1L);
System.out.println(user);
}
@Test
public void testDeleteUser() {
int count = userMapper.deleteById(1L);
System.out.println(count);
}
}
五、MBP代码生成器
什么?你连controller、service都不想写了???没问题,AutoGenerator能够帮你解决这些问题。这里引用一段官网的原话:
AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。
简而言之就是AutoGenerator能帮自动生成大量固定代码,提高开发效率。
1、引入依赖
AutoGenerator 在MBP v3.0.3后就独立出去,使用需要单独引入jar包。
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.30</version>
</dependency>
2、编写自动生成代码
public class CodeGenerator {
public static void main(String[] args) {
AutoGenerator mpg = new AutoGenerator();
String projectPath = "I:/Java/Spring/springboot/springboot05-mybatisplus";
// 设置全局配置并注入mpg
GlobalConfig globalConfig = new GlobalConfig();
globalConfig.setOutputDir(projectPath + "/src/main/java");
globalConfig.setAuthor("mrxu");
globalConfig.setOpen(false);
mpg.setGlobalConfig(globalConfig);
// 设置数据源配置并注入mpg
DataSourceConfig dataSourceConfig = new DataSourceConfig();
dataSourceConfig.setUrl("jdbc:mysql://localhost:3306/springbootdb?serverTimezone=Asia/Shanghai&characterEncoding=utf-8");
dataSourceConfig.setDriverName("com.mysql.cj.jdbc.Driver");
dataSourceConfig.setUsername("root");
dataSourceConfig.setPassword("123456");
mpg.setDataSource(dataSourceConfig);
// 包配置
PackageConfig packageConfig = new PackageConfig();
packageConfig.setParent("org.mrxu2");
mpg.setPackageInfo(packageConfig);
// 自定义配置
InjectionConfig cfg = new InjectionConfig() {
@Override
public void initMap() {
// to do nothing
}
};
// 如果模板引擎是 freemarker
String templatePath = "/templates/mapper.xml.ftl";
// 自定义输出配置
List<FileOutConfig> focList = new ArrayList<>();
// 自定义配置会被优先输出
focList.add(new FileOutConfig(templatePath) {
@Override
public String outputFile(TableInfo tableInfo) {
// 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
return projectPath + "/src/main/resources/mapper/" + packageConfig.getModuleName()
+ "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
}
});
cfg.setFileOutConfigList(focList);
mpg.setCfg(cfg);
// 配置模板
TemplateConfig templateConfig = new TemplateConfig();
// 配置自定义输出模板
//指定自定义模板路径,注意不要带上.ftl/.vm, 会根据使用的模板引擎自动识别
templateConfig.setService("templates/service.java");
templateConfig.setServiceImpl("templates/serviceImpl.java");
templateConfig.setController("templates/controller.java");
templateConfig.setMapper("templates/mapper.java");
templateConfig.setEntity("templates/entity.java");
templateConfig.setXml(null);
mpg.setTemplate(templateConfig);
// 策略配置
StrategyConfig strategy = new StrategyConfig();
strategy.setNaming(NamingStrategy.underline_to_camel);
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
// 你自己的父类实体,没有就不用设置!
strategy.setSuperEntityClass("");
strategy.setEntityLombokModel(true);
strategy.setRestControllerStyle(true);
// 公共父类 你自己的父类控制器,没有就不用设置!
strategy.setSuperControllerClass("");
// 写于父类中的公共字段
strategy.setSuperEntityColumns("id");
// 设置表名,多个英文逗号分割
strategy.setInclude("user");
strategy.setControllerMappingHyphenStyle(true);
strategy.setTablePrefix(packageConfig.getModuleName() + "_");
mpg.setStrategy(strategy);
mpg.setTemplateEngine(new FreemarkerTemplateEngine());
mpg.execute();
}
}
代码中注释已经比较清楚了,这里划下重点:这段代码中除了路径和数据源配置外都可以使用默认的,然后最重要的是下面这部分代码。
// 配置模板
TemplateConfig templateConfig = new TemplateConfig();
// 配置自定义输出模板
//指定自定义模板路径,注意不要带上.ftl/.vm, 会根据使用的模板引擎自动识别
templateConfig.setService("templates/service.java");
templateConfig.setServiceImpl("templates/serviceImpl.java");
templateConfig.setController("templates/controller.java");
templateConfig.setMapper("templates/mapper.java");
templateConfig.setEntity("templates/entity.java");
templateConfig.setXml(null);
mpg.setTemplate(templateConfig);
这部分代码指明了模板所在位置,并根据模板生成相关代码。如果未配置这些模板,将只会生成文件夹。
这些模板也不用手动创建,在依赖包中已经存在,如果想自定义模板可以从依赖包中拷贝一份修改后再指定新路径即可。