//方法 User findUser(@Param("name") String name,int age,String email) //对应xml <select id="findUser" resultType="cn.mrdear.users.dao.User"> SELECT * FROM user WHERE username = #{name} AND age = #{age} AND email = #{email} </select> //调用参数 final User user = userMapper.findUser("quding", 18, "qq@mail.com");
publicParamNameResolver(Configuration config, Method method){ final Class<?>[] paramTypes = method.getParameterTypes();//获取参数类型,对于上述例子则是String,int,String final Annotation[][] paramAnnotations = method.getParameterAnnotations();//这里获取到的则是@Param,getParameterAnnotations方法也用到了动态代理. final SortedMap<Integer, String> map = new TreeMap<Integer, String>(); int paramCount = paramAnnotations.length; // get names from @Param annotations for (int paramIndex = 0; paramIndex < paramCount; paramIndex++) { if (isSpecialParameter(paramTypes[paramIndex])) { //过滤其内部一些特殊类型 // skip special parameters continue; } String name = null; for (Annotation annotation : paramAnnotations[paramIndex]) { if (annotation instanceof Param) { hasParamAnnotation = true; name = ((Param) annotation).value();//获取到'name'值 break; } } if (name == null) { // @Param was not specified. if (config.isUseActualParamName()) {//默认为true,因此编译后参数都是args0,args1之类,因此这里获取的也是args0... name = getActualParamName(method, paramIndex); } //当上面配置为false的时候这里才会使用0,1代替,因此如果未开启则会报错 if (name == null) { // use the parameter index as the name ("0", "1", ...) // gcode issue #71 name = String.valueOf(map.size());//上述都没的话则世界使用map的index. } } map.put(paramIndex, name); } names = Collections.unmodifiableSortedMap(map); }
//mapper接口 User findUser(@Param("name") String name, @Param("user") User user,@Param("ids") List<Long> ids); //xml <select id="findUser" resultType="cn.mrdear.users.dao.User"> SELECT * FROM user WHERE username = #{name} AND age = #{user.age} AND email = #{user.email} OR id in <foreach collection="ids" item="item" open="(" close=")" separator=","> #{item} </foreach> </select>