MyBatis 中 Mapper 中的 SQL 语句可以重载吗?

在 MyBatis 中,Mapper 中的 SQL 语句不能重载,每个 SQL 语句的 id 在同一个 namespace(通常是一个 Mapper)中必须是唯一的。

MyBatis 使用 id 来唯一标识一个 SQL 语句,当你调用 Mapper 接口的方法时,MyBatis 会根据方法名找到对应的 SQL 语句并执行。如果有多个 SQL 语句的 id 是相同的,那么 MyBatis 将无法确定应该执行哪个 SQL 语句,因此会抛出错误。

举个例子,以下的 XML 映射文件是不合法的,因为有两个 id 都是 findUser 的 SQL 语句:

<mapper namespace="com.example.UserMapper">
    <select id="findUser" parameterType="int" resultType="User">
        SELECT * FROM users WHERE id = #{id}
    </select>

    <select id="findUser" parameterType="String" resultType="User">
        SELECT * FROM users WHERE username = #{username}
    </select>
</mapper>

如果你想为一个方法定义多个 SQL 语句,那么你需要为每个 SQL 语句定义一个唯一的 id。例如,你可以将 id 改为 findUserByIdfindUserByUsername

<mapper namespace="com.example.UserMapper">
    <select id="findUserById" parameterType="int" resultType="User">
        SELECT * FROM users WHERE id = #{id}
    </select>

    <select id="findUserByUsername" parameterType="String" resultType="User">
        SELECT * FROM users WHERE username = #{username}
    </select>
</mapper>

然后在 Mapper 接口中定义对应的方法:

public interface UserMapper {
    User findUserById(int id);
    User findUserByUsername(String username);
}

这样,当你调用 findUserById 方法时,MyBatis 会执行 findUserById 的 SQL 语句;当你调用 findUserByUsername 方法时,MyBatis 会执行 findUserByUsername 的 SQL 语句。

发表评论

后才能评论