java注解省略value,mybatis省略@Param注解操作项⽬是Springboot+mybatis,每次写⼀堆@Param注解感觉挺⿇烦,就⽅法想把这个注解给省了,最后确实到⼀个⽅法
1.在mybatis的配置⾥有个属性useActualParamName,允许使⽤⽅法签名中的名称作为语句参数名称
我⽤的mybatis:3.4.2版本Configuration中useActualParamName的默认值为true
源码简单分析:
MapperMethod的execute⽅法中获取参数的⽅法convertArgsToSqlCommandParam
public Object execute(SqlSession sqlSession, Object[] args) {
Object result;
Object param;
Type()) {
case INSERT:
param = vertArgsToSqlCommandParam(args);
result = wCountResult(sqlSession.Name(), param));
break;
case UPDATE:
param = vertArgsToSqlCommandParam(args);
result = wCountResult(sqlSession.Name(), param));
break;
case DELETE:
param = vertArgsToSqlCommandParam(args);
result = wCountResult(sqlSession.Name(), param));
break;
case SELECT:
if (urnsVoid() && hod.hasResultHandler()) {
result = null;
} else if (urnsMany()) {
result = uteForMany(sqlSession, args);
} else if (urnsMap()) {
result = uteForMap(sqlSession, args);
} else if (urnsCursor()) {
result = uteForCursor(sqlSession, args);
} else {
param = vertArgsToSqlCommandParam(args);
result = sqlSession.Name(), param);
if (urnsOptional() && (result == null || !ReturnType().Class()))) {
result = Optional.ofNullable(result);
}
}
break;
case FLUSH:
result = sqlSession.flushStatements();
break;
default:
throw new BindingException("Unknown execution method for: " + Name());
}
if (result == null && ReturnType().isPrimitive() && !urnsVoid()) {
throw new BindingException("Mapper method '" + Name() + " attempted to return null from a method with a primitive return type (" + ReturnType() + ").");
} else {
return result;
}
}
然后再看参数是怎么来的,convertArgsToSqlCommandParam在MapperMethod的内部类MethodSignature中:
public Object convertArgsToSqlCommandParam(Object[] args) {
return NamedParams(args);
}
getNamedParams在ParamNameResolver,看⼀下ParamNameResolver的构造⽅法:
public ParamNameResolver(Configuration config, Method method) {
Class>[] paramTypes = ParameterTypes();param name
Annotation[][] paramAnnotations = ParameterAnnotations();
SortedMap map = new TreeMap();
int paramCount = paramAnnotations.length;
for(int paramIndex = 0; paramIndex < paramCount; ++paramIndex) {
if (!isSpecialParameter(paramTypes[paramIndex])) {
String name = null;
Annotation[] var9 = paramAnnotations[paramIndex];
int var10 = var9.length;
for(int var11 = 0; var11 < var10; ++var11) {
Annotation annotation = var9[var11];
if (annotation instanceof Param) {
this.hasParamAnnotation = true;
name = ((Param)annotation).value();
break;
}
}
if (name == null) {
if (config.isUseActualParamName()) {
name = ActualParamName(method, paramIndex);
}
if (name == null) {
name = String.valueOf(map.size());
}
}
map.put(paramIndex, name);
}
}
this.names = Collections.unmodifiableSortedMap(map);
}
isUseActualParamName出现了,总算到正主了,前边⼀堆都是瞎扯。
2.只有这⼀个属性还不⾏,还要能取到⽅法⾥定义的参数名,这就需要java8的⼀个新特性了,在maven-compiler-plugin编译器的配置项中配置-parameters参数。
在Java 8中这个特性是默认关闭的,因此如果不带-parameters参数编译上述代码并运⾏,获取到的参数名是arg0,
带上这个参数后获取到的参数名就是定义的参数名了,例如void test(String testArg1, String testArg2),取到的就是
testArg1,testArg2。
最后就把@Param注解给省略了,对于想省事的开发来说还是挺好⽤的
补充知识:mybatis使⽤@param("xxx")注解传参和不使⽤的区别
我就废话不多说了,⼤家还是直接看代码吧~
public interface SystemParameterMapper {
int deleteByPrimaryKey(Integer id);
int insert(SystemParameterDO record);
SystemParameterDO selectByPrimaryKey(Integer id);//不使⽤注解
List selectAll();
int updateByPrimaryKey(SystemParameterDO record);
SystemParameterDO getByParamID(@Param("paramID") String paramID);//使⽤注解
}
跟映射的xml
select id, paramID, paramContent, paramType, memo
from wh_system_parameter
where id = #{id,jdbcType=INTEGER}
select id, paramID, paramContent, paramType, memo
from wh_system_parameter
where paramID = #{paramID}
区别是:使⽤注解可以不⽤加parameterType
以上这篇mybatis省略@Param注解操作就是⼩编分享给⼤家的全部内容了,希望能给⼤家⼀个参考,也希望⼤家多多⽀持脚本之家。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。