Mybatis使用maven打包出现的问题

之前没有用到的mybatis 的时候,使用mvn打包完成后,项目的配置文件是在jar包外的,以便于修改;在使用mybatis后,使用mvn打包,发现jar中内含jdbc配置文件,此时要考虑如何把jdbc配置文件给打到包外,且能被项目访问到。


  • 1 修改pom文件,将配置文件打到包外指定的文件中
  • pom文件添加修改如下:

    <sourceDirectory>src/main/java</sourceDirectory>
    <resources>  
      <resource>  
          <directory>src/main/resources</directory>  
          <excludes>
            <!-- 在此指定,jar包中不含哪些文件 -->
              <exclude>*.properties</exclude>   
          </excludes>  
      </resource>  
    </resources>   
      <plugin> 
        <artifactId>maven-resources-plugin</artifactId>  
          <executions>  
              <execution>  
                  <id>copy-resources</id>  
                  <phase>validate</phase>  
                  <goals>  
                      <goal>copy-resources</goal>  
                  </goals>  
                  <configuration>                
                      <outputDirectory>
                        <!--指定配置文件的输出路径-->
                          ${project.build.directory}/src/main/resources
                      </outputDirectory>  
                      <resources>  
                          <resource>  
                              <directory>src/main/resources</directory>
                              <includes>
                                <!-- 指定哪些文件将会输出到这个路径下的文件夹中 -->
                                   <include>*.properties</include> 
                              </includes> 
                              <filtering>true</filtering>  
                          </resource>  
                      </resources>  
                  </configuration>  
              </execution>  
          </executions>  
    </plugin> 

    修改完,使用mvn打包完成后,发现所有的配置文件都在jar包外的指定文件夹中,此时启动项目,发现报异常:Could not find resource mybatis.cfg.xml。

    java.io.IOException: Could not find resource mybatis.cfg.xml
    原因是,创建SqlSessionFactory的时候,使用的路径是”mybatis.cfg.xml”,而此时该配置文件是在jar包外的指定文件目录下。

    Reader reader = Resources.getResourceAsReader("mybatis.cfg.xml");
    //构建sqlSession的工厂
    sessionFactory = new SqlSessionFactoryBuilder().build(reader);

    ​此时,修改获取mybatis.cfg.xml的方法

        //构建sqlSession的工厂
        FileInputStream fis = new FileInputStream(new File("src/main/resources/mybatis.cfg.xml"));
        sessionFactory = new SqlSessionFactoryBuilder().build(fis);

此时,打包再运行,报异常:Could not find resource DB.properties

Error building SqlSession.
The error may exist in SQL Mapper Configuration
Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: java.io.IOException: Could not find resource DB.properties
at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)

mybatis.xml文件和DB.properties文件都在jar包外,mybatis.xml配置文件中都不到数据库连接信息。

  • 2 对于上述的问题,解决办法

  • 1) 在网上查询相关资料,有一种解决方案是,mybatis.xml文件放置在jar包内,DB配置文件放在包外,在程序种添加一个读jar包外配置文件,再把它设置给mybatis文件,该种方式没有成功。

  • 2) 此外,还有一种,该方案也是将mybatis.xml放置在jar包中,但是,创建SqlSessionFactory的时候,读取的DB属性文件 会将xml文件中的数据库连接信息覆盖。

        Reader reader = Resources.getResourceAsReader("mybatis.cfg.xml");
        Properties prop = new Properties();
        prop.load(new FileReader(new File("src/main/resources/DB.properties")));
        //此时注意DB中的配置项名称 为 driver,url,username,password
        sessionFactory = new SqlSessionFactoryBuilder().build(reader, prop);

完成上述的步骤后,由于我们把jdbc的配置文件放到了jar包外,所以在mybatis的配置文件中,只需要把该文件的引入删掉即可。【包内直接引用包外的配置文件,没有找到解决办法】

<configuration>
<!-- 引入外部配置文件 -->
<!-- <properties resource="DB.properties"></properties> -->

 <!-- 配置mybatis运行环境 -->
   <environments default="development ">
     <environment id="development ">
         <transactionManager type="JDBC" />

        <dataSource type="POOLED">
             <property name="driver" value="${JDBC_DRIVER}" />
             <property name="url" value="${JDBC_URL}" />
             <property name="username" value="${USER}" />
             <property name="password" value="${PASSWORD}" />
         </dataSource>
     </environment>
 </environments> 

 <mappers>
    <!-- 告知映射文件位置 需要一个一个配置 -->
   <package name="com.agm.FundsPAMMSettlement_common.dao"/>
 </mappers>
 </configuration>

这种方案,测试的不太好使,可能是我自己的原因,可以试一下。 【经测试,该种方式可以】

参考来源:http://blog.csdn.net/mmd0308/article/details/67640581

​ 3) 第三种是,将mybatis.xml文件放在jar包外,此时直接在配置文件中写数据库连接信息,不从DB属性文件中获取。

​ 4) 现在说的是另外一种,mybatis.xml的作用就是通过读取文件创建 SqlSessionFactory,既然如此,我们也可以通过其他的方式来获得,修改如下。

        Properties prop = new Properties();
        prop.load(new FileReader(new File("src/main/resources/DB.properties")));
        String driver = prop.getProperty("JDBC_DRIVER");
        String url = prop.getProperty("JDBC_URL");
        String username = prop.getProperty("USER");
        String password = prop.getProperty("PASSWORD");
        DataSource dataSource =new PooledDataSource(driver,url,username,password);

        TransactionFactory transactionFactory =  new JdbcTransactionFactory();

        Environment environment = new Environment("development", transactionFactory, dataSource);

        Configuration configuration = new Configuration(environment); 

        configuration.addMappers("com.agm.FundsPAMMSettlement_common.dao");

        sessionFactory = new SqlSessionFactoryBuilder().build(configuration);

通过这种方式,我们可以绕过mybatis.xml的配置文件来创建SqlSessionFactory,这样的话,和之前一样,DB配置文件直接写在jar包外。

参考来源:http://blog.csdn.net/jimolangge123/article/details/49228255

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值