目录
快速搭建环境
引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.1</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.11</version>
</dependency>
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-openapi2-spring-boot-starter</artifactId>
<version>4.1.0</version>
</dependency>
实现接口
自定义的service实现MybatisPlus提供的IService接口(泛型是实体类)
自定义的ServiceImpI实现MybatisPlus提供的IServiceImpI接口(泛型是实体类)
自定义的Mapper实现MybatisPlus提供的BaseMapper接口(泛型是实体类)
在在application.yaml
中修改jdbc参数为你自己的数据库参数
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/mp?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: 123456
logging:
level:
com.itheima: debug
pattern:
dateformat: HH:mm:ss
mybatis-plus:
type-aliases-package: com.itheima.mp.domain.po
mapper-locations: classpath*:mapper/**/*.xml
最后测试,可以成功集成MybatisPlus
常见注解
MybatisPlus是通过反射来推断出表的信息,从而生成SQL的。
-
MybatisPlus会把PO实体的类名驼峰转下划线作为表名
-
MybatisPlus会把PO实体的所有变量名驼峰转下划线作为表的字段名,并根据变量类型推断字段类型
-
MybatisPlus会把名为id的字段作为主键
事实上,我们可以在建表的时候不遵循这些约定,可以通过一些注解来应用。
@TableName:表名注解,标识实体类对应的表,一般在表名和实体类名不相同下使用。
@TableId:主键注解,标识实体类中的主键字段。可以通过主键增长类型。
AUTO
:利用数据库的id自增长
INPUT
:手动生成id
ASSIGN_ID
:雪花算法生成Long
类型的全局唯一id,这是默认的ID策略
@TableField:普通字段注解。一般情况下我们并不需要给字段添加@TableField
注解,一些特殊情况除外。
- 成员变量名与数据库字段名不一致
- 成员变量是以
isXXX
命名,按照JavaBean
的规范,MybatisPlus
识别字段时会把is
去除,这就导致与数据库不符。 - 成员变量名与数据库一致,但是与数据库的关键字冲突。使用
@TableField
注解给字段名添加转义字符:``
常见配置
实体类的别名扫描包,全局id类型
mybatis-plus:
type-aliases-package: com.itheima.mp.domain.po # 包下是实体类
global-config:
db-config:
id-type: auto # 全局id类型为自增长
MyBatisPlus也支持手写SQL的,而mapper文件的读取地址可以自己配置
mybatis-plus:
mapper-locations: "classpath*:/mapper/**/*.xml" # Mapper.xml文件地址,当前这个是默认值。
核心功能
MybatisPlus又提供了一套基于Lambda的Wrapper,包含两个:
LambdaQueryWrapper
LambdaUpdateWrapper
LambdaQueryWrapper
:适用于需要动态构建查询条件的场景,特别是在查询条件复杂多变的情况下。利用 Lambda 表达式可以有效减少由于手写 SQL 或者条件字段字符串带来的错误风险。
LambdaUpdateWrapper
:主要用于执行带有条件的更新操作,特别适合于那些需要根据特定条件修改记录的场合。与传统的更新方法相比,它能提供更强的灵活性和更高的安全性。
@Test
void testLambdaQueryWrapper(){
//1.构建查询条件
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<User>()
.select(User::getId,User::getUsername,User::getInfo,User::getBalance)
.like(User::getUsername,"o")
.ge(User::getBalance,1000);
//2.查询
List<User> users = userMapper.selectList(wrapper);
users.forEach(System.out::println);
}
自定义SQL
利用Wrapper生成查询条件,再结合Mapper.xml编写SQL。
批量新增
IService中的批量新增功能使用起来非常方便。
@Test
void testSaveBatch() {
// 准备10万条数据
List<User> list = new ArrayList<>(1000);
long b = System.currentTimeMillis();
for (int i = 1; i <= 100000; i++) {
list.add(buildUser(i));
// 每1000条批量插入一次
if (i % 1000 == 0) {
userService.saveBatch(list);
list.clear();
}
}
long e = System.currentTimeMillis();
System.out.println("耗时:" + (e - b));
}
MySQL的客户端连接参数中有这样的一个参数:rewriteBatchedStatements
。顾名思义,就是重写批处理的statement
语句。
修改项目中的application.yml文件,在jdbc的url后面添加参数&rewriteBatchedStatements=true。
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/mp?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: MySQL123
性能将大大提升