1、入门教程
1.1、引入依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.3</version>
<relativePath/>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>11</java.version>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</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>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3</version>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--lombok用来简化实体类-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
</dependencies>
1.2、编写实体类
@Data
@TableName("userinfo")
public class UserInfo {
private int id;
private String username;
private String password;
}
1.3、编写mapper接口
@Component
public interface UserMapper extends BaseMapper<UserInfo> {
}
//mapper接口需要集成BaseMapper<T>接口,集成后,我们不用再写增删改查改查接口,BaseMapper接口里面提供了基本的增删改查接口
1.4、添加配置文件
//配置文件的里需要配数据库的连接信息,由于没有mapper.xml,所有不用配加载配置
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/platform?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
spring.datasource.username=*******
spring.datasource.password=*****
#mybatis日志,运行时可以打印执行的sql
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
2、mp主键生成
2.1、主键自动生成使用
2.1、实体类属性添加注解(不添加默认使用雪花算法)
//@TableId(type = IdType.ID_WORKER) //mp自带策略,生成19位值,数字类型使用这种策略,比如long
//@TableId(type = IdType.ID_WORKER_STR) //mp自带策略,生成19位值,字符串类型使用这种策略
private Long id; //
2.2、属性的类型:
实体类:Long
数据库:bigint
2.2、mp主键生成策略
2.3、其他主键生成策略
3、mp时间自动填充
3.1、首先在实体类增加TableField注解
@TableField(fill = FieldFill.INSERT)
private Date createTime;//java.util.Date
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;//java.util.Date
3.2、数据库中字段名(需要写成下面的形式,不然mp无法识别)
create_time
update_time
3.3、编写一个类,实现MetaObjectHandler接口
@Component
public class UserHandler implements MetaObjectHandler {
//使用mp实现添加操作,这个方法执行
@Override
public void insertFill(MetaObject metaObject) {
this.setFieldValByName("createTime",new Date(),metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("updateTime",new Date(),metaObject);
}
}
4、mp实现乐观锁
4.1、乐观锁的实现方式:
通过版本号实现,从数据库获取的数据的时候,同时获取版本号,在提交数据的时候,对比数据现在的版本号和最开始获取的版本号是否一致,如果一直则提交成功,不一致提交失败。
4.2、乐观锁解决的问题:
数据丢失更新问题,A、B同时从数据库获取数据进行修改,A先提交,B后提交,B的数据会覆盖A的数据,正确的操作步骤是,A提交以后,B应该在A的数据上做修改之后再提交,而不是在最开始获取的数据上修改提交。
4.3、mp乐观锁的用法
4.3.1、在数据中增加version字段
4.3.2、在实体类中增加version,并加上@Version注解
@Version
private Integer version;
4.3.3、增加配置类(数据库包扫描,也可以配置在配置类上)
@Configuration
public class MpConfig {
//乐观锁插件
@Bean(新版3.4.3,jdk11)
public MybatisPlusInterceptor mybatisPlusInterceptor(){
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return mybatisPlusInterceptor;
// 乐观锁插件(旧版3.0.5,jdk8)
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor () {
return new OptimisticLockerInterceptor();
}
}
4.3.4、测试乐观锁
@Test
public void testUser(){
UserInfo userInfo=userMapper.selectById(1);
userInfo.setPassword("123");
userMapper.updateById(userInfo);
}
//先查询再修改
MySQL数据库隔离级别
5、mp的查询
5.1、简单查询(根据id查询)
//根据id查询
UserInfo userInfo=userMapper.selectById(1)
5.2、分页查询
5.2.1、添加配置类
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
5.2.2、测试分页查询
@Test
public void testPage() {
//1 创建page对象
//传入两个参数:当前页 和 每页显示记录数
Page<UserInfo> page = new Page<>(1,2);
//调用mp分页查询的方法
//调用mp分页查询过程中,底层封装
//把分页所有数据封装到page对象里面
//selectPage(page,null)方法,第一个参数是page对象,第二个参数,是查询条件对象
userMapper.selectPage(page,null);
//通过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()); //下一页,返回值是boolen,有下一页就是ture
System.out.println(page.hasPrevious()); //上一页
}
6、删除
6.1、物理删除(根据id删除、根据id进行批量删除)
userMapper.deleteById(1);
userMapper.deleteBatchIds(new ArrayList<>());//根据id批量删除
6.2、逻辑删除(回收站)
6.2.1、数据库中增加逻辑删除字段
deleted
6.2.2、实体类
@TableLogic //0表示不删除,1表示删除
private Integer deleted
6.2.3、添加配置(高版本无需添加配置)
@Bean
public ISqlInjector sqlInjector() {
return new LogicSqlInjector();
6.2.4、 执行逻辑删除
userMapper.deleteById(1);
6.2.5、执行了逻辑删除后,再次查询时,mp只查没有删除的
}
7、多条件复杂查询
//创建QueryWrapper对象
QueryWrapper<User> wrapper = new QueryWrapper<>();
//指定要查询的列
wrapper.select("id","name");
List<User> users = userMapper.selectList(wrapper);
8、sql性能分析插件
8.1、添加配置类(低版本可以用)
/**
* SQL 执行性能分析插件
* 开发环境使用,线上不推荐。 maxTime 指的是 sql 最大执行时长
*
* 三种环境
* * dev:开发环境
* * test:测试环境
* * prod:生产环境
*/
@Bean
@Profile({"dev","test"})// 设置 dev test 环境开启
public PerformanceInterceptor performanceInterceptor() {
PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
performanceInterceptor.setMaxTime(500);//ms,超过此处设置的ms则sql不执行
performanceInterceptor.setFormat(true);
return performanceInterceptor;
}
8.2、添加配置文件
#环境设置:dev、test、prod
spring.profiles.active=dev
9、mp对service层的封装
//9.1、首先写一个service接口
public interface EduTeacherService extends IService<EduTeacher> {
}
//9.2、写接口的实现类同时,实现类继承ServiceImpl
//继承ServiceImpl,需要传入mapper对象和操作的实体类对象
public class EduTeacherServiceImpl extends ServiceImpl<EduTeacherMapper, EduTeacher> implements EduTeacherService {
}
//9.3、mp提供的service层接口
//查询所有
List<T> list(Wrapper<T> queryWrapper)