IDEA搭建mybatis項目之異常:java.io.IOException: Could not find resource mapping/UserMapper.xml
由Eclipse轉用IDEA真是一把把的辛酸淚,兩種編譯器看似都是在java開發中中流砥柱的開發工具,但編程這東西失之毫釐差之千裡啦,在開發過程中代碼出bug不重要,但總是爆些不所云的bug而且與代碼關係不大的bug就很氣啦。
下面給大家講一下我學習mybatis架構時出現一奇葩的異常
跟很多人一樣,在剛接觸IDEA時由於各種快速鍵都不會,英文都看不懂,所以用的賊幾把累,賊幾把煩。但熟悉一些快速鍵後覺得iDEA還不錯,代碼提示功能賊溜賊溜,編起程就是一路斷行符號加換行。用回eclipse都有點不習慣啦。
越說越偏啦,書歸正傳,我們說回mybaits:
第一步:建立一個maven工程。如果是普通想學習學習mybatis的架構功能,建議一個空的maven工程項目就行啦,如果是web項目就
按下面的選擇:
在pom.xml中匯入相應的jar包依賴
<dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.1.1</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.17</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies>
配置mybatis設定檔
<?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> <environments default="mysql"> <environment id="mysql"> <transactionManager type="JDBC"></transactionManager> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> <mappers> <mapper resource="mapping/UserMapper.xml"/> </mappers></configuration>
上面的environments中配置的是資料來源,就是你jdbc串連資料的那些必要的配置。下面的mappers是mybatis映射的路徑,接觸過mybatis應該都知道,mybatis是通過映射xml檔案中sql語句來執行相應資料庫的操作,這就是mybatis與你項目連接點。
每一個pojo類對應資料庫中的一個資料表,就有一個相應的對應檔。大致意思就是這樣,如果想瞭解更多原理,可以在網上搜一些大神寫的部落格,我這就不多加贅述啦. 在項目裡建立一個基本User
package pojo;public class User { private int id; private String username; private String password; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "User{" + "id=" + id + ", username='" + username + '\'' + ", password='" + password + '\'' + '}'; }}
並為其
建立相應的設定檔
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="User"> <select id="getUser" resultType="pojo.User"> SELECT * FROM users; </select></mapper>
建立一個測試類別來進行測試
import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import org.junit.Test;import java.io.IOException;import java.io.InputStream;import java.util.List;public class UserTest { @Test public void find(){ try { //載入mybatis的設定檔 InputStream inputStream = Resources.getResourceAsStream("mybatis.xml"); //通過sqlSession工廠建立者build出一個資料庫會話工程 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //開啟一個資料庫會話 SqlSession session = sqlSessionFactory.openSession(); //將pojo對應檔中的id寫入,即可找到相應的sql語句,執行語句並擷取fanhuizhi List<User> list = session.selectList("User.getUser"); //列印傳回值資訊 for (User user : list) { System.out.println(user.toString()); } //提交會話 session.commit(); //關閉會話 session.close(); } catch (IOException e) { e.printStackTrace(); } }}
注意導的jar包最好不要導錯,否則就得糾結啦。
萬事大吉。斷行符號OK?
當你沉溺於即將勝利的喜悅中時,那個天殺的bug就來啦。。。
驚不驚喜,意不意外。
我們來確認下項目結構,以免是我老眼昏花
事實證明600度的眼睛也不是蓋的。
那是什麼原因導致的異常呢?
說出來你可能不信,這其實就是我之前說得IDEA的鍋:IDEA的Maven是不會編譯src的java目錄的xml檔案,所以在Mybatis的設定檔中找不到xml檔案。
其實也可以說是IDEA MAVEN的鍋,因為如果
建立的是普通的java項目src下的xml檔案也是可以讀到的(本人親測) BB 這麼多能拿出解決辦法來才是硬道理
解決辦法就是在pom檔案中新加一個build提示編譯器那個蠢貨,你的java
下面也是有設定檔的。
關鍵是怎麼加。
兩步走: 把原pom檔案拿出來;
2.把下面這段代碼複製到前面去
<build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> </resource> </resources></build>