mybatis-plus的添加与修改详解

 更新时间:2022年06月27日 10:37:12   作者:AD钙钙钙  
这篇文章主要介绍了mybatis-plus的添加与修改方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

mybatis-plus添加与修改

mybaits-plus帮我们简化了CRUD,这次来说一下添加与修改的操作

由于我们所有的 SQL 是不可见的,我们希望知道他是怎么执行的,所以我们必须要看日志。

在properties中添加日志功能:

mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

配置日志完毕之后,后面的学习就需要注意这个自动生成的SQL

插入操作

@Test
public void testInsert(){
    User user = new User();
    user.setName("java2");
    user.setAge(31);
    user.setEmail("13434423@qq.com");
    int result = userMapper.insert(user);// 帮我们自动生成 id
    System.out.println(result);     // 受影响的行数
    System.out.println(user);       // 发现,id会自动回填
}

数据库插入的 id 默认值为:全局的唯一 id

主键生成策略

分布式系统唯一 id 生成

这里主键是通过一个雪花算法进行完成的。

主键自增

我们需要配置主键自增

1.实体类上 @TableId(type= IdType.AUTO)

2.数据库字段一定要是自增的! 

3.再次插入即可!

补充:主键自增是一种形式,还可以有其他的形式

  • NONE(1) 未设置主键
  • INPUT(2) 手动输入主键
  • ID_WORKER(3) 默认的全局唯一 id
  • UUID(4) 全局唯一 id uuid
  • ID_WORKER_STR(5) 字符串表示法

更新操作

// 测试更新
@Test
public void testUpdate(){
    User user = new User();
    // 通过条件自动拼接动态 sql
    user.setId(3L);
    user.setName("ABCD");
    user.setAge(18);
    // 注意:updateById 但是参数是一个  对象!!!
    int i = userMapper.updateById(user);
    System.out.println(i);
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210219161620154.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1NzI2MTQz,size_16,color_FFFFFF,t_70#pic_center)
}

所有的 SQL 都是自动帮我们动态匹配的

自动填充

我们在数据库表中经常会有这样的情况,数据添加与修改的时候需要被记录,每一次操作都需要有时间,所有我们利用自动填充来完成对时间的修改创建时间,修改时间!这些个操作都要自动完成,不希望手动

这里我们直接用代码级别

给数据库表中添加 create_time、update_time 两个字段

在这里插入图片描述

实体类上字段属性需要加上注解TableField(fill = FieldFill.INSERT)

@TableField(fill = FieldFill.INSERT)     // 时间特有的注解
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;

编写处理器来处理这个时间特有的注解即可

在工程建立 handler 包,创建一个 MyMetaObjectHandler 类

@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    // 插入时的填充策略
    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("start insert fill.......");
        // setFieldValByName(String fieldName, Object fieldVal, MetaObject meatObject)
        this.setFieldValByName("createTime",new Date(),metaObject);
        this.setFieldValByName("updateTime",new Date(),metaObject);
    }
    
    // 更新时的填充策略
    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("start insert fill.......");
        this.setFieldValByName("updateTime",new Date(),metaObject);
    }
}

最后重新测试插入操作,重新测试更新操作,观察时间是否有所变化

mybatis-plus批量添加

mybatis-plus 当前我用的最新版本

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

找到这里我不用多说了,mybatis-plus源码的批量插入和修改是通过for循环转化为多条的单条SQL循环进行插入和修改,所以该方法是SQL拼接成一条SQL传入数据库

批量插入

package com.guide.common.mybatis.mapper; 
import java.util.List;
 
/**
 * @author 
 * @version 1.0
 * @date 2022/5/6 10:34
 */
public interface SpiceBaseMapper<T> {
    /**
     * 批量插入
     * {@link com.baomidou.mybatisplus.extension.injector.methods.InsertBatchSomeColumn}
     *
     * @param entityList 要插入的数据
     * @return 成功插入的数据条数
     */
    int insertBatchSomeColumn(List<T> entityList); 
}
package com.guide.common.mybatis.mapper; 
import com.baomidou.mybatisplus.core.injector.AbstractMethod;
import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector;
import com.baomidou.mybatisplus.extension.injector.methods.AlwaysUpdateSomeColumnById;
import com.baomidou.mybatisplus.extension.injector.methods.InsertBatchSomeColumn;
import org.springframework.stereotype.Component; 
import java.util.List;
 
