方法:
Peopel selectOne(@Param("name")String name, @Param("id")int id);
配置文件:
<select id='selectOne'>
select * from test where 1 = 1 and id = ${id} and name = #{name}
</select>
我们进入到这个parse()方法中
跟解析${}一样,但是#{}不是字符串替换,而是用 ? 代替。
我们知道方法参数
public void selectById(@Params("name")String name,@Params("id")int id)
会被ParamNameResolver解析成一个Map,Map中KEY值自然就是注解@Param中的值,VALUE就是我们传进来的值,在解析#{}占位符的时候,每一个#{}占位符都会被解析成一个ParameterMapping对象,ParameterMapping{property='name',mode=IN,javaType=class java.lang.String,jdbcType=null....},当然id也会解析成这个格式,然后将解析好的ParameterMapping存放到一个List中去,具体实现是在
ParameterMappingTokenHandle类中的handleToken方法实现的。我们知道List是个有序集合,所以在将❓替换成我们传的参数就会遍历这个list,然后与我们的参数一一对应起来。整个流程如下图
image.png
循环list得到每个ParameterMapping对象,然后得到该对象的property属性,最后从参数Map中获取到值,之前说过参数经过解析会存储在一个Map中的,在经过这一步之后就能得到一条完整的SQL语句了,select * from test where name = #{name} and id = #{id} 就会解析成
select * from test where name = "bjh" and id = 1。