1. resultType
用途:
-
用于定义 SQL 查询结果的返回类型。
-
直接将查询结果映射到指定的 Java 类型(基本类型、POJO 或 Map)。
特点:
-
要求数据库字段名与 Java 对象的属性名完全一致(或通过别名匹配)。
-
适用于简单查询,无法处理复杂的嵌套映射(如关联对象或集合)。
示例:
<select id="selectUser" resultType="com.example.User">
SELECT id, name, age FROM users
</select>
这里,查询结果的字段 id
、name
、age
必须与 User
类的属性名一致。
2. jdbcType
用途:
-
用于指定数据库字段的 JDBC 类型。
-
主要在以下场景中使用:
-
当参数为
null
时,必须显式指定jdbcType
(因为 MyBatis 无法推断类型)。 -
解决某些数据库(如 Oracle)对
null
值的严格类型校验问题。
-
特点:
-
是 JDBC 规范中定义的类型,例如
varchar
、integer
、date等。 -
通常与
parameterType
或#{param}
表达式一起使用。
示例:
<insert id="insertUser">
INSERT INTO users (name, age)
VALUES (#{name, jdbcType=VARCHAR}, #{age, jdbcType=INTEGER})
</insert>
当 name
或 age
参数为 null
时,必须指定 jdbcType
。
3. parameterType
用途:
-
用于定义传入 SQL 语句的参数类型。
-
可以是基本类型(如
int
、String
)、POJO 或 Map。
特点:
-
在 MyBatis 3.4.5 及更高版本中,可以省略
parameterType
,因为框架会自动推断类型。 -
主要用于明确参数类型,或在动态 SQL 中辅助类型检查。
示例:
<select id="selectUserById" parameterType="Long" resultType="User">
SELECT * FROM users WHERE id = #{id}
</select>
这里 parameterType="Long"
表示传入的参数 id
是 Long
类型。
4.对比总结:
5.关键区别:
-
resultType
vsparameterType
-
resultType
关注返回结果的类型映射。 -
parameterType
关注输入参数的类型。
-
-
jdbcType
的特殊性-
jdbcType
是 JDBC 层面的类型标识,与数据库直接交互时使用。 -
在
#{param}
表达式中,jdbcType
用于明确参数在数据库中的类型(尤其在参数为null
时)。
-
6.常见问题:
-
何时必须指定
jdbcType
?-
当参数可能为
null
时(如 Oracle 数据库严格要求jdbcType
)。 -
示例:
#{field, jdbcType=varchar}
。
-
-
parameterType
是否可以省略?-
可以,MyBatis 会自动推断参数类型。但在多参数场景中,推荐使用
@Param
注解或 Map 传递参数。
-
-
resultType
和resultMap
如何选择?-
简单映射用
resultType
,复杂映射(如字段名不一致、嵌套对象)用resultMap
。
-
7.示例场景:
插入数据(使用 jdbcType
):
<insert id="insertUser">
INSERT INTO users (name, age)
VALUES (
#{name, jdbcType=VARCHAR},
#{age, jdbcType=INTEGER}
)
</insert>
多参数查询(省略 parameterType
):
<select id="selectUserByCondition" resultType="User">
SELECT * FROM users
WHERE name = #{name} AND age = #{age}
</select>
总结:
-
resultType
:简化结果映射,要求字段与属性名一致。 -
jdbcType
:解决null
值问题和数据库类型匹配。 -
parameterType
:明确输入参数类型(可省略,自动推断)。
理解这三个配置项的区别,可以避免常见的 MyBatis 映射错误(如 null
值导致的数据库异常或类型不匹配)。