1,增加MP日志配置

1 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
2 spring.datasource.url=jdbc:mysql://localhost:3306/mp-demo?serverTimezone=GMT%2B8
3 spring.datasource.username=root
4 spring.datasource.password=123456
5 
6 #mybatis日志
7 mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

增加日志后执行HelloWorld,这个时候就会输出SQL日志,帮助我们学习。

 

2,插入操作(insert)

package com.tongjun.mpdemo;

import com.tongjun.mpdemo.entitiy.User;
import com.tongjun.mpdemo.mapper.UserMapper;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import javax.annotation.Resource;

@SpringBootTest
@Slf4j
public class CRUD_TestCase {

    @Resource
    private UserMapper userMapper;

    /**
     * 插入操作
     */
    @Test
    public void testInsert(){
        User user=new User();
        user.setName("白子画");
        user.setAge(19);
        user.setEmail("bzh@163.com");
        /**
         * 返回受影响的行数
         */
        int insert = userMapper.insert(user);
        log.info("受影响的行数为:{}",insert);
    }

}

思考一下 我们在插入的时候并没有设置id,这个id根据我们配置的日志可以看出来是存在插入的。并且这个id看着像是一个唯一的。

主键策略

  1,ID_WORKER

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

  2,自增策略

    要想主键自增需要配置如下主键策略

      需要在创建数据表的时候设置主键自增

      实体字段中配置 @TableId(type = IdType.AUTO)

 

package com.tongjun.mpdemo.entitiy;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;

@Data
public class User {
    @TableId(type = IdType.AUTO)
    private Long id;
    private String name;
    private Integer age;
    private String email;
}

 

  3,其他策略   

        查看源码

public enum IdType {
    /**
     * 数据库ID自增
     */
    AUTO(0),
    /**
     * 该类型为未设置主键类型
     */
    NONE(1),
    /**
     * 用户输入ID
     * 该类型可以通过自己注册自动填充插件进行填充
     */
    INPUT(2),

    /* 以下3种类型、只有当插入对象ID 为空,才自动填充。 */
    /**
     * 全局唯一ID (idWorker)
     */
    ID_WORKER(3),
    /**
     * 全局唯一ID (UUID)
     */
    UUID(4),
    /**
     * 字符串全局唯一ID (idWorker 的字符串表示)
     */
    ID_WORKER_STR(5);

    private int key;

    IdType(int key) {
        this.key = key;
    }

3,更新操作(update)

    /**
     * 更新操作
     */
    @Test
    public void testUpdate(){
        User user=new User();
        user.setId(1L);
        user.setName("花千骨");
        int count = userMapper.updateById(user);
        log.info("受影响的行数为:{}",count);
    }

 

 

这个时候如果经常做项目的同学会发现一个特别常见的需求,根据阿里巴巴开发手册上也说过,一个表里必须有记录的创建时间和修改时间。这个时候我们可以使用MyBatisPlus(该文后面使用MP代替)的自动填充功能来简化我们代码的开发。

4,自动填充功能

  首先将我们的user表增加2个字段  create_time  update_time ,添加完成后 效果如下。

  然后在我们的实体类中添加MP提供的注解

 1 package com.tongjun.mpdemo.entitiy;
 2 
 3 import com.baomidou.mybatisplus.annotation.FieldFill;
 4 import com.baomidou.mybatisplus.annotation.IdType;
 5 import com.baomidou.mybatisplus.annotation.TableField;
 6 import com.baomidou.mybatisplus.annotation.TableId;
 7 import lombok.Data;
 8 
 9 import java.util.Date;
10 
11 @Data
12 public class User {
13     @TableId(type = IdType.AUTO)
14     private Long id;
15     private String name;
16     private Integer age;
17     private String email;
18 
19     /**
20      * 在新增记录时候自动填充
21      */
22     @TableField(fill = FieldFill.INSERT)
23     private Date createTime;
24 
25     /**
26      *  更新时间,在新增的时候也要填充,其次是更新的时候每次填充
27      * */
28     @TableField(fill = FieldFill.INSERT_UPDATE)
29     private Date updateTime;
30 }

接下来编写处理器,实现MP提供的接口,在方法里面完成填充

package com.tongjun.mpdemo.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 {
    @Override
    public void insertFill(MetaObject metaObject) {
        this.setFieldValByName("createTime",new Date(),metaObject);
        this.setFieldValByName("updateTime",new Date(),metaObject);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        this.setFieldValByName("updateTime",new Date(),metaObject);
    }
}

测试新增

