-
- 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');

-
- 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>
- 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;
- }
- 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> {
- }
- @SpringBootApplication
- @MapperScan("com.hjj.onlearn_parent.mapper")//扫描mapper接口
- public class OnlearnParentApplication {
-
- public static void main(String[] args) {
- SpringApplication.run(OnlearnParentApplication.class, args);
- }
-
- }
- @SpringBootTest
- class OnlearnParentApplicationTests {
-
- @Autowired
- private UserMapper userMapper;
-
- // 查询user表所有
- @Test
- void findAll() {
- List<User> users = userMapper.selectList(null);
- System.out.println(users);
- }
-
- }
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
| 策略 | 介绍 | 缺点 |
|---|---|---|
| 数据库自增长 | AUTO INCREMENT | 分表时需获取上张表id |
| UUID | 每次生成随机唯一值 | 排序不便 |
| Redis生成id | ||
| mp自带策略 | snowflake算法 |
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;
}
}
乐观锁修改时要先查再改
原因:当执行更新操作时,需要比较当前数据的版本信息与更新前获取的版本信息是否一致。如果没有查询操作,就无法知道其他线程是否已经修改了该数据。


userMapper.selectBatchIds(Arrays.asList(x,x,...))

- // 分页插件
- @Bean
- public MybatisPlusInterceptor mybatisPlusInterceptor() {
- MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
- interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
- return interceptor;
- }
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);
- }
- 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查询
删除单条
- // 简单删除
- @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);
- }
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;

一般使用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);
- }