MyBatis 中 parameterType 属性

MyBatis 中 parameterType 属性的核心解析

一、属性定义

parameterType 是 MyBatis 映射文件(XML)中用于指定 SQL 语句输入参数类型的类型(可以使普通java类型也可以是Pojo实体类),主要作用于 <insert>, <update>, <delete>, <select> 等 CRUD 标签。

二、核心作用
  1. 类型识别
    框架通过此属性确定如何解析参数对象:
    • 基本类型处理(int/String 等)
    • POJO 对象属性映射
    • Map 键值对处理
    • 集合类型处理
  1. 类型转换
    自动处理 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>
四、现代用法演进
  1. 类型自动推断(MyBatis 3.4.5+)
    以下情况可省略 parameterType
<!-- 自动识别为String类型 -->
<select id="findByName" resultType="User">
  SELECT * FROM users WHERE name = #{name}
</select>
  1. 多参数方法
    使用 @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>
五、特殊类型处理

参数类型

处理方式

集合/数组

使用 <foreach> 遍历

枚举类型

需实现 TypeHandler 接口

自定义对象

直接访问对象属性

六、最佳实践建议
  1. 显式声明场景
    当出现以下情况时建议保留:
<!-- 多参数未使用@Param时需声明为map -->
<select id="multiParamSearch" parameterType="map">
  ...
</select>
  1. 类型安全校验
    复杂业务场景显式声明可增强可读性:
<update id="updateProfile" 
        parameterType="com.example.ProfileDTO">
  ...
</update>
  1. 性能优化
    明确指定类型可跳过类型推断过程:
<!-- 明确基本类型提升效率 -->
<delete id="deleteById" parameterType="long">
  DELETE FROM users WHERE id = #{id}
</delete>
七、常见误区
  1. resultType 混淆
    • parameterType:输入参数类型
    • resultType:输出结果类型
  1. 过度依赖自动推断
    复杂对象嵌套时显式声明更可靠
  2. @Param 冲突
    当使用注解指定参数名时,parameterType 实际类型应为 map

通过合理运用 parameterType,可以提升 SQL 映射的清晰度和执行效率,但在现代 MyBatis 版本中更推荐采用类型推断机制保持代码简洁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值