Skip to content

引言

这是在迭代需求的时候发现的一个问题,改个Mapper的方法加了参数,比如:

java
List<Xxx> findXxx(@Param("aa") String aa); ==> List<Xxx> findXxx(@Param("aa") String aa, @Param("bb") String bb);

信心满满直接部署测试环境,结果Error了!!!

原因

  • 原始Mapper接口
java
List<Xxx> findXxx(@Param("aa") String aa);
  • 原始的Mapper.xml
xml
<select id="findXxx" parameterType="java.lang.String" resultMap="BaseResultMap">
select ...
</select>
  • 然后加了个参数
java
List<Xxx> findXxx(@Param("aa") String aa, @Param("bb") String bb);
  • 踩过坑或者细心的朋友们肯定发现了问题,那就是:parameterType="java.lang.String",多个参数得将这个去掉,不然的话mybatits不知道parameterType指向哪个

结论

  • 所以在使用mybatits时尽量用对象传参,然后就是parameterType没特殊必要不要写,不知道parameterType用来干嘛的

后续

问了下大语言模型,是这么回答的:

markdown
在 MyBatis 中,parameterType 属性用于指定传入 SQL 语句的参数类型。虽然 parameterType 不是必须的,但在某些情况下明确指定它可以带来一些好处。下面详细说明 parameterType 的写与不写之间的关系及其影响:

1. 明确性
写 parameterType:
明确指定参数类型可以提高代码的可读性和维护性。其他开发者或未来的你自己可以更容易地理解传递给 SQL 语句的参数类型。
有助于避免潜在的类型错误,特别是在复杂的查询中。
不写 parameterType:
如果不写 parameterType,MyBatis 会尝试自动推断参数类型。对于简单的数据类型(如 int, String 等),通常不会有问题。
对于复杂对象(如 Java 对象),MyBatis 会根据传入的对象类型进行映射,但可能会导致一些不确定性。

2. 性能和效率
写 parameterType:
明确指定参数类型可以帮助 MyBatis 更高效地处理参数。特别是当使用复杂对象时,MyBatis 可以直接使用指定的类型进行映射,而不需要进行额外的类型推断。
不写 parameterType:
MyBatis 需要进行类型推断,这可能会引入一些额外的开销。但对于大多数情况,这种开销是可以忽略不计的。

3. 类型检查
写 parameterType:
在编译时或运行时,明确指定参数类型可以帮助捕获一些类型相关的错误。例如,如果传入的参数类型与 parameterType 不匹配,MyBatis 可能会抛出异常。
不写 parameterType:
如果不写 parameterType,MyBatis 会尽量适应传入的参数类型,但这可能会掩盖一些潜在的类型问题,直到运行时才会发现。

4. 复杂对象的映射
写 parameterType:
当传递复杂对象(如 Java 对象)时,明确指定 parameterType 可以确保 MyBatis 正确地映射对象的属性。这对于复杂的查询和更新操作尤其重要。
不写 parameterType:
如果不写 parameterType,MyBatis 会尝试根据传入的对象类型进行映射,但可能会导致一些不确定性和潜在的错误。例如,如果对象的属性名与 SQL 语句中的占位符不匹配,可能会导致错误。

所以,还是不写为妙,哈哈!!人和代码有一个能跑就行.jpg