mybatis-plus 自定义basemapper支持批量增删改操作

Posted Hepburn Yang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis-plus 自定义basemapper支持批量增删改操作相关的知识,希望对你有一定的参考价值。

  • com.baomidou.mybatisplus.core.mapper.BaseMapper
  • com.baomidou.mybatisplus.extension.service.IService

经常使用mybatis的开发朋友们都知道mybatis提供了上述两种类型的预定义接口来帮助我们做单表的增删改查操作,IService方式和BaseMapper这两种方式的区别以及联系是如何的呢? 下面我们来分析~~

接口区别

  1. 首先从提供的方法上名字有些许不同,功能大致是类似的,但是IService提供了更多的接口,包括BaseMapper不支持的批量增删改。更确切的来说,IService<M,T> 针对业务逻辑层的封装 需要指定Dao层类和对应的实体类 是在BaseMapper基础上的加强,因为其内部方法实现依旧调用的是BaseMapper里面的接口。如果你需要使用mp提供的批量接口,使用Iservice是比较合适的。
  2. IService的的默认是ServiceImpl<Dao,Entity> 需要提供Dao和对应的Entity,如果只想用其中一个,而且你觉得IService依赖BaseMapper比较多此一举,想要直接使用BaseMapper但有舍不得IService提供的批量增删改的功能,那就往下看如何通过自定义BaseMapper来加入批量功能的实现吧。

1. 自定义BaseMapper

package momenta.hdmap.antbear.common.mpbase;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.baomidou.mybatisplus.extension.conditions.query.QueryChainWrapper;
import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;
import com.baomidou.mybatisplus.extension.conditions.update.UpdateChainWrapper;
import org.apache.ibatis.annotations.Param;

import java.io.Serializable;
import java.util.List;

/**
 * 自定义baseMapper,增加了批量增删改查的方法
 * @author yangxiaohui
 * @since 2020年3月6日16:44:17
 */
public interface MyBaseMapper<T> extends BaseMapper<T> 

    /**
     * 以下定义的 4个 default method,
     * copy from @link com.baomidou.mybatisplus.extension.toolkit.ChainWrappers
     */
    default QueryChainWrapper<T> queryChain() 
        return new QueryChainWrapper<>(this);
    

    default LambdaQueryChainWrapper<T> lambdaQueryChain() 
        return new LambdaQueryChainWrapper<>(this);
    

    default UpdateChainWrapper<T> updateChain() 
        return new UpdateChainWrapper<>(this);
    

    default LambdaUpdateChainWrapper<T> lambdaUpdateChain() 
        return new LambdaUpdateChainWrapper<>(this);
    

    // 以下定义的 4个 method,其中前3个是mybatisPlus内置的选装件(升级到3.3之后才有的)
	// 批量插入
    int insertBatchSomeColumn(List<T> entityList);
	// 批量更新
    int alwaysUpdateSomeColumnById(@Param(Constants.ENTITY) T entity);
	// 批量删除
    int deleteByIdWithFill(T entity);

    //以下为自己自定义method
    T findOne(Serializable id);


2. 自定义sql注入

package momenta.hdmap.antbear.common.mpbase;

import com.baomidou.mybatisplus.annotation.FieldFill;
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 com.baomidou.mybatisplus.extension.injector.methods.LogicDeleteByIdWithFill;

import java.util.List;

/**
 * @author :XiaoHui Yang
 * @version : 1.0.0
 * @description: 自定义sql注入器·
 * @date :Created in 2020/3/6 16:10
 * @modified By:
 */
public class mysqlInjector extends DefaultSqlInjector 

    @Override
    public List<AbstractMethod> getMethodList(Class<?> mapperClass) 
        List<AbstractMethod> methodList = super.getMethodList(mapperClass);
        //增加自定义方法
        methodList.add(new FindOne());

        /**
         * 以下 3 个为内置选装件
         * 头 2 个支持字段筛选函数
         */
        // 例: 不要指定了 update 填充的字段
        methodList.add(new InsertBatchSomeColumn(i -> i.getFieldFill() != FieldFill.UPDATE));
        methodList.add(new AlwaysUpdateSomeColumnById());
        methodList.add(new LogicDeleteByIdWithFill());
        return methodList;
    


3. 加入配置类中

package momenta.hdmap.antbear.config;

import com.baomidou.mybatisplus.core.injector.ISqlInjector;

import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import momenta.hdmap.antbear.common.mpbase.MySqlInjector;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * mybatis-plus配置类
 *
 * @author yangxiaohui
 */
@Configuration
public class MybatisPlusConfig 

    /**
     * 分页插件拦截器
     */
    @Bean
    public PaginationInterceptor paginationInterceptor() 
        return new PaginationInterceptor();
    

    /**
     * 自定义Sql注入器
     */

    @Bean
    public MySqlInjector sqlInjector() 
        return new MySqlInjector();
    



4. 使用

继承自定义的Mapper就可以了,这下可以摆脱IService了,真香~

@Mapper
public interface CaseContextDao extends MyBaseMapper<CaseContextEntity> 
	

备注: 以上使用的是mybatis-plus的3.3版本

以上是关于mybatis-plus 自定义basemapper支持批量增删改操作的主要内容,如果未能解决你的问题,请参考以下文章

Mybatis-Plus BaseMapper自动生成SQL及MapperProxy

MyBatis-Plus - 一篇带你玩转自定义 BaseMapper

MyBatis-Plus - 一篇带你玩转自定义 BaseMapper

MybatisPlus的BaseMapper和Wrapper使用

MybatisPlus的BaseMapper和Wrapper使用

浅谈MyBatis-Plus学习之自定义全局操作及逻辑删除