一.快速入门
1.相关数据库创建
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)
);
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');
2.Springboot工程创建
3.相关配置
application.propertise
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3307/mybatis_plus?severTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123456
依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.6</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.hjj</groupId>
<artifactId>onlearn_parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>onlearn_parent</name>
<description>onlearn_parent</description>
<properties>
<java.version>1.8</java.version>
<mybatis-plus.version>3.4.2</mybatis-plus.version>
</properties>
<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>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.33</version>
<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>
<!-- Mp:苞米谷-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.2</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<image>
<builder>paketobuildpacks/builder-jammy-base:latest</builder>
</image>
</configuration>
</plugin>
</plugins>
</build>
</project>
4.相关代码
1.User实体类
package com.hjj.onlearn_parent.entity;
import lombok.Data;
/**
* @author:嘉佳 Date:2023/11/12 11:13
**/
@Data
public class User {
private Long id;
private String name;
private Integer age;
private String email;
}
2.mapper接口
package com.hjj.onlearn_parent.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.hjj.onlearn_parent.entity.User;
import org.springframework.stereotype.Repository;
/**
* @author:嘉佳 Date:2023/11/12 11:14
**/
//不用写xml,mp已经封装,只要继承BaseMapper
@Repository
public interface UserMapper extends BaseMapper<User> {
}
3.springboot启动类
@SpringBootApplication
@MapperScan("com.hjj.onlearn_parent.mapper")//扫描mapper接口
public class OnlearnParentApplication {
public static void main(String[] args) {
SpringApplication.run(OnlearnParentApplication.class, args);
}
}
4.测试类
@SpringBootTest
class OnlearnParentApplicationTests {
@Autowired
private UserMapper userMapper;
// 查询user表所有
@Test
void findAll() {
List<User> users = userMapper.selectList(null);
System.out.println(users);
}
}
5.日志配置
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
二.主键生成策略
1.策略种类
策略 | 介绍 | 缺点 |
---|---|---|
数据库自增长 | AUTO INCREMENT | 分表时需获取上张表id |
UUID | 每次生成随机唯一值 | 排序不便 |
Redis生成id | ||
mp自带策略 | snowflake算法 |
2.设置主键生成策略
MyBatis-Plus中使用 @TableId(type = IdType.xxx ) 注解来标注使用哪种主键生成策略
-
AUTO: 自动增长
-
INPUT: 需要自行输入
-
ASSIGN_UUID: 自动生成随机唯一值
-
NONE: 不使用任何策略 也属于是自行输入
-
ASSIGN_ID: Mybatis-Plus自带策略 自动生成19为值
三.自动填充
步骤:
-
1.在实体类中为要自动填充的属性加注解@TableFiled(fill=XX
-
FieldFill.INSERT 表示在插入操作时填充字段的值。
-
FieldFill.INSERT_UPDATE 表示在插入和更新操作时填充字段的值。
-
-
2.创建一个类实现MetaObjectHandler接口
四.乐观锁
乐观锁:主要解决丢失更新问题丢失更新:多人同时修改同一条记录,最后提交的会把之前已经提交过的数据覆盖
解决方法:
-
1 . 悲观锁:串行执行
-
2.乐观锁: 添加version 使用版本号进行控制 比较数据与数据库中的版本号,版本号不同,不能进行更改
乐观锁的具:体实现:
-
1.表中添加字段 作为乐观锁版本号
-
2.对应实体类添加版本号属性和@Version注解
-
3.在配置类中配置乐观锁插件
//配置乐观锁插件 @Configuration @MapperScan("com.hjj.onlearn_parent.mapper")//扫描mapper接口 public class MpConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor(); mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); return mybatisPlusInterceptor; } }
-
乐观锁修改时要先查再改
-
原因:当执行更新操作时,需要比较当前数据的版本信息与更新前获取的版本信息是否一致。如果没有查询操作,就无法知道其他线程是否已经修改了该数据。
五.mp简单查询
1.根据id查询
2.多个id批量查询
userMapper.selectBatchIds(Arrays.asList(x,x,...))
六.分页查询
1.在配置类中配置分页插件(新版)
// 分页插件
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
2.编写分页代码
-
1.创建page对象
-
2.调用mp分页查询方法,把分页数据封装到page中
-
// 分页查询 @Test public void testPage(){ // 1.创建page对象 // 传入两个参数(当前页,每页显示记录数) Page<User> page = new Page<>(1, 3); // 2.调用mp分页查询方法,把分页数据封装到page中 // selectPage(分页对象,条件) userMapper.selectPage(page,null); }
3.通过page对象获取分页数据
System.out.println(page.getCurrent());//当前页
System.out.println(page.getRecords());//每页数据list集合
System.out.println(page.getSize());//每页显示记录数
System.out.println(page.getTotal());//总记录数
System.out.println(page.getPages());//总页数
System.out.println(page.hasNext());//是否有下一页
System.out.println(page.hasPrevious());//是否有上一页
七.删除
物理删除:直接删除数据库中的记录
逻辑删除:使用标识符 表示记录已被删除,但是还存在于表中,逻辑删除的数据不能被查询,需要使用xml写复杂sql查询
1.物理删除
-
删除单条
// 简单删除 @Test public void deleteById(){ int result = userMapper.deleteById(1L); System.out.println(result); }
-
删除多条
// 批量删除 @Test public void testDeleteByBatchIds(){ int result = userMapper.deleteBatchIds(Arrays.asList(1, 2)); System.out.println(result); }
2.逻辑删除
-
1.数据库添加deleted字段
-
2.实体类添加deleted字段并加上@TableLogin和 @TableField(fill = FieldFill.INSERT)注解
-
3.新版无需添加逻辑删除插件
-
底层:UPDATE user SET deleted=1 WHERE id=? AND deleted=0
@TableLogic//标识逻辑删除字段
@TableField(fill = FieldFill.INSERT)
private Integer deleted;
八.Mybatis-Plus构造器查询 --复杂条件查询
1.wrapper
一般使用QueryWrapper进行mp复杂条件查询
2.QueryWrapper进行mp复杂条件查询
-
1.创建QueryWrapper对象
-
2.通过QueryWrapper设置条件
@Test public void testSelectQuery(){ // 创建QueryWrapper对象 QueryWrapper<User> wrapper = new QueryWrapper<>(); // 通过QueryWrapper设置条件 // ge、gt、le、lt >= > <= < // 查询age>=20记录 // 第一个参数 字段名 第二个参数 设置值 // wrapper.ge("age",20); // eq、ne 等于 不等于 // wrapper.eq("name","Tom"); // wrapper.ne("name","tom"); // between 范围查询 // wrapper.between("age",21,30); // orderByDesc 降序排序 // wrapper.orderByDesc("id"); // like 模糊查询 // wrapper.like("name","吴"); // last 追加sql语句 // wrapper.last("limit 1"); // 指定要查询的列 wrapper.select("age","name"); List<User> users = userMapper.selectList(wrapper); System.out.println(users); }