MyBatis参数处理
大约 2 分钟
参数处理,指在Mapper接口的方法中,对方法参数的定义、传值规范。
SQL映射文件的较完整写法:
<select id="selectByName" resultType="student" parameterType="java.lang.String">
select * from t_student where name = #{name, javaType=String, jdbcType=VARCHAR}
</select>- parameterType:告诉mybatis这个sql对应mapper方法的参数类型。
- javaType:传值时的java类型
- jdbcType:表中对应字段的数据库类型
Mybatis有着强大的自动类型推断机制,这些配置都可以省略。
单个参数
当接口方法中只有一个参数时,允许的参数类型和传值规范。
简单类型参数
简单类型包括:
- byte short int long float double char
- Byte Short Integer Long Float Double Character
- String
- java.util.Date
- java.sql.Date
当方法参数为简单类型时,占位符(至多1)的key可以随意,在调用方法时传的值会直接赋给占位符。
- mybatis可以自动类型识别,即只能调用
ps.setXxx()。
使用Map传参
调用mapper方法时,传入一个map对象,传值时使用 map.get(key) 方法获取sql参数值。
- 占位符中key即为map的key
使用POJO传参
亦称为实体类参数。
使用setter、getter进行sql的传值和结果集的封装。
占位符中的key即为POJO对应的getter,调用getter获取sql参数,结果集的列会查找对应的setter进行封装。
- 对应:setXxx、getXxx中的Xxx转小驼峰。
多参数
当接口方法中有多个参数时,允许的参数类型和传值规范。
?只允许多个简单类型参数。更复杂的情况手动封装map或pojo传值。
在方法声明中,指定多个参数后,mybatis底层的代理mapper中会自动封装方法的多个参数为一个Map,再使用这个Map进行sql传值。
- 亦即,底层仍然是单Map传参,只不过这个map由mybatis创建。
- sql传值时,是根据占位符的key,在这个map中找。
底层Map的特性:
- 根据参数位置,对应的 key 是
"arg"+index或"param“+no,如 arg0、param1。 - value即传入的实际参数。
- param+no 是mybatis底层使用的,不会被 @param 注解等修改键值。
传值时的注意点:
- 占位符的key只能是:
"arg"+index或"param“+no。(不使用@param的情况下) - 使⽤mybatis3.4.2之前的版本时:要⽤#{0}和#{1}这种形式(对应arg0、arg1)。
使用@Param
多参数中,使用@param注解,可以指定底层Map的key,从而在sql中使用自定义的key,增强可读性。
List<Student> selectByNameAndAge(
@Param(value="name") String name,
@Param("age") int age
);
// 在参数前使用 @Param,将这个参数的底层Map中的arg键值更改为注解指定的值在sql中使用 #{name}、#{age} 即可。
底层map的key为:name、age、param1、param2。(arg键值被更改)
@Param 源码解析:

