一.快速入门
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.Driverspring.datasource.url=jdbc:mysql://localhost:3307/mybatis_plus?severTimezone=GMT%2B8spring.datasource.username=rootspring.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**/@Datapublic 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.测试类
@SpringBootTestclass OnlearnParentApplicationTests {@Autowiredprivate UserMapper userMapper;// 查询user表所有@Testvoid 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 {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());return mybatisPlusInterceptor;}}
-
乐观锁修改时要先查再改
-
原因:当执行更新操作时,需要比较当前数据的版本信息与更新前获取的版本信息是否一致。如果没有查询操作,就无法知道其他线程是否已经修改了该数据。
五.mp简单查询
1.根据id查询
2.多个id批量查询
userMapper.selectBatchIds(Arrays.asList(x,x,...))
六.分页查询
1.在配置类中配置分页插件(新版)
// 分页插件@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));return interceptor;}
2.编写分页代码
-
1.创建page对象
-
2.调用mp分页查询方法,把分页数据封装到page中
-
// 分页查询@Testpublic 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.物理删除
-
删除单条
// 简单删除@Testpublic void deleteById(){int result = userMapper.deleteById(1L);System.out.println(result);}
-
删除多条
// 批量删除@Testpublic 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设置条件
@Testpublic 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);}