FileNotFoundException:mybatis配置,映射器

时间:2016-04-21 07:09:50

标签: java maven mybatis

我的第一个部署maven项目。 我是基于Netty和myBatis开发的

编辑:

这是在src目录树下。

├─main
│  ├─java
│  │  └─kr
│  │      └─stocktalk
│  │          ├─chat
│  │          │  ├─bean
│  │          │  ├─client
│  │          │  ├─codec
│  │          │  ├─common
│  │          │  └─lib
│  │          ├─cloudmessage
│  │          ├─db
│  │          │  ├─clients
│  │          │  └─dynamo
│  │          │      └─mappers
│  │          ├─handler
│  │          │  ├─chat
│  │          │  └─page
│  │          └─mybatis
│  │              ├─bean
│  │              ├─mapper
│  │              └─sql
│  └─resources
│      ├─error
│      ├─html
│      │  └─test
│      ├─mybatis
│      │  └─sql
│      └─snippet
└─test
    ├─java
    └─resources

以下是target

mvn compile目录结果
pom.xml
targets
├─classes
│  └─kr
│      └─stocktalk
│          ├─chat
│          │  ├─bean
│          │  ├─client
│          │  ├─codec
│          │  ├─common
│          │  ├─handler
│          │  └─lib
│          ├─cloudmessage
│          ├─db
│          │  ├─clients
│          │  └─dynamo
│          │      └─mappers
│          ├─handler
│          │  └─page
│          └─mybatis
│              ├─bean
│              ├─mapper
│              └─sql
├─generated-sources
│  └─annotations
├─resources
│  ├─error
│  ├─html
│  │  └─test
│  ├─mybatis
│  │  └─sql
│  └─snippet
└─test-classes

我想将mybatis-conf.xml置于具有mybatis配置信息的resources/mybatis下。

SqlSessionFactoryManager班, 我写了这样的代码

String resource = System.getProperty("user.dir") 
                + "/target/resources/mybatis/mybatis-conf.xml";
Reader reader = Resources.getResourceAsReader(resource);

if (sqlSessionFactory == null) {

    sqlSessionFactory = new SqlSessionFactoryBuilder()
                        .build(reader);
}
...

但是发生错误。

  

java.io.IOException:找不到资源d:\ workspace \ stocktalk-chat / target / resources / mybatis / mybatis-conf.xml

当我尝试使用绝对路径加载mybatis-conf.xml时, 然后把文件丢了很好,很好。好吧..现在我可以看到另一个问题。

  

mybatis / sql / User.xml中可能存在错误   原因:org.apache.ibatis.builder.BuilderException:解析SQL Mapper配置时出错。原因:java.io.IOException:找不到资源mybatis / sql / User.xml

为什么getResourceAsReader无法找到我的配置文件? 如何加载mybatis-conf.xml相对路径?

4 个答案:

答案 0 :(得分:2)

我认为你在项目中使用maven。因此,当maven项目包(mvn包或mvn编译)时,如果你没有配置build元素,那么maven只默认移动类文件到target.So如果你想要将* .properties * .xml * .....文件打包到目标,你必须在build元素下配置resources元素 例如:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.6.0</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
    </plugins>

        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                    <include>**/*.properties</include>
                </includes>
            </resource>
        </resources>
    </build>

如果您查看文件(mybatis-config.xml)是您的路径,它确实不存在。

答案 1 :(得分:1)

我认为回顾 Maven 的工作原理会有所帮助。

您不应在代码中引用 target 文件夹,因为这是 maven 用来放置不同构建过程和构建最终工件的阶段的结果的文件夹,并且很可能不会出现在您的最终部署环境中。理想情况下,您不需要手动修改此文件夹。

现在回答你的问题,mybatis的配置文件和mapper配置文件一般都被认为是你的代码和最终应用的一部分。这就是它们被放置在 resources 中的 src 文件夹中的原因,因此它们最终会成为最终构建工件的一部分,并在最终部署应用程序时成为类路径的一部分。您应该通过类路径访问它们。

下面是mybatis doc website中如何读取mybatis的xml配置的例子:

String resource = "org/mybatis/builder/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(inputStream);

在你的情况下,第一行应该是: String resource = "mybatis/mybatis-conf.xml";

至于映射器位置,这需要再次配置为 mybatis-conf.xml 中的类路径资源

来自 mybatis doc website 的示例(滚动到底部):

<!-- Using classpath relative resources -->
<mappers>
  <mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
  <mapper resource="org/mybatis/builder/BlogMapper.xml"/>
  <mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>

<!-- Using url fully qualified paths -->
<mappers>
  <mapper url="file:///var/mappers/AuthorMapper.xml"/>
  <mapper url="file:///var/mappers/BlogMapper.xml"/>
  <mapper url="file:///var/mappers/PostMapper.xml"/>
</mappers>

<!-- Using mapper interface classes -->
<mappers>
  <mapper class="org.mybatis.builder.AuthorMapper"/>
  <mapper class="org.mybatis.builder.BlogMapper"/>
  <mapper class="org.mybatis.builder.PostMapper"/>
</mappers>

<!-- Register all interfaces in a package as mappers -->
<mappers>
  <package name="org.mybatis.builder"/>
</mappers>

因此,在您的情况下,如果您仅使用 xml 映射器,并从您发布的消息中将以下内容添加到您的 mybatis-conf.xml

<mappers>
  <mapper resource="mybatis/sql/User.xml"/>
</mappers>

答案 2 :(得分:0)

如果mybatis-conf.xml位于main / resources下,那么在您的代码中,您可以执行此操作而不用担心物理路径:

new SqlSessionFactoryBuilder().build(super.getClass().getClassLoader().getResourceAsStream("mybatis-conf.xml")) 

mybatis-conf.xml将在类路径中找到。如果您确实需要main/resources/mybatis,则可以执行以下操作:

new SqlSessionFactoryBuilder().build(super.getClass().getClassLoader().getResourceAsStream("mybatis/mybatis-conf.xml"))

运行Maven应用程序时,目标资源文件夹应该是类路径的一部分,因此不必指定资源。此外,User.xml下的main/resources/mybatis/sql/User.xml应该存在。

答案 3 :(得分:0)

我认为您的代码中有错误:

String resource = System.getProperty("user.dir") 
            + "/target/resources/mybatis/mybatis-conf.xml";

/应该是\