MyBatis:将映射器 xml 文件放在 java 下的映射器接口旁边

MyBatis: putting mapper xml files next to mapper interfaces under java

我正在寻找将映射器 xml 文件从 "resources" 下移动到 "java" 文件夹下的方法。我希望这是可能的,因为这样 interface.java 文件和 mapper.xml 文件将并排。

我正在使用 Spring 启动。

application.properties:

mybatis.config-locations = classpath:mybatis-config.xml

resources/mybatis-config.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>
  <mappers>
    <mapper url="file:///home/abc/Projects/myproject/myapp/src/main/java/com/abc/services/myservice/MyMapper.xml"/>
  </mappers>
</configuration>

文件夹/home/abc/Projects/myproject/myapp/src/main/java/com/abc/services/myservice/

MyMapper.xml
MyMapper.java

当我 运行 应用程序时,出现 'not found' 错误:

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.abc.bm.services.myservice.MyMapper.findAll

有办法实现吗?

您需要将资源文件从源文件夹复制到目标输出文件夹。

对于 Maven,这是使用 maven-resource-plugin:

完成的
<plugin>
        <artifactId>maven-resources-plugin</artifactId>
        <version>2.6</version>
        <executions>
            <execution>
                <id>copy-resources01</id>
                <phase>process-classes</phase>
                <goals>
                    <goal>copy-resources</goal>
                </goals>
                <configuration>
                    <outputDirectory>${basedir}/target/classes</outputDirectory>
                    <encoding>UTF-8</encoding>
                    <resources>
                        <resource>
                            <directory>${basedir}/src</directory>
                            <includes>
                                <include>**/*.xml</include>
                            </includes>
                        </resource>
                    </resources>
                </configuration>
            </execution>
      </executions>
</plugin>

如果您使用的是 gradle,配置类似于:

sourceSets {
    main {
        resources {
            srcDirs = ["src/main/java"]
            includes = ["**/*.xml"]
        }
    }
}

或者,我使用 resource 属性,如:

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

只是一个适合我的想法,使用相对路径。

您可以添加

等资源
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
        </resource>
        <resource>
            <directory>src/main/java</directory>
            <excludes>
                <exclude>**/*.java</exclude>
            </excludes>
        </resource>
    </resources>
</build>