一,介绍
MyBatis-Plus 是 MyBatis 的一个增强工具,旨在简化 MyBatis 的开发流程并提供更多功能特性。它为开发者提供了更高效、简便的开发体验,以下是 MyBatis-Plus 的一些主要特点和功能:
主要特点:
- 无侵入性:MyBatis-Plus 在增强 MyBatis 的功能的同时,不对其原有功能进行侵入,使得开发者可以无缝地将其集成到现有项目中。
- 丰富的 CRUD 操作:提供了一系列便捷的 CRUD 操作方法,包括批量插入、批量删除、批量更新等,减少了重复代码的编写。
- 代码生成器:支持代码生成,可以根据数据库表生成实体类、Mapper 接口、Service 接口及实现类、Controller 类等,极大提高了开发效率。
- 条件构造器:提供了多种条件构造器,用于动态构建查询条件,使得复杂查询变得更加简单直观。
- 分页插件:内置分页插件,支持多种数据库的分页查询,并且可以方便地与前端分页组件集成。
- 性能优化插件:包括 SQL 执行分析插件、全表更新与删除阻断插件等,帮助开发者在开发过程中发现潜在的性能问题和风险操作。
主要功能:
- 通用 Mapper:提供了一些通用的 CRUD 方法,如
insert、deleteById、updateById、selectById等,减少了 Mapper 接口中重复代码的编写。 - 条件构造器:通过
Wrapper类,开发者可以使用链式调用的方式构建复杂的查询条件,例如QueryWrapper、UpdateWrapper等。 - 自动填充:支持数据库字段的自动填充,如插入时的创建时间、更新时间等,通过注解可以轻松实现。
- 逻辑删除:提供逻辑删除功能,可以通过配置实现对记录的逻辑删除,而不是物理删除。
- 乐观锁:支持乐观锁机制,通过版本号控制并发更新,防止数据被覆盖。
- 多租户:支持多租户功能,通过拦截器实现不同租户的数据隔离。
**多租户(Multi-Tenancy)是指在同一个系统或应用程序中,为多个客户(租户)提供隔离的数据和配置环境。**每个租户的数据和操作彼此独立,不会相互影响。多租户架构在SaaS(Software as a Service)应用中非常常见,能够让多个客户共享同一个应用程序和数据库,同时保证数据的安全性和隔离性。
二,快速入门
-
导包(这个依赖集成了mybatis和mybatis-plus两个包)
<!--这个是SpringBoot2的--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.7</version> </dependency> <!--这个是SpringBoot3的--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-spring-boot3-starter</artifactId> <version>3.5.7</version> </dependency> -
编写配置文件(和mybatis的区别就是前面是mybatis-plus)
spring: datasource: username: root password: 123456 url: jdbc:mysql://localhost:33.6/mytest?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true driver-class-name: com.mysql.cj.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource mybatis-plus: #开启类别命名自动扫描 typeAliasesPackage: com.normaling.**.domain #开启mapper扫描路径 mapperLocations: classpath*:mapper/**/*Mapper.xml configuration: #指定mybatis日志输出的位置,这里是输出到控制台 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #开启小驼峰命名转换。将column=a_column--->aColumn map-underscore-to-camel-case: true -
创建数据库表
DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( id BIGINT NOT NULL COMMENT '主键ID', name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名', age INT 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'); -
创建数据库表对应的java对象
@Data public class User { private Long id; private String name; private Integer age; private String email; } -
自定义Mapper接口集成MybatisPlus提供的BaseMapper,里面的泛型类型,就是我们数据库映射的java对象。
@Mapper public interface UserMapper extends BaseMapper<User> { } -
在测试类中测试方法
@SpringBootTest(classes=SpringBootMyTestDemoApplication.class) public class UserDaoTest { @Autowired private UserMapper userMapper; @Test public void testSelect() { System.out.println(("----- selectAll method test ------")); List<User> userList = userMapper.selectList(null); Assert.isTrue(5 == userList.size(), ""); userList.forEach(System.out::println); } }
三,常用注解
如果我们的java类遵顼上述约定,就不需要加注解,如果不遵循,需要按照如下注解手动指定字段和属性的映射。
MybatisPlus中比较常见的注解:
-
@TableName:指定表名 -
@TableId:指定表的主键@TableId属性:- value:用来映射这个字段与表字段
- type:用来指定数据库表id插入时的策略,通过IdType的枚举类来指定,内容为:
AUTO:数据库自增,如果我们表字段也是自增长,需要这边手动指定一下。要不然默认采用雪花算法的idINPUT:通过SET方法手动输入ASSIGN_ID:分配ID,接口IdentifierGenerator方法nextId来生成id,默认实现类为:DefaultIdentifierGenerator雪花算法。ASSIGN_UUID,根据UUID来生成ID
-
@TableFiled:指定表的普通字段,使用它的情况:- 成员变量名与数据库字段名不一致
- 成员变量名以is开头,且是布尔值
- 成员变量名与数据库关键字冲突,例如:order需要加上转义字符,例如:@TableField("order`")
- 如果成员变量不是数据库字段,需要特殊处理:
@TableField(exist=false)
举例:
@TableName("user")
public class User {
@TableId(value="id",type= IdType.ASSIGN_ID)
private Long id;
@TableField("name")
private String name;
@TableField("age")
private Integer age;
@TableField("email")
private String email;
}
四,常用配置
我们在配置yml文件的时候,mybatis-plus和mybatis保持一致,是在mybatis的基础上扩展了配置
mybatis-plus:
#开启类别命名自动扫描
type-aliases-package: com.normaling.**.domain
#开启mapper扫描路径
mapper-locations: classpath*:mapper/**/*Mapper.xml
configuration:
#指定mybatis日志输出的位置,这里是输出到控制台
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
#开启小驼峰命名转换。将column=a_column--->aColumn
map-underscore-to-camel-case: true
#是否开启二级缓存
cache-enabled: true
global-config:
db-config:
id-type: assign_id #id为雪花算法生成
update-strategy: not_null #更新策略:只更新非空字段
-
可以看到,上述配置单词之间是-分隔的,实际上用驼峰命名可也以,没啥区别。
-
global-config是mybatis这边的扩展- 上图我们通过了type属性指定了主键id增长的方式,如果我们不设置,可以通过这边全局配置来指定。
-
上述大部分配置其实mybatisPlus已经设置好了,我们只需要设置如下
mybatis-plus: #开启类别命名自动扫描 type-aliases-package: com.normaling.**.domain global-config: db-config: id-type: assign_id #id为雪花算法生成 update-strategy: not_null #更新策略:只更新非空字段