MyBatis 中 parameterType 属性
MyBatis 中 parameterType
属性的核心解析
一、属性定义
parameterType
是 MyBatis 映射文件(XML)中用于指定 SQL 语句输入参数类型的类型(可以使普通java类型也可以是Pojo实体类),主要作用于 <insert>
, <update>
, <delete>
, <select>
等 CRUD 标签。
二、核心作用
- 类型识别
框架通过此属性确定如何解析参数对象:
-
- 基本类型处理(int/String 等)
- POJO 对象属性映射
- Map 键值对处理
- 集合类型处理
- 类型转换
自动处理 JDBC 类型与 Java 类型的映射关系
三、使用场景与示例
注意:如果参数是 唯一的且无 @Param
注解,MyBatis 会自动解构对象属性,允许直接写 #{属性名}
场景 1:基本数据类型
<select id="findByAge" parameterType="int" resultType="User">SELECT * FROM users WHERE age = #{value}
</select>
场景 2:POJO 对象
<insert id="insertUser" parameterType="com.example.User">INSERT INTO users(name,email) VALUES(#{name}, #{email})
</insert>
场景 3:Map 参数
<select id="search" parameterType="map" resultType="User">SELECT * FROM users WHERE name = #{nameKey} AND age = #{ageKey}
</select>
四、现代用法演进
- 类型自动推断(MyBatis 3.4.5+)
以下情况可省略parameterType
:
<!-- 自动识别为String类型 -->
<select id="findByName" resultType="User">SELECT * FROM users WHERE name = #{name}
</select>
- 多参数方法
使用@Param
注解时无需声明:
List<User> findByConditions(@Param("name") String name,@Param("minAge") int minAge
);
<select id="findByConditions" resultType="User">SELECT * FROM users WHERE name = #{name} AND age > #{minAge}
</select>
五、特殊类型处理
参数类型 | 处理方式 |
集合/数组 | 使用 |
枚举类型 | 需实现 TypeHandler 接口 |
自定义对象 | 直接访问对象属性 |
六、最佳实践建议
- 显式声明场景
当出现以下情况时建议保留:
<!-- 多参数未使用@Param时需声明为map -->
<select id="multiParamSearch" parameterType="map">...
</select>
- 类型安全校验
复杂业务场景显式声明可增强可读性:
<update id="updateProfile" parameterType="com.example.ProfileDTO">...
</update>
- 性能优化
明确指定类型可跳过类型推断过程:
<!-- 明确基本类型提升效率 -->
<delete id="deleteById" parameterType="long">DELETE FROM users WHERE id = #{id}
</delete>
七、常见误区
- 与
resultType
混淆
-
parameterType
:输入参数类型resultType
:输出结果类型
- 过度依赖自动推断
复杂对象嵌套时显式声明更可靠 - 与
@Param
冲突
当使用注解指定参数名时,parameterType
实际类型应为map
通过合理运用 parameterType
,可以提升 SQL 映射的清晰度和执行效率,但在现代 MyBatis 版本中更推荐采用类型推断机制保持代码简洁。