先给一下org.apache.ibatis.binding.BindingException
异常的概述:
BindingException
是MyBatis中的绑定异常,当Mapper接口和Mapper映射文件出现错误时抛出。在MyBatis中,Mapper接口和Mapper映射文件是对应绑定的,如果Mapper接口方法的参数、返回值类型或SQL语句等配置错误,则会抛出BindingException异常。下面我们来具体分析异常产生的原因以及解决方案。
异常产生的原因
- Mapper接口和Mapper映射文件没有绑定
MyBatis会将Mapper接口和Mapper映射文件通过Mapper接口的完全限定名(包含包路径的类名)进行绑定,如果没有绑定成功,就会抛出BindingException异常。
解决方案: 检查Mapper接口的完全限定名是否与Mapper映射文件的namespace属性值相同,如果不同则需要手动绑定:
@Mapper
public interface UserMapper {
User findUserById(Long id);
}
在映射文件中添加namespace属性与Mapper接口完全限定名一致:
<mapper namespace="com.example.mapper.UserMapper">
<select id="findUserById" resultType="com.example.entity.User">
SELECT * FROM user WHERE id = #{id}
</select>
</mapper>
- Mapper接口方法参数错误
Mapper接口方法的参数类型和数量与Mapper映射文件中配置的SQL语句中的占位符数量和类型不一致,就会抛出BindingException异常。
示例1:
@Mapper
public interface UserMapper {
User findUserByParam(User user);
}
在映射文件中,SQL语句对应的parameterType参数应该为User类型,如下:
<mapper namespace="com.example.mapper.UserMapper">
<select id="findUserByParam" parameterType="com.example.entity.User" resultType="com.example.entity.User">
SELECT * FROM user WHERE name = #{name} AND age = #{age}
</select>
</mapper>
示例2:
@Mapper
public interface UserMapper {
User findUserById(@Param("id") Long id, @Param("name") String name);
}
在映射文件中,SQL语句对应的占位符名称与注解中的@Param标注的参数名称一致,如下:
<mapper namespace="com.example.mapper.UserMapper">
<select id="findUserById" parameterType="java.lang.Long" resultType="com.example.entity.User">
SELECT * FROM user WHERE id = #{id} AND name = #{name}
</select>
</mapper>
解决方案
- 绑定Mapper接口和Mapper映射文件
检查Mapper接口的完全限定名是否与Mapper映射文件的namespace属性值相同, 如果不同则需要手动绑定Mapper,可以在application.properties文件中添加以下配置信息,或者在主入口类上添加@MapperScan注解,逐一扫描需要绑定的Mapper接口。
mybatis.mapper-locations=classpath:mapper/*.xml
示例:
@SpringBootApplication
@MapperScan("com.example.mapper")
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
- 格式化SQL语句
检查Mapper接口方法参数类型和数量是否与Mapper映射文件中配置的SQL语句中的占位符数量和类型一致,如果不同就需要格式化SQL语句。
示例1:
@Mapper
public interface UserMapper {
User findUserById(@Param("id") Long id);
}
在映射文件中,SQL语句对应的占位符应该为#{id},如下:
<mapper namespace="com.example.mapper.UserMapper">
<select id="findUserById" parameterType="java.lang.Long" resultType="com.example.entity.User">
SELECT * FROM user WHERE id = #{id}
</select>
</mapper>
示例2:
@Mapper
public interface UserMapper {
User findUserByParam(User user);
}
在映射文件中,SQL语句对应的parameterType参数值应该为User类型,如下:
<mapper namespace="com.example.mapper.UserMapper">
<select id="findUserByParam" parameterType="com.example.entity.User" resultType="com.example.entity.User">
SELECT * FROM user WHERE name = #{name} AND age = #{age}
</select>
</mapper>
综上所述,通过完善的配置文件和格式化SQL语句,可以避免BindingException异常的产生。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:org.apache.ibatis.binding.BindingException异常报错原因以及详细解决方案 - Python技术站