在使用mybatis进行简单查询时报了一个这样的错:
org.apache.ibatis.binding.BindingException:Invalid bound statement (not found): org.lujx.dao.StudentDAO.getStudentById
at org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(MapperMethod.java:223)
at org.apache.ibatis.binding.MapperMethod.<init>(MapperMethod.java:48)
at org.apache.ibatis.binding.MapperProxy.cachedMapperMethod(MapperProxy.java:59)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:52)
at com.sun.proxy.$Proxy12.getStudentById(Unknown Source)
at org.lujx.service.StudentService.getStudent(StudentService.java:15)
at org.lujx.test.StudentServiceTest.testGetStudent(StudentServiceTest.java:22)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
错误表示的是mapper.xml和DAO.java文件没有对应绑定。
首先检查直接关联的两个文件,本例子中的是StudentDAO.java和StudentDAO.xml两个文件,其中的xml文件中namespace要对应DAO中的包名类名所在的准确位置,其次还要注意字符串的格式。(位置映射正确是前提)
<mapper namespace="org/lujx/dao/StudentDAO"> 这种格式是错的
<select id="getStudentById" parameterType="int" resultType="Student">
select * from students where id=#{id}
</select>
</mapper>
应该写成namespace="org.lujx.dao.StudentDAO"
一般情况到这里就解决了,如果还是有报错,还要检查一下几个方面(本人从网上的前辈经验总结的):
1.检查方法的命名是否一致
xml文件的select标签的id对应dao文件的方法名,两者必须完全一致
2.检查参数和返回值是否一致
xml文件中的parameterType要和dao文件方法的传入参数一致;dao文件中的返回值要有xml中的resultMap或者resultType对应,请注意,如果没有自定义的resultMap,请注意返回值格式。
3.确认引入xml配置文件是否正确(例子如下)
<property name="configLocation" value="classpath:org/lujx/configuration/mybatis-config.xml"/>
<property name="mapperLocations" value="classpath:org/lujx/mappers/**/*.xml"></property>
<property name="typeAliasesPackage" value="org/lujx/model"></property>
ps:以上是配置sqlSessionFactory是的配置项,也可以在mybatis的配置文件里配置,主要注意的是文件路径