/**
 * @author 
 * @version 1.0
 * @date 2022/5/6 10:28
 */
@Component
public class SpiceSqlInjector extends DefaultSqlInjector {
 
    /**
     * 如果只需增加方法,保留mybatis plus自带方法,
     * 可以先获取super.getMethodList(),再添加add
     */
    @Override
    public List<AbstractMethod> getMethodList(Class<?> mapperClass) {
        // 注意:此SQL注入器继承了DefaultSqlInjector(默认注入器),调用了DefaultSqlInjector的getMethodList方法,保留了mybatis-plus的自带方法
        List<AbstractMethod> methodList = super.getMethodList(mapperClass);
        // 注入InsertBatchSomeColumn
        // 在!t.isLogicDelete()表示不要逻辑删除字段,!"update_time".equals(t.getColumn())表示不要字段名为 update_time 的字段,不对进行操作
        // methodList.add(new InsertBatchSomeColumn(t -> !t.isLogicDelete() && !"update_time".equals(t.getColumn())));
        // 要逻辑删除 t.isLogicDelete() 默认不要
        methodList.add(new InsertBatchSomeColumn(t -> !t.isLogicDelete()));
        return methodList;
    }
}

记住Java是可以接口多继承的

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • spring boot加载第三方jar包的配置文件的方法

    spring boot加载第三方jar包的配置文件的方法

    本篇文章主要介绍了spring boot加载第三方jar包的配置文件的方法,详细的介绍了spring boot jar包配置文件的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • Java 敏感信息加密处理

    Java 敏感信息加密处理

    本文主要介绍了Java 敏感信息加密处理的相关知识:1)敏感信息加密处理我们要实现什么;2)敏感信息加密处理我做了些什么;3)敏感信息加密实现方法。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-03-03
  • SpringBoot集成MaxCompute的示例代码

    SpringBoot集成MaxCompute的示例代码

    这篇文章主要介绍了SpringBoot集成MaxCompute的实例代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-08-08
  • Springboot 如何指定获取出 yml文件里面的配置值

    Springboot 如何指定获取出 yml文件里面的配置值

    这篇文章主要介绍了Springboot 如何指定获取出 yml文件里面的配置值操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • springbatch的封装与使用实例详解

    springbatch的封装与使用实例详解

    主要实现批量数据的处理,我对batch进行的封装,提出了jobBase类型,具体job需要实现它即可。这篇文章主要介绍了springbatch的封装与使用 ,需要的朋友可以参考下
    2019-04-04
  • Java编码算法与哈希算法深入分析使用方法

    Java编码算法与哈希算法深入分析使用方法

    首先,我们一起来学习一下编码算法,举例说明,ASCII码就是我们常见的一种编码,字母a的编码是十六进制的0x61,字母b是0x62,以此类推。哈希算法,可被称为摘要算法。因此,哈希算法的加密是单向的,不可用密文解密得到明文
    2022-11-11
  • springcloud使用feign调用服务时参数内容过大问题

    springcloud使用feign调用服务时参数内容过大问题

    这篇文章主要介绍了springcloud使用feign调用服务时参数内容过大问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • 解决tomcat发布工程后,WEB-INF/classes下文件不编译的问题

    解决tomcat发布工程后,WEB-INF/classes下文件不编译的问题

    这篇文章主要介绍了解决tomcat发布工程后,WEB-INF/classes下文件不编译的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Spring-retry实现循环重试功能

    Spring-retry实现循环重试功能

    这篇文章主要介绍了Spring-retry 优雅的实现循环重试功能,通过@Retryable注解,优雅的实现循环重试功能,需要的朋友可以参考下
    2023-07-07
  • java8中parallelStream性能测试及结果分析

    java8中parallelStream性能测试及结果分析

    本篇文章给大家用代码实例做了segmentfaultjava8中parallelStream性能测试,并对测试结果做了说明,需要的朋友学习下吧。
    2018-01-01

最新评论