关于IDEA创建Mybatis的Maven项目,mybatis配置文件和mapper类配置文件查找路径及具体引用方法 以及 < build >标签中**/*.xml语法的探究

环境介绍

IDEA-2018 Maven项目

IDEA Maven项目部分特性介绍

IDEA Maven项目 默认会忽略 静态资源xml配置文件,导致相应xml文件即使路径正确,也导致 could’t find xxx.xml 的问题

IDEA Maven项目中, 被标记为Test Resources Root的文件夹中其静态资源会自动加载 (即:引用时可以直接使用文件名,而不需要考虑任何的路径,如:mapper resource=“UserMapper.xml” )
被标记为Test Resources Root的文件夹的示例:
在这里插入图片描述

问题描述

整个Maven项目关于Mybatis内容,其中

mybatis-config.xml配置文件如何设置其路径让项目可以找到识别,以及在项目中如何引用该文件。

Mybatis项目需要众多mapper.xml文件,如何让项目找到识别这些mapper.xml配置文件以及项目中如何引用

核心解决思路(不采用Test Resources Root标记方法)

在Maven项目的pom.xml文件下 手动添加 需要的静态资源的路径,并在需要的地方 合理引用 。

整体预设目录结构如下

在这里插入图片描述

1. mybatis-config.xml

1.1 具体配置 (让项目能自己找到该xml文件)

由于Mybatis-config.xml配置文件是针对Mybatis的整个配置文件,故事先将其目录结构放置在src下。

src/mybatis-config.xml 示例:

在这里插入图片描述

由于src未被设置为Test Resources Root 文件夹(也不应该如此设置), 故IDEA默认会忽略该xml文件。
此处手动设置pom.xml文件,让其不忽略,加载该静态资源。

pom.xml 文件部分代码展示,但结构正确(pom.xml文件由IDEA工具自动生成):

示例结构如下:
在这里插入图片描述

pom.xml 配置文件中修改代码如下:

<project>
  <build>
    <finalName>MybatisExample</finalName>
    
    <!--项目编译时手动添加的静态资源xml文件,否则IDEA默认会忽略xml文件-->
    <resources>
      <resource>
        <directory>src</directory>
        <includes>
          <!--src目录结构下任意以.xml结尾的文件-->
          <include>*.xml</include>
          
          <!--语法二也可以,使用**/*.xml,其意义稍后探究-->
          <!--<include>**/*.xml</include>-->
          
        </includes>
      </resource>

  </build>
</project>
1.2 相应的使用 (人为使用 项目已识别的 具体的xml文件)

配置完成后在其他位置可以直接使用文件名进行使用,此处在

src/test/java/CreateFactory.java

直接使用 String resource = “mybatis-config.xml”;
在这里插入图片描述
具体使用代码:

public class CreateFactory {
    private static SqlSessionFactory factory = null;
//    测试在POM中注册过的文件可以直接使用文件名
    String resource = "mybatis-config.xml";
    InputStream inputStream;

    private CreateFactory(){}

    public static void main(String[] args){
        CreateFactory test = new CreateFactory();
        test.create();
    }

    /**
     * 通过载入XML创建SqlSessionFactory
     */
    public void create(){
        try{
            inputStream = Resources.getResourceAsStream(resource);
            if(factory == null){
                println("test create factory!");
                factory = new SqlSessionFactoryBuilder().build(inputStream);
            }

        } catch (IOException e){
            e.printStackTrace();
        }
    }
}

2. mapper.xml

由于每个POJO类需要自己的映射接口和映射XML配置文件,此处选择将mapper.xml与相应的mapper.java分开存储。

具体路径(UserMapper示例)
mapper.java文件: src/package/com/castle/mapper/UserMapper.java
mapper.xml文件 : src/test/UserMapper.xml

示例结构(UserMapper.xml, 此处故意展示路径效果而未放置在被标记为Test Resources Root的resources文件夹下, 同时排除由于该xml文件被IDEA自动加载机制加载的可能性):

在这里插入图片描述

2.1 具体配置

由于都是xml文件,项目想要使用都在pom.xml文件中配置,继续先前1.1的配置添加内容。

pom.xml 配置文件中新修改代码如下:

<project>
  <build>
    <finalName>MybatisExample</finalName>
    
    <!--项目编译时手动添加的静态资源xml文件,否则IDEA默认会忽略xml文件-->
    <resources>
      <resource>
        <directory>src</directory>
        <includes>
          <!--src目录结构下任意以.xml结尾的文件-->
          <include>*.xml</include>
          
          <!--语法二针对某些情形也可以,使用**/*.xml,其意义稍后探究-->
          <!--<include>**/*.xml</include>-->
          
        </includes>
      </resource>
      
      <!--匹配src/test目录下的UserMapper.xml文件-->
	  <resource>
        <directory>src/test</directory>
        <includes>
          <!--src/test任意目录结构下任意以.xml结尾的文件-->
          <include>*.xml</include>
        </includes>
      </resource>

  </build>
</project>
2.2 相应的使用

mapper.xml文件要置于mybatis-config.xml文件中配置才可使整个Mybatis项目运行起来(Mybatis机制要求)
故该mapper.xml(示例为UserMapper.xml) 其引用的使用 是在mybatis-config.xml文件中。

修改 mybatis-config.xml 配置文件代码(其具体路径见1.1)
(主要为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>
    <!--映射文件-->
    <mappers>
        <mapper resource="RoleMapper.xml"/>
        <mapper resource="UserMapper.xml"/>
    </mappers>
</configuration>

3.1 关于**/*.xml相对路径语法的探究

查阅相关网友介绍:

**/*.xml为ANT匹配模式的通配符: ** 代表了可以匹配 0 个或者任意多个目录

针对配置代码 (pom.xml文件)

<resource>
        <directory>src</directory>
        <includes>
          <!--src任意目录结构下任意以.xml结尾的文件-->
          <!--语法二也可以,使用**/*.xml,其意义现在探究-->
          <include>**/*.xml</include>
        </includes>
</resource>

① 当对 src/mybatis-config.xml 文件
具体使用(在CreateFactory.java中) 为

String resource = "mybatis-config.xml";  

项目 可以 根据**/*.xml的匹配模式找到该文件。

② 但对 src/test/UserMapper.xml文件
具体使用(在mybatis-config.xml中) 为

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

项目 不可以 根据**/*.xml的匹配模式找到该文件, 发生could’t find xxx.xml异常。

3.2 关于**/*.xml相对路径语法的个人推论

由 ** 代表了可以匹配 0 个或者任意多个目录的ANT语法解释 用来解释Maven此处,想表达
src目录下任意目录结构下任意以.xml后缀结尾的文件 的意思 (这里想借任意目录结构搜索到src/test文件夹下的UserMapper.xml文件,但是失败了,显示 UserMapper.xml not found!)

但当将对UserMapper.xml的使用时修改一下便可以成功找到
此时 仍然使用 < include >**/*.xml< /include > 这种匹配语法, 父标签目录仍为 < directory >src< /directory > 。
但是对使用时添加一定的路径稍作修改,即可成功找到,即:

< mappers >
    < mapper resource="test/UserMapper.xml">
< /mappers >

故 ** 被解释 为代表0个和多个目录的解释 用来解释Mybatis路径配置 存在一定的歧义或问题

4. 总结:IDEA的mybatis项目中对静态资源实现加载的两种方式

① 将需要使用的静态资源所在的文件夹标记为 Test Resources Root 形式,可以直接用名称调用。

② 手动在pom.xml文件中配置< build >标签下的资源。建议不同路径可以设置多个< resource >标签,匹配可以使用 *.xml 语法

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值