Springboot08-mybatisPlus

mybatisPlus

mybatisplus是mybatis的升级版,优化mybatis,让持久层操作更简便快捷。

导入依赖

    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.0.5</version>
    </dependency>

注意:引入 MyBatis-Plus 之后请不要再次引入 MyBatis 以及 MyBatis-Spring,以避免因版本差异导致的问题。

导入lombok

lombok可以简化实体类,通过注解添加get/set方法,以及其构造方法等其他方法。

导入依赖

    <!--lombok用来简化实体类-->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>

安装lombok插件

在这里插入图片描述
如果没有该插件的话是版本太老了,没有插件也没有关系,A/t + Insert一样可以解决。

  • 1.实体类(@Data注解自动生成get/set方法)
@Data
public class User {
    
    
    private Long id;
    private String name;
    private Integer age;
    private String email;
}

配置properties

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus?serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123456

注意:mysql8以上(spring boot 2.1)要按照以上方式配饰数据源
注意:

  • 1、这里的 url 使用了 ?serverTimezone=GMT%2B8 后缀,因为Spring Boot 2.1 集成了 8.0版本的jdbc驱动,这个版本的 jdbc 驱动需要添加这个后缀,否则运行测试用例报告如下错误:
    java.sql.SQLException: The server time zone value ‘Öйú±ê׼ʱ¼ä’ is unrecognized or represents more

  • 2、这里的 driver-class-name 使用了 com.mysql.cj.jdbc.Driver ,在 jdbc 8 中 建议使用这个驱动,之前的 com.mysql.jdbc.Driver 已经被废弃,否则运行测试用例的时候会有 WARN 信息

主键策略

(1)ID_WORKER
MyBatis-Plus默认的主键策略是:ID_WORKER 全局唯一ID

(2)自增策略

  • 要想主键自增需要配置如下主键策略
    + 需要在创建数据表的时候设置主键自增
    + 实体字段中配置 @TableId(type = IdType.AUTO)
@TableId(type = IdType.AUTO)
private Long id;

要想影响所有实体的配置,可以设置全局主键配置

#全局设置主键生成策略
mybatis-plus.global-config.db-config.id-type=auto

自动填充

项目中经常会遇到一些数据,每次都使用相同的方式填充,例如记录的创建时间,更新时间等。
我们可以使用MyBatis Plus的自动填充功能,完成这些字段的赋值工作:
(1)数据库表中添加自动填充字段
在User表中添加datetime类型的新的字段 create_time、update_time

(2)实体上添加注解

@Data
public class User {
    
    
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;
    //@TableField(fill = FieldFill.UPDATE)
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;
}

(3)实现元对象处理器接口
注意:不要忘记添加 @Component 注解

package edu.yjsj.mybatis.handler;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.util.Date;

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    
    

    //使用mp实现添加操作时方法执行
    @Override
    public void insertFill(MetaObject metaObject) {
    
    
        this.setFieldValByName("createTime",new Date(),metaObject);
        this.setFieldValByName("updateTime",new Date(),metaObject);
        this.setFieldValByName("version",1,metaObject);
    }

    //使用mp实现更新操作时方法执行
    @Override
    public void updateFill(MetaObject metaObject) {
    
    
        this.setFieldValByName("updateTime",new Date(),metaObject);
    }
}

乐观锁

主要适用场景:当要更新一条记录的时候,希望这条记录没有被别人更新,也就是说实现线程安全的数据更新

乐观锁实现方式:

  • 取出记录时,获取当前version
  • 更新时,带上这个version
  • 执行更新时, set version = newVersion where version = oldVersion如果version不对,就更新失败

(1)数据库中添加version字段

ALTER TABLE `user` ADD COLUMN `version` INT

(2)实体类添加version字段
并添加 @Version 注解

@Version
@TableField(fill = FieldFill.INSERT)
private Integer version;

(3)元对象处理器接口添加version的insert默认值

@Override
public void insertFill(MetaObject metaObject){
    
      this.setFieldValByName("version", 1, metaObject);
}

在 MybatisPlusConfig 中注册 Bean

创建配置类
package edu.yjsj.mybatis.config;

import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@MapperScan("edu.yjsj.mybatis.mapper")
public class MpConfig {
    
    
    /**
     * 乐观锁插件
     */

    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor() {
    
    
        return new OptimisticLockerInterceptor();
    }
}

分页查询

//条件查询带分页
    //@RequestBody 前端的json格式请求参数必须用post才能接受,required表示此参数是否必须要传递
    @PostMapping("/pageTeacherCondition/{current}/{limit}")
    public Result pageTeacherCondition(@PathVariable long current, @PathVariable long limit,
                                       @RequestBody(required = false)TeacherQuery teacherQuery){
    
    
        //创建page对象
        Page<EduTeacher> pageTea = new Page<>(current,limit);

        //构建条件
        QueryWrapper<EduTeacher> wrapper = new QueryWrapper<>();
        //多条件组合查询
        String name = teacherQuery.getName();
        Integer level = teacherQuery.getLevel();
        String begin = teacherQuery.getBegin();
        String end = teacherQuery.getEnd();
        //判断条件
        if(!StringUtils.isEmpty(name)){
    
    
            //构建条件
            wrapper.like("name",name);
        }
        if(!StringUtils.isEmpty(level)){
    
    
            wrapper.eq("level",level);
        }
        if(!StringUtils.isEmpty(begin)) {
    
    
            wrapper.ge("gmt_create",begin);
        }
        if(!StringUtils.isEmpty(end)) {
    
    
            wrapper.le("gmt_create",end);
        }
        eduTeacherService.page(pageTea,wrapper);
        List<EduTeacher> records = pageTea.getRecords();
        long total = pageTea.getTotal();
        return pageTea != null ? Result.ok().data("total",total).data("records",records) : Result.error();
    }

逻辑删除

物理删除:真实删除,将对应数据从数据库中删除,之后查询不到此条被删除数据
逻辑删除:假删除,将对应数据中代表是否被删除字段状态修改为“被删除状态”,之后在数据库中仍旧能看到此条数据记录
(1)数据库中添加 deleted字段

ALTER TABLE `user` ADD COLUMN `deleted` boolean

(2)实体类添加deleted 字段
并加上 @TableLogic 注解 和 @TableField(fill = FieldFill.INSERT) 注解

@TableLogic
@TableField(fill = FieldFill.INSERT)
private Integer deleted;

(3)元对象处理器接口添加deleted的insert默认值

@Override
public void insertFill(MetaObject metaObject) {
    
    
    this.setFieldValByName("deleted", 0, metaObject);
}

(5)在 MybatisPlusConfig 中注册 Bean

@Bean
public ISqlInjector sqlInjector() {
    
    
    return new LogicSqlInjector();
}

猜你喜欢

转载自blog.csdn.net/weixin_44172800/article/details/105937161
今日推荐