org.apache.ibatis.binding.BindingException产生的原因及解决方法

253 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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>

注意上面的代码块里的idresultType里面的值。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文件放在这里

image.png

看下target目录,你会发现里面没有xml文件。

image.png

如果解决有如下几种:

  1. 直接复制,将你的xml复制到target,但是不推荐
  2. 将xml放到resources目录下(其实很多同学一般情况下,xml文件都是放在这里),如果你不想采用第二种方式,你可以看下第三种方式。
  3. 通过配置方式自动加载。如果你采用第三种方式,那么你需要修改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文件程序找不到,这种情况有三种解决方式。