    /**
     * 插入操作
     */
    @Test
    public void testInsert(){
        User user=new User();
        user.setName("杀阡陌");
        user.setAge(12);
        user.setEmail("sqm@163.com");
        /**
         * 返回受影响的行数
         */
        int insert = userMapper.insert(user);
        log.info("受影响的行数为:{}",insert);
    }

测试修改

    /**
     * 更新操作
     */
    @Test
    public void testUpdate(){
        User user=new User();
        user.setId(1257939437792489474L);
        user.setName("杀阡陌666");
        int count = userMapper.updateById(user);
        log.info("受影响的行数为:{}",count);
    }

 

5,MP乐观锁插件使用

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

  

       乐观锁实现方式:

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

  首先在表中增加version字段

  

  然后在实体类中增加version注解

  

package com.tongjun.mpdemo.entitiy;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.Version;
import lombok.Data;

import java.util.Date;

@Data
public class User {

    private Long id;
    private String name;
    private Integer age;
    private String email;

    /**
     * 在新增记录时候自动填充
     */
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;

    /**
     *  更新时间,在新增的时候也要填充,其次是更新的时候每次填充
     * */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;

    /**
     * 使用自动填充功能,在新增的时候 给version 自动填充 1
     */
    @TableField(fill = FieldFill.INSERT)
    @Version
    private Integer version;
}
package com.tongjun.mpdemo.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 {
    @Override
    public void insertFill(MetaObject metaObject) {
        this.setFieldValByName("createTime",new Date(),metaObject);
        this.setFieldValByName("updateTime",new Date(),metaObject);
        this.setFieldValByName("version",1,metaObject);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        this.setFieldValByName("updateTime",new Date(),metaObject);
    }
}

  接着将乐观锁插件注入到spring容器中,在SpringBoot中推荐使用java代码进行配置

package com.tongjun.mpdemo.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;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@EnableTransactionManagement
@Configuration
@MapperScan("com.tongjun.mpdemo.mapper")
public class MyBatisPlusConfig {

    /**
     * 乐观锁插件
     */
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor() {
        return new OptimisticLockerInterceptor();
    }
}

这里面顺便将mapper 扫描也移到这里来了。接下来就是测试。

先插入一条记录

    /**
     * 插入操作
     */
    @Test
    public void testInsert(){
        User user=new User();
        user.setName("巫妖王");
        user.setAge(36);
        user.setEmail("wyw@163.com");
        /**
         * 返回受影响的行数
         */
        int insert = userMapper.insert(user);
        log.info("受影响的行数为:{}",insert);
    }

观看日志

查看我们刚插入的数据,看看version字段有没有自动填充过来。

接着我们进行修改操作,我们先查询再修改

    /**
     * 测试乐观锁插件
     */
    @Test
    public void testOptimisticLocker(){
        //查询   这个id 是 原先  巫妖王的 id  该方法是根据id 查询 应该比较简单 先使用
        User user = userMapper.selectById(1257943192512483330L);
        //修改数据
        user.setName("希尔瓦娜斯");
        user.setEmail("xnw@163.com");
        //执行更新
        userMapper.updateById(user);
    }

修改过来 版本自动+1。

 

 

 

版权声明:本文为tongjun原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/tongjun/p/12836979.html