mybatis省略@Param注解操作
项目是Springboot+mybatis,每次写一堆@Param注解感觉挺麻烦,就找方法想把这个注解给省了,最后确实找到一个方法
1.在mybatis的配置里有个属性useActualParamName,允许使用方法签名中的名称作为语句参数名称
我用的mybatis:3.4.2版本Configuration中useActualParamName的默认值为true
源码简单分析:
MapperMethod的execute方法中获取参数的方法convertArgsToSqlCommandParam publicObjectexecute(SqlSessionsqlSession,Object[]args){ Objectresult; Objectparam; switch(this.command.getType()){ caseINSERT: param=this.method.convertArgsToSqlCommandParam(args); result=this.rowCountResult(sqlSession.insert(this.command.getName(),param)); break; caseUPDATE: param=this.method.convertArgsToSqlCommandParam(args); result=this.rowCountResult(sqlSession.update(this.command.getName(),param)); break; caseDELETE: param=this.method.convertArgsToSqlCommandParam(args); result=this.rowCountResult(sqlSession.delete(this.command.getName(),param)); break; caseSELECT: if(this.method.returnsVoid()&&this.method.hasResultHandler()){ this.executeWithResultHandler(sqlSession,args); result=null; }elseif(this.method.returnsMany()){ result=this.executeForMany(sqlSession,args); }elseif(this.method.returnsMap()){ result=this.executeForMap(sqlSession,args); }elseif(this.method.returnsCursor()){ result=this.executeForCursor(sqlSession,args); }else{ param=this.method.convertArgsToSqlCommandParam(args); result=sqlSession.selectOne(this.command.getName(),param); if(this.method.returnsOptional()&&(result==null||!this.method.getReturnType().equals(result.getClass()))){ result=Optional.ofNullable(result); } } break; caseFLUSH: result=sqlSession.flushStatements(); break; default: thrownewBindingException("Unknownexecutionmethodfor:"+this.command.getName()); } if(result==null&&this.method.getReturnType().isPrimitive()&&!this.method.returnsVoid()){ thrownewBindingException("Mappermethod'"+this.command.getName()+"attemptedtoreturnnullfromamethodwithaprimitivereturntype("+this.method.getReturnType()+")."); }else{ returnresult; } }
然后再看参数是怎么来的,convertArgsToSqlCommandParam在MapperMethod的内部类MethodSignature中:
publicObjectconvertArgsToSqlCommandParam(Object[]args){ returnthis.paramNameResolver.getNamedParams(args); }
getNamedParams在ParamNameResolver,看一下ParamNameResolver的构造方法:
publicParamNameResolver(Configurationconfig,Methodmethod){ Class>[]paramTypes=method.getParameterTypes(); Annotation[][]paramAnnotations=method.getParameterAnnotations(); SortedMapmap=newTreeMap(); intparamCount=paramAnnotations.length; for(intparamIndex=0;paramIndex isUseActualParamName出现了,总算找到正主了,前边一堆都是瞎扯。
2.只有这一个属性还不行,还要能取到方法里定义的参数名,这就需要java8的一个新特性了,在maven-compiler-plugin编译器的配置项中配置-parameters参数。
在Java8中这个特性是默认关闭的,因此如果不带-parameters参数编译上述代码并运行,获取到的参数名是arg0,arg1......
带上这个参数后获取到的参数名就是定义的参数名了,例如voidtest(StringtestArg1,StringtestArg2),取到的就是testArg1,testArg2。
最后就把@Param注解给省略了,对于想省事的开发来说还是挺好用的
补充知识:mybatis使用@param("xxx")注解传参和不使用的区别
我就废话不多说了,大家还是直接看代码吧~
publicinterfaceSystemParameterMapper{ intdeleteByPrimaryKey(Integerid); intinsert(SystemParameterDOrecord); SystemParameterDOselectByPrimaryKey(Integerid);//不使用注解 ListselectAll(); intupdateByPrimaryKey(SystemParameterDOrecord); SystemParameterDOgetByParamID(@Param("paramID")StringparamID);//使用注解 } 跟映射的xml
selectid,paramID,paramContent,paramType,memo fromwh_system_parameter whereid=#{id,jdbcType=INTEGER} selectid,paramID,paramContent,paramType,memo fromwh_system_parameter whereparamID=#{paramID} 区别是:使用注解可以不用加parameterType
以上这篇mybatis省略@Param注解操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。