• Mybatis的BindingException异常产生原因及解决办法详解


    一. 问题背景

    今天壹哥在讲完MyBatis后,有学生在进行代码练习时遇到了下面这样的一个异常,先上图:

    二. 问题分析

    1. 原因分析

    首先我们看到,这里抛出的异常是org.apache.ibatis.binding.BindingException,接着再看异常的信息是 Invalid bound statement (not found): com.qf.mapper.EmpMapper.list。基于这两点,我们大概能定位到是Mapper绑定产生的异常。

    我们知道,在MyBatis中我们需要先定义一个Mapper接口,在接口中定义方法。然后再定义一个Mapper.xml,在XML文件中编写方法对应的SQL语句,这也是java代码和sql语句分离的体现。我们在调用Mapper接口中的方式时MyBatis会给我们创建一个该接口的代理类,通过代理类来调用Mapper接口中的方法。

    现在有了代理就可以调用方法了,但是怎么找到这个方法对应的SQL语句呢?此时就需要把Mapper接口和Mapper.xml进行绑定,只有绑定了MyBatis才知道方法对应的sql语句,我们通过代理调用方法是才能正常运行sql语句。那么这个异常就是报的绑定异常,说没有找到com.qf.mapper.EmpMapper.list()对应的sql语句。

    那如何把它们两个绑定呢?看下面代码。

    2. 定义EmpMapper接口

    1. package com.qf.mapper;
    2. import com.qf.core.dao.BaseDao;
    3. import com.qf.entity.Emp;
    4. import org.omg.CORBA.INTERNAL;
    5. public interface EmpMapper extends BaseDao {
    6. public Emp selectById(Integer empno);
    7. }

    3. 定义EmpMapper.xml

    1. "1.0" encoding="UTF-8" ?>
    2. mapper
    3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    5. <mapper namespace="com.qf.mapper.EmpMapper">
    6. <select id="list" resultType="emp">
    7. select * from t_emp
    8. select>
    9. mapper>

    在Mapper.xml中通过namespace属性和接口绑定,这个属性中设置的需要绑定的接口全类名。这里设置的是com.qf.mapper.EmpMapper,就代表当前EmpMapper.xml就和EmpMapper.java绑定了。然后在通过