参考网站
官网:http://mp.baomidou.com
参考教程:http://mp.baomidou.com/guide/
一、简介
MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
-
润物无声
-
- 只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑。
-
效率至上
-
- 只需简单配置,即可快速进行 CRUD 操作,从而节省大量时间。
-
丰富功能
-
- 热加载、代码生成、分页、性能分析等功能一应俱全。
二、创建并初始化数据库
1、创建数据库
mybatis_plus
2、创建 User
表
其对应的数据库 Schema 脚本如下:
CREATE DATABASE `prod-server` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
use `prod-server`;
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)
);
其对应的数据库 Data 脚本如下:
INSERT INTO user (id, name, age, email) VALUES
(1, 'Jone', 18, 'test1@ccut.com'),
(2, 'Jack', 20, 'test2@ccut.com'),
(3, 'Tom', 28, 'test3@ccut.com'),
(4, 'Sandy', 21, 'test4@ccut.com'),
(5, 'Billie', 24, 'test5@ccut.com');
三、确认idea配置
1、打开配置
2、Java编译器
3、项目和文件的编码
4、Maven配置
四、创建项目
1、初始化工程
使用 Spring Initializr 快速初始化一个 Spring Boot 工程
Group:cn.qiang
Artifact:mybatis_plus
版本:2.7.5
2、引入依赖
**注意:**引入 MyBatis-Plus
之后请不要再次引入 MyBatis
,以避免因版本差异导致的问题。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.2</version>
</dependency>
<!--mysql运行时依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--lombok用来简化实体类-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- 代码生成器 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.31</version>
</dependency>
<!-- swagger -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
</dependencies>
3、idea中安装lombok插件
(1)idea2020 版本 默认安装
(2)idea2019版本
(3)idea2018版本
**五、编写代码 **
1、配置
在 application.properties
配置文件中添加 MySQL 数据库的相关配置:
spring boot 2.0(内置jdbc5驱动)
#mysql数据库连接
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus?characterEncoding=utf-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=123456
spring boot 2.1及以上(内置jdbc8驱动)
**注意:**driver和url的变化
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus?serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123456
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://216.127.254.155:3166/prod-server?serverTimezone=GMT%2B8&characterEncoding=utf-8
username: root
password: root
注意:
1、这里的 url 使用了 ?serverTimezone=GMT%2B8 后缀,因为8.0版本的jdbc驱动需要添加这个后缀,否则运行测试用例报告如下错误:
java.sql.SQLException: The server time zone value ‘Öйú±ê׼ʱ¼ä’ is unrecognized or represents more
2、这里的 driver-class-name 使用了 com.mysql.cj.jdbc.Driver ,在 jdbc 8 中 建议使用这个驱动,否则运行测试用例的时候会有 WARN 信息
2、主类
在 Spring Boot 启动类中添加 @MapperScan
注解,扫描 Mapper 文件夹
@SpringBootApplication
@MapperScan("cn.qiang")
public class MybatisPlusApplication {
......
}
3、实体
补充利用代码生成器
@Value("${spring.datasource.url}")
private String url;
@Value("${spring.datasource.username}")
private String userName;
@Value("${spring.datasource.password}")
private String password;
@Test
void contextLoadsTest() {
String projectPath = System.getProperty("user.dir")+"/src/main/java";
FastAutoGenerator.create(url, userName, password)
.globalConfig(builder -> {
builder.author("凡尔赛mo") // 设置作者
.enableSwagger() // 开启 swagger 模式
.fileOverride() // 覆盖已生成文件
.outputDir(projectPath); // 指定输出目录
})
.packageConfig(builder -> {
builder.parent("cn.qiang") // 设置父包名
.moduleName("practice") // 设置父包模块名
.pathInfo(Collections.singletonMap(OutputFile.xml, projectPath)); // 设置mapperXml生成路径
})
.strategyConfig(builder -> {
builder.addInclude("t_user") // 设置需要生成的表名
.addTablePrefix("t_", "c_")// 设置过滤表前缀
.controllerBuilder().enableRestStyle().enableHyphenStyle()
.entityBuilder().enableLombok().enableChainModel().addTableFills(
new Column("create_time", FieldFill.INSERT),
new Column("update_time", FieldFill.INSERT_UPDATE)
).build();
})
.templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
.execute();
}
@Resource
private UserMapper userMapper;
@Test
void contextLoadsTestMybatus() {
//UserMapper 中的 selectList() 方法的参数为 MP 内置的条件封装器 Wrapper
//所以不填写就是无任何条件
/* List<User> users = userMapper.selectList(null);
users.forEach(System.out::println);*/
}
@Test
void autocode() {
// 最开始是配置数据源,postgresql还得指定架构,这里我就指定了用test架构
FastAutoGenerator.create(new DataSourceConfig.Builder(url, userName, password))
// 全局配置
.globalConfig(builder -> {
builder.author("凡尔赛mo") // 设置作者
.enableSwagger() // 开启 swagger 模式(根据数据库的注释等生成swagger的注解,真的牛)
.fileOverride() // 覆盖已生成文件
.outputDir(System.getProperty("user.dir") + "/src/main/java") // 指定输出目录
.disableOpenDir() // 生成后不打开资源管理器
.dateType(DateType.ONLY_DATE) // 时间类型
.commentDate("yyyy-MM-dd hh:mm:ss"); // 时间格式
})
// 包配置,也就是生成哪些文件夹
.packageConfig(builder -> {
builder.parent("cn.qiang") // 设置父包名 也就是生成在输出目录的 com/yangsf下
.moduleName("mybatisplus") // 设置父包模块名 也就是代码放在com/yangsf/mybatisplus下
.pathInfo(Collections.singletonMap(OutputFile.xml, System.getProperty("user.dir")+"/src/main/resources/mapper")) // 设置mapperXml生成路径
.service("service") // 接下来的几个都是包名,也就是对应的代码的存放目录
.entity("entity")
.mapper("mapper")
.controller("controller")
.xml("mapper")
.other("utils");
})
// 策略配置
.strategyConfig(builder -> {
builder.addInclude("user") // 这里填数据库表名,可以填多个,用’,‘隔开
.addTablePrefix("ds_") // 忽略前缀
// mapper(dao)层的配置
.mapperBuilder()
.formatMapperFileName("%sMapper") // 生成的文件名都叫xxxmapper(根据表名)
.enableMapperAnnotation() //开启@mapper注解
.superClass(BaseMapper.class) // 继承BaseMapper类
.formatXmlFileName("%sMapper") // 生成对应的xml都叫xxxmapper
// service层配置
.serviceBuilder()
.formatServiceFileName("%sService")
.formatServiceImplFileName("%sServiceImpl")
// 实体类配置
.entityBuilder()
.idType(IdType.AUTO) // 主键的策略,我选的是自增
.enableLombok() //开启 Lombok
.enableChainModel()
/*
.disableSerialVersionUID() //不实现 Serializable 接口,不生产 SerialVersionUID
*/
.logicDeleteColumnName("deleted") //逻辑删除字段名
.naming(NamingStrategy.underline_to_camel) //数据库表映射到实体的命名策略:下划线转驼峰命
.columnNaming(NamingStrategy.underline_to_camel) //数据库表字段映射到实体的命名策略:下划线转驼峰命
.addTableFills(
new Column("create_time", FieldFill.INSERT),
new Column("update_time", FieldFill.INSERT_UPDATE)
) //添加表字段填充,"create_time"字段自动填充为插入时间,"modify_time"字段自动填充为插入修改时间,到时候需要编写具体的代码实现
.enableTableFieldAnnotation() // 开启生成字段注解
// controller层配置
.controllerBuilder()
.formatFileName("%sController") //格式化 Controller 类文件名称,%s进行匹配表名,如 UserController
.enableRestStyle(); //开启生成 @RestController 控制器
})
// 模板引擎配置 ,默认是Velocity
.templateEngine(new FreemarkerTemplateEngine())
.execute(); // 执行
}
创建包 entity 编写实体类 User.java(此处使用了 Lombok 简化代码)
@Data
public class User {
private Long id;
private String name;
private Integer age;
private String email;
}
查看编译结果
4、mapper
创建包 mapper 编写Mapper 接口: UserMapper.java
public interface UserMapper extends BaseMapper<User> {
}
5、测试
添加测试类,进行功能测试:
package cn.ccut.mybatis_plus;
@SpringBootTest
class MybatisPlusApplicationTests {
@Autowired
private UserMapper userMapper;
@Test
void testSelectList() {
//UserMapper 中的 selectList() 方法的参数为 MP 内置的条件封装器 Wrapper
//所以不填写就是无任何条件
List<User> users = userMapper.selectList(null);
users.forEach(System.out::println);
}
}
注意:
IDEA在 userMapper 处报错,因为找不到注入的对象,因为类是动态创建的,但是程序可以正确的执行。
为了避免报错,可以在 dao 层 的接口上添加 @Repository 注
通过以上几个简单的步骤,我们就实现了 User 表的 CRUD 功能,甚至连 XML 文件都不用编写!
查看控制台输出:
6、查看sql输出日志
#mybatis日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
mybatis-plus:
configuration:
# 查看sql输出日志
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl