我的Dao层代码继承BaseMapper之后,我原来的自定义的insert执行语句执行失败。原因是:mp把我的执行语句拦截,根据默认的主键生成策略,把主键填充到了实体参数中。这违背了MP的无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑的特性。本来应该是,即使我继承了BaseMapper,在我没有主动使用BaseMapper提供给我的增强功能,就不应该“污染”原有的代码逻辑。说具体一点,就是第一优先级是,我的主键生成策略,其次是,mp提供的第三方主键生成策略。而不是相反。由于mp的主键生成策略优先级太高,我必须把以前代码的所有实体类的id属性上面添加注解@TableId(type = IdType.AUTO),这是非常糟糕的。

当前使用版本(必填,否则不予处理)

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

该问题是如何引起的?(确定最新版也有问题再提!!!)

Dao层代码继承BaseMapper之后,我自己开发的插入语句执行失败。

public interface UserMapper extends BaseMapper<User>{

    void insertMyselfDevelopMethod(List<User> list);
}

重现步骤(如果有就写完整)

上述sql语句在xml中自己编写。执行上述语句即可。

报错信息

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.ReflectionException: Could not set property 'id' of 'class com.ke.entity.User' with value '1344166663423033346' Cause: java.lang.IllegalArgumentException: argument type mismatch
    at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:92)
    at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:440)
    at com.sun.proxy.$Proxy95.insert(Unknown Source)
    at org.mybatis.spring.SqlSessionTemplate.insert(SqlSessionTemplate.java:271)
    at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:60)
    at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:148)
    at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89)
    at com.sun.proxy.$Proxy166.insertBrwMonStatis(Unknown Source)
    at com.ke.service.impl.UserServiceImpl.insertMyselfDevelopMethod(UserServiceImpl.java:20)
    at com.ke.job.selfdata.GetStatisResult.lambda$0(GetStatisResult.java:72)
    at com.ke.job.selfdata.GetStatisResult.processData(GetStatisResult.java:116)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84)
    at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Caused by: org.apache.ibatis.reflection.ReflectionException: Could not set property 'id' of 'class com.ke.entity.User' with value '1344166663423033346' Cause: java.lang.IllegalArgumentException: argument type mismatch
    at org.apache.ibatis.reflection.wrapper.BeanWrapper.setBeanProperty(BeanWrapper.java:185)
    at org.apache.ibatis.reflection.wrapper.BeanWrapper.set(BeanWrapper.java:59)
    at org.apache.ibatis.reflection.MetaObject.setValue(MetaObject.java:140)
    at com.baomidou.mybatisplus.core.MybatisParameterHandler.populateKeys(MybatisParameterHandler.java:131)
    at com.baomidou.mybatisplus.core.MybatisParameterHandler.process(MybatisParameterHandler.java:112)
    at java.util.ArrayList.forEach(ArrayList.java:1257)
    at com.baomidou.mybatisplus.core.MybatisParameterHandler.processParameter(MybatisParameterHandler.java:79)
    at com.baomidou.mybatisplus.core.MybatisParameterHandler.<init>(MybatisParameterHandler.java:64)
    at com.baomidou.mybatisplus.core.MybatisXMLLanguageDriver.createParameterHandler(MybatisXMLLanguageDriver.java:35)
    at org.apache.ibatis.session.Configuration.newParameterHandler(Configuration.java:645)
    at org.apache.ibatis.executor.statement.BaseStatementHandler.<init>(BaseStatementHandler.java:69)
    at org.apache.ibatis.executor.statement.PreparedStatementHandler.<init>(PreparedStatementHandler.java:41)
    at org.apache.ibatis.executor.statement.RoutingStatementHandler.<init>(RoutingStatementHandler.java:46)
    at org.apache.ibatis.session.Configuration.newStatementHandler(Configuration.java:658)
    at com.baomidou.mybatisplus.core.executor.MybatisSimpleExecutor.doUpdate(MybatisSimpleExecutor.java:54)
    at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:117)
    at com.baomidou.mybatisplus.core.executor.MybatisCachingExecutor.update(MybatisCachingExecutor.java:85)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:197)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:184)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:426)
    ... 23 common frames omitted
Caused by: java.lang.IllegalArgumentException: argument type mismatch
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.ibatis.reflection.invoker.MethodInvoker.invoke(MethodInvoker.java:44)
    at org.apache.ibatis.reflection.wrapper.BeanWrapper.setBeanProperty(BeanWrapper.java:180)
    ... 46 common frames omitted

Comment From: qmdx

查看下文档 全局配置 https://baomidou.com/config/#configurationproperties 主键策略为 auto 这样不需要注解了,自己写的方法异常问题,请排查 xml 是否编写正确,更多参考 https://github.com/baomidou/mybatis-plus-samples 自定义注入样例

Comment From: liukeqing

xml编写是没有问题的。原先的执行流程是正常运行的。你说的全局配置也是可以解决问题的。但是,这样与我原生myabatis的配置产生了冲突。我认为这样解决依然没有解决侵入性问题。最好的解决方案就是:在自动填充主键之前,应该首先判断全局配置了主键策略,或者主键属性上面添加了相关的注解。如果没有这些配置,应该依然走原生的流程;如果有相关配置,才做配置需要的填充方法。 或者说,主键生成策略的默认配置,应该是原生方式,而不是其他。