Mybatis中Mapper资源无法绑定XML文件,及Maven资源过滤?

问题:BindingException异常,即MapperXML之间没有绑定,也就是说Mapper接口没有找XML实现类,很大原因就是在MybatisConfiguration中,没有配置绑定关系,这里我们提供两种存放位置的绑定关系

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);});
    }
}

运行结果:
Mybatis中Mapper资源无法绑定XML文件,及Maven资源过滤?_第1张图片

为什么会报错呢?这里我们先看下我们的maven项目结构如图所示
Mybatis中Mapper资源无法绑定XML文件,及Maven资源过滤?_第2张图片
从这项目结构图中我们明明有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文件也有了
Mybatis中Mapper资源无法绑定XML文件,及Maven资源过滤?_第3张图片
此时我们的测试类查询结果也正常显示结果:
在这里插入图片描述

资源文件存放在src/main/resource

其实绝大部分情况下我们的配置文件是放在src/main/resource下,放在这其实就更简单了,maven会把这里的文件最终编译后和classes文件放在一起,即和我们代码放在classpath下,自然而然也就不需要这个管maven资源过滤

如下图所示:
Mybatis中Mapper资源无法绑定XML文件,及Maven资源过滤?_第4张图片
然后在修改mybatis configuration配置中的绑定关系

<mappers>
     <mapper resource="mapper/OrderMapper.xml"/>
mappers>

我们可以清晰看到src/mian/resource下文件都编译到classes下面,所以也可以正常查出结果,到这,我们就可以很快的解决一开始提出的绑定异常问题了

读取maven项目资源文件请看怎么样读取maven工程resource目录下资源文件?
 
 

你可能感兴趣的:(Mybatis,Maven,java,mybatis,maven)