mybatis-plus的添加与修改详解

目录
  • mybatis-plus批量添加
    • 批量插入
    • 记住Java是可以接口多继承的

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是可以接口多继承的

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

(0)

相关推荐

  • MyBatis-Plus 修改和添加自动填充时间方式

    MyBatis-Plus 修改和添加自动填充时间 数据库字段设置: `valid_verify_time` datetime DEFAULT NULL COMMENT '有效性审核时间', 实体类设置: @JsonSerialize:序列化 @JsonDeserialize:反序列化 LocalDateTimeSerializer:JDK时间序列化规则 @ApiModelProperty(value = "有效性审核时间") @TableField(fill = FieldFill.U

  • Mybatis Plus 增删改查的实现(小白教程)

    目录 前言 什么是 mybatis-plus? 快速开始 准备环境: 准备数据表 IDEA中配置 maven 创建 spring boot 应用 创建mapper接口 添加@MapperScan 扫描 Mapper 文件夹 配置 mybatis 日志 CRUD 基本用法 insert 操作 update 操作 delete 操作 select 操作 前言 在持久层框架中 mybatis 应用比较多,而且比重在逐渐的上升.通常项目的组合是 SSM.mybatis 之所以火,是因为他的灵活,使用方便

  • mybatisplus添加真正的批量新增、批量更新的实现

    使用mybatis-plus来进行批量新增和更新时,你会发现其实是一条条sql执行,下面进行优化. 1.添加InsertBatchMethod和UpdateBatchMethod类 import com.baomidou.mybatisplus.core.injector.AbstractMethod; import com.baomidou.mybatisplus.core.metadata.TableInfo; import lombok.extern.slf4j.Slf4j; import

  • mybatis-plus的添加与修改详解

    目录 mybatis-plus批量添加 批量插入 记住Java是可以接口多继承的 mybaits-plus帮我们简化了CRUD,这次来说一下添加与修改的操作 由于我们所有的 SQL 是不可见的,我们希望知道他是怎么执行的,所以我们必须要看日志. 在properties中添加日志功能: mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl 配置日志完毕之后,后面的学习就需要注意这个自动生成的S

  • mybatis 实现 SQL 查询拦截修改详解

    前言 截器的一个作用就是我们可以拦截某些方法的调用,我们可以选择在这些被拦截的方法执行前后加上某些逻辑,也可以在执行这些被拦截的方法时执行自己的逻辑而不再执行被拦截的方法. Mybatis拦截器设计的一个初衷就是为了供用户在某些时候可以实现自己的逻辑而不必去动Mybatis固有的逻辑.比如我想针对所有的SQL执行某个固定的操作,针对SQL查询执行安全检查,或者记录相关SQL查询日志等等. Mybatis为我们提供了一个Interceptor接口,可以实现自定义的拦截器. public inter

  • MyBatis Properties及别名定义实例详解

    上一篇我们介绍了mybatis的增删改查入门实例,我们发现在 mybatis-configuration.xml 的配置文件中,对数据库的配置都是硬编码在这个xml文件中,如下图,那么我们如何改进这个写法呢? 1.我们将 数据库的配置语句写在 db.properties 文件中 jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/ssm jdbc.username=root jdbc.password=ro

  • SpringBoot学习系列之MyBatis Plus整合封装的实例详解

    前言 MyBatis-Plus是一款MyBatis的增强工具(简称MP),为简化开发.提高效率,但我们并没有直接使用MP的CRUD接口,而是在原来的基础上封装一层通用代码,单表继承我们的通用代码,实现了单表的基础get.save(插入/更新).list.page.delete接口,使用Vo去接收.传输数据,实体负责与数据库表映射. 这样做的目的是与我们之前的那套jpa保持编码风格上的一致,当我们的通用接口不能满足要求时,应当先考虑使用MP的Service层CRUD接口,然后是Mapper的接口,

  • Java Fluent Mybatis 项目工程化与常规操作详解流程篇 上

    目录 前言 Maven依赖 配置文件调整 Knife4j配置 添加必要实体 增/改 总结 前言 接着上一篇,上篇已经测试通过,成功添加了数据.那么这篇主要是继续上一个项目,将项目进行工程化包装,增加一些必要配置,并且生成增删改查接口. GitHub代码仓库:GitHub仓库 Maven依赖 增加了druid数据库连接池,所以之前的配置文件也需要调整,下面会发出来. <dependency> <groupId>cn.hutool</groupId> <artifac

  • MyBatis  Properties及别名定义实例详解

    上一篇我们介绍了mybatis的增删改查入门实例,我们发现在 mybatis-configuration.xml 的配置文件中,对数据库的配置都是硬编码在这个xml文件中,如下图,那么我们如何改进这个写法呢? 1.我们将 数据库的配置语句写在 db.properties 文件中 jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/ssm jdbc.username=root jdbc.password=ro

  • Mybatis velocity脚本的使用教程详解(推荐)

    可能很多童鞋都还不是很清楚在mybatis可以使用各种脚本语言来定义Mapper文件里面的动态SQL:目前mybatis支持的脚本语言有XML(默认的):Velocity和Freemarker三种.使用不同的脚本语言来完成Mapper文件的编写,第一是使用自己熟悉的脚本语言,第二是能够定义更多丰富的自定义指令来简化Mapper的开发,关于MyBatis支持脚本的原理分析,自定义脚本指令后面再写文章分析,本文先介绍mybatis中velocity脚本的使用方式. mybatis-velocity项

  • MyBatis动态SQL标签用法实例详解

    1.动态SQL片段 通过SQL片段达到代码复用 <!-- 动态条件分页查询 --> <sql id="sql_count"> select count(*) </sql> <sql id="sql_select"> select * </sql> <sql id="sql_where"> from icp <dynamic prepend="where&quo

  • Mybatis中Mapper映射文件使用详解

    紧接上文所述,在这篇文章中我将对Mapper映射文件进行详细的说明. Mapper映射文件是一个xml格式文件,必须遵循相应的dtd文件规范,如ibatis-3-mapper.dtd.我们先大体上看看支持哪些配置?如下所示,从Eclipse里截了个屏: 从上图可以看出,映射文件是以<mapper>作为根节点,在根节点中支持9个元素,分别为insert.update.delete.select(增删改查);cache.cache-ref.resultMap.parameterMap.sql. 下

  • 设计模式系列之组合模式及其在JDK和MyBatis源码中的运用详解

    组合模式及其在JDK源码中的运用 前言组合和聚合什么是组合模式示例透明组合模式透明组合模式的缺陷安全组合模式 组合模式角色组合模式在JDK源码中的体现组合模式应用场景享元模式优缺点总结 前言 本文主要会讲述组合模式的用法,并会结合在JDK和MyBatis源码中的运用来进一步理解组合模式. 在编码原则中,有一条是:多用组合,少用继承.当然这里的组合和我们今天要讲的组合模式并不等价,这里的组合其实就是一种聚合,那么聚合和组合有什么区别呢? 组合和聚合 人在一起叫团伙,心在一起叫团队.用这句话来诠释组

随机推荐