问题: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路径
<?xml version="1.0" encoding="UTF-8" ?>
<!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>
<!--指定Mapper接口的实现类xml文件-->
<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实现类
<?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="dao.OrderMapper">
<select id="getOrderList" resultType="entity.Order">
select * from ksd_order where order_id = 1
</select>
</mapper>
mybatis configuration 配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!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>
<!--mapper和xml之间的绑定关系-->
<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/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
<include>**/*.txt</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</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目录下资源文件?