携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第10天,点击查看活动详情
今天遇到了一个有趣的bug。我的持久层框架采用的是mybatisplus。熟悉这个框架的同学都知道这个框架帮我们实现了基本的增删改查,帮你省了写SQL语句的时间。下午学习的时候,自己写了mapper和对应的xml里的SQL语句,在调用相关功能的时候,出现了org.apache.ibatis.binding.BindingException,所以在此记录下产生这个问题的原因和解决办法。
1.第一种原因
产生org.apache.ibatis.binding.BindingException异常后,建议大家先查看你的mapper对应的xml文件有没有写错。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.atguigu.ggkt.vod.mapper.CourseMapper">
<select id="selectCoursePublishVoById" resultType="com.atguigu.ggkt.vo.vod.CoursePublishVo">
SELECT
c.id,
c.title,
c.cover,
c.lesson_num AS lessonNum,
c.price,
t.name AS teacherName,
s1.title AS subjectParentTitle,
s2.title AS subjectTitle
FROM course c
LEFT OUTER JOIN teacher t ON c.`teacher_id`=t.`id`
LEFT OUTER JOIN SUBJECT s1 ON c.`subject_parent_id`=s1.`id`
LEFT OUTER JOIN SUBJECT s2 ON c.`subject_id`=s2.id
WHERE c.id=#{id} AND c.is_deleted=0
</select>
</mapper>
注意上面的代码块里的id和resultType里面的值。id的值应该是mapper里的方法名,对应如下所示
public interface CourseMapper extends BaseMapper<Course> {
//根据课程id查询发布课程信息
CoursePublishVo selectCoursePublishVoById(Long id);
}
resultType对应的值应该是封装的实体类。如果你这两个地方写错了,那么便会出现org.apache.ibatis.binding.BindingException。知道了原因,解决的办法也就出现了,如果你是id和resultType写错了,那就重新复制粘贴进来即可。
2.第二种原因
如果第一种方式无法解决org.apache.ibatis.binding.BindingException,那么你可以根据第二种方式来解决。在讲第二种方式之前,我们先来了解下maven的加载机制。
maven的加载机制:maven在默认情况下,在src-main-java目录下面,maven之后加载Java类型文件,其他类型文件不会加载
我的xml文件放在这里
看下target目录,你会发现里面没有xml文件。
如果解决有如下几种:
- 直接复制,将你的xml复制到target,但是不推荐。
- 将xml放到resources目录下(其实很多同学一般情况下,xml文件都是放在这里),如果你不想采用第二种方式,你可以看下第三种方式。
- 通过配置方式自动加载。如果你采用第三种方式,那么你需要修改pom文件和配置文件。
pom文件添加如下内容:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.yml</include>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes> <include>**/*.yml</include>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
配置文件,可以说property或者yml,指定你的xml文件在哪
mybatis-plus.mapper-locations=classpath:com/atguigu/ggkt/vod/mapper/xml/*.xml
3.总结
产生org.apache.ibatis.binding.BindingException原因大体上就两种,第一种是xml文件里面的内容写错了。第二种是xml文件程序找不到,这种情况有三种解决方式。