BindingException
异常,即Mapper
和XML
之间没有绑定,也就是说Mapper
接口没有找XML
实现类,很大原因就是在Mybatis
的Configuration
中,没有配置绑定关系,这里我们提供两种存放位置的绑定关系org.apache.ibatis.binding.BindingException: Type interface dao.OrderMapper is not known to the MapperRegistry.
at org.apache.ibatis.binding.MapperRegistry.getMapper(MapperRegistry.java:47)
at org.apache.ibatis.session.Configuration.getMapper(Configuration.java:845)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at
src/main/java
下Configuration 配置绑定关系,主要是指定正确的XML路径
DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/gwmdb?useSSL=false&useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="itsme999"/>
dataSource>
environment>
environments>
<mappers>
<mapper resource="mapper/OrderMapper.xml"/>
mappers>
configuration>
实体类
public class Order {
private String user_id;
private String order_content;
private String order_id;
private Date create_time;
public String getUser_id() {
return user_id;
}
mapper接口的xml实现类
DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="dao.OrderMapper">
<select id="getOrderList" resultType="entity.Order">
select * from ksd_order where order_id = 1
select>
mapper>
mybatis configuration 配置文件
DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/gwmdb?useSSL=false&useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="itsme999"/>
dataSource>
environment>
environments>
<mappers>
<mapper resource="gmaper/OrderMapper.xml"/>
mappers>
configuration>
测试类
public class DaoTest {
@Test
public void test1(){
SqlSession sqlSession = MyBatisUtil.getSqlSession();
OrderMapper mapper = sqlSession.getMapper(OrderMapper.class);
List<Order> orderList = mapper.getOrderList();
orderList.forEach(e->{System.out.println(e);});
}
}
为什么会报错呢?这里我们先看下我们的maven
项目结构如图所示
从这项目结构图中我们明明有gmaper
文件夹,但是在编译后target
文件夹却没有生成,这是为什么呢?
是因为我们把非java文件的配置文件放到src/main/java
目录下面,maven
有一项默认对src/main/java
目录下非java文件的资源过滤配置默认是开启的,这里我们只需要关闭不要过滤,只需要加一段配置即可:
注意:这段配置中我自加了一项额外文件资源不被过滤,所有
txt
文件,这可以忽略
<build>
<resources>
<resource>
<directory>src/main/javadirectory>
<includes>
<include>**/*.propertiesinclude>
<include>**/*.xmlinclude>
<include>**/*.txtinclude>
includes>
<filtering>falsefiltering>
resource>
<resource>
<directory>src/main/resourcesdirectory>
<includes>
<include>**/*.propertiesinclude>
<include>**/*.xmlinclude>
includes>
<filtering>falsefiltering>
resource>
resources>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-compiler-pluginartifactId>
<configuration>
<source>8source>
<target>8target>
configuration>
plugin>
plugins>
build>
加上这段配置之后,我们配置文件就会在编译后的target
目录中清晰的看见,target
中的classes
文件夹其实就是指的我们的classpath
也是我们的根目录/
此时再看下我们的target
目录先就有了gmaper
文件夹,XML
文件也有了
此时我们的测试类查询结果也正常显示结果:
src/main/resource
下其实绝大部分情况下我们的配置文件是放在src/main/resource
下,放在这其实就更简单了,maven
会把这里的文件最终编译后和classes
文件放在一起,即和我们代码放在classpath
下,自然而然也就不需要这个管maven
资源过滤
如下图所示:
然后在修改mybatis configuration配置中的绑定关系
<mappers>
<mapper resource="mapper/OrderMapper.xml"/>
mappers>
我们可以清晰看到src/mian/resource
下文件都编译到classes
下面,所以也可以正常查出结果,到这,我们就可以很快的解决一开始提出的绑定异常问题了
读取maven
项目资源文件请看怎么样读取maven工程resource目录下资源文件?