MP1️⃣简介 & 环境搭建
1、MyBatis Plus
MyBatis-Plus
(简称 MP
)是一个基于 MyBatis
的增强工具,为简化开发、提高效率而生。
1.1、特点
- 无侵入:在 MyBatis 基础上只做增强不做改变,不影响现有工程。
- 损耗小:自动注入基本 CRUD,性能基本无损耗,直接面向对象操作。
- 支持多种数据库:MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等。
1.2、强大的 CRUD 操作
- 内置通用 Mapper、通用 Service。
- 通过少量配置实现单表基本 CRUD 操作,强大的条件构造器(Wrapper)满足各类使用需求。
- 支持 Lambda:通过方法引用,简化查询条件的书写,避免硬编码。
1.3、强大功能支持
- 主键自动生成:支持 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置。
- ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作。
- 自定义全局通用操作:支持全局通用方法注入(Write once, use anywhere)。
1.4、内置插件
- 代码生成器:采用代码或 Maven 插件可快速生成 Mapper、Model、Service、Controller 层代码,支持模板引擎,自定义配置。
- 分页插件:基于物理分页(
LIMIT
),仅需配置分页拦截器并调用相应方法。 - 性能分析插件:可输出 SQL 语句以及其执行时间,建议开发测试时启用该功能,能快速定位慢查询。
- 全局拦截插件:提供全表 delete、update 操作智能分析阻断,也可自定义拦截规则,预防误操作。
2、环境搭建(❗)
基于
Spring Boot
开发
示例:User(id, name, password, age)
- 创建数据库表
- 搭建 Spring Boot 项目
- 配置
- 创建实体类
- 编写 DAO
2.1、数据库表
为便于学习,没有考虑设计规范(如:区分业务/逻辑主键,create_time,update_time)
主键、用户名、密码、年龄
CREATE TABLE `mp_user` (
`id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键',
`name` VARCHAR(16) NOT NULL COMMENT '用户名',
`password` VARCHAR(32) NOT NULL COMMENT '密码',
`age` INT(3) NOT NULL COMMENT '年龄',
PRIMARY KEY (`id`)
);
2.2、Spring Boot 项目
-
创建项目:若创建失败,修改此处的 service URL 为
https://start.springboot.io
-
选择项目存放路径,
Finish
-
导入依赖: MySQL、MyBatis Plus、Druid 数据源、Lombok
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.1</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.8</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency>
Hint:MP 依赖会自动导入:
MyBatis
、MyBatis整合Spring
不要手动导入这 2 个依赖,避免(版本)冲突。
2.3、配置
application.yml
-
数据源配置:驱动名,URL,账号密码,连接池类型
-
MP 配置:
-
configuration(在
mybatis
或mybatis-plus
下配置都可)- 命名风格映射:将数据库表的下划线命名风格,映射为 Java 的小驼峰命名风格。
- 日志:便于调试。
-
global-config:数据库配置 - 表前缀(见 3.3 说明)。
spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/数据库名?参数 username: 账号 password: 密码 type: com.alibaba.druid.pool.DruidDataSource mybatis-plus: configuration: map-underscore-to-camel-case: true log-impl: org.apache.ibatis.logging.stdout.StdOutImpl global-config: db-config: table-prefix: t_
-
2.4、实体类
indi/jaywee/entity
ORM 原则:实体类与数据库表的属性(字段)名、类型对应。
@Data
// @tableName("mp_user")
public class User {
private Long id;
private String name;
private String password;
private int age;
}
2.5、DAO
2.5.1、DAO 接口
Hint:继承 BaseMapper<E>,泛型表示要操作的实体。
public interface UserDao extends BaseMapper<User>{
}
不需要编写 Mapper.xml 和 SQL,此时 UserDao 已获得 CRUD 功能。
2.5.2、注册
两种方式
-
在 Dao 接口上添加
@Mapper
注解,前提是 Dao 接口位于 Spring Boot 启动类的同级包或子包下。@Mapper public interface UserDao extends BaseMapper<User>{ }
-
在 Spring Boot 启动类上添加
@MapperScan
注解,指定 Dao 接口所在包(建议)。@SpringBootApplication @MapperScan("indi.jaywee.dao") public class MpApplication { public static void main(String[] args) { SpringApplication.run(MpApplication.class, args); } }
此时 UserDao 已被 Spring 容器托管。
3、说明
3.1、Spring Boot
-
创建失败:修改 service URL。
https://start.springboot.io
-
版本兼容:版本过高可能导致驱动报错,降低版本。
-
依赖冲突:引入 MP 依赖后不要手动导入 MyBatis 和 mybatis-spring 依赖,避免版本冲突。
3.2、MySQL
-
MySQL 8 + 时区问题:追加 URL 属性(serverTimeZone),或修改 MySQL 配置文件(my.ini)
-
驱动名
// MySQL 8- com.mysql.jdbc.Driver // MySQL 8+ com.mysql.cj.jdbc.Driver
3.3、映射问题(❗)
3.3.1、表名
MP
默认将实体类名的首字母小写作为表名。实际业务中,数据库表名通常带有自定义前缀(如
t_
,sys_
等)
两种配置方式:
-
全局配置:核心配置类中添加
table-prefix
属性,在首字母小写的基础上添加前缀。mybatis-plus: global-config: db-config: table-prefix: t_
-
个别配置:实体类上添加
@TableName
注解,指定具体表名。@tableName("t_user") public class User { }
3.3.2、字段
entity 和 数据库表的字段命名风格
- entity:小驼峰命名
- 数据库表:下划线分隔
两种配置方式
-
自动映射:
application.yml
配置,自动映射字段命名风格。mybatis-plus: configuration: map-underscore-to-camel-case: true
-
手动配置:属性上添加
@TableField
注解,指定具体字段名。@TableField("xxx")
3.3.3、@TableField
常用属性
-
value:字段名
-
exist:是否为数据库字段
- 由于业务需要,entity 中可能定义了数据库表不存在的字段。
- 为了避免 MP 查询时找不到该字段而导致报错,需要添加该注解。
-
select:是否被查询
-
MP 默认会查询所有字段(
SELECT *
) -
处于安全/权限考虑,部分字段(如密码)不应被查询。
@TableField(select = false) private String password;
-