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注解操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。