mybatis mapper xml文件的導入方式和查詢方式
mapper與SQLSession的關系
每個基於MyBatis的應用都是以一個SqlSessionFactory的實例為中心的。通過SqlSessionFactory可以獲得SQLSession實例,然后在其中完全包含了數據庫執行SQL命令所需要的所有方法。
SQLMapper是由一個Java接口和XML文件構成的,給出一定的SQL和映射規則。負責SQL的執行和返回結果。
通過SQLSession獲得Mapper映射器接口,然后執行SQL操作。
mapper xml文件的導入方式
根據文件相對地址導入
例如:
<mappers>
<!-- 第一種引入方式 resource引入-->
<mapper resource="com.weno.mapper/GirlMapper.xml"></mapper>
</mappers>
通過包導入
如果有很多個mapper xml文件,一個一個去導入太麻煩了,這時候可以選擇導入一個包,將包里面的Java接口文件全部導入。不過需要注意的點:文件名要相似:Girl.java和Girl.xml
,同時文件目錄結構
要一樣。
<mappers>
<!--第二種引入方式 通過包去引入-->
<package name="com.weno.mapper"/>
</mappers>
這個是2種最常見的xml文件導入方式。
Mybatis查詢方式之參數傳遞
假如此時有一個Girl數據庫表:
id | name | flower |
---|---|---|
17 | xiaoai1 | rose |
Girl java文件
package com.weno.pojo;
public class Girl {
private int id;
private String name;
private String flower;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getFlower() {
return flower;
}
public void setFlower(String flower) {
this.flower = flower;
}
}
傳入一個參數
- java基本類型
在映射文件中:
<select id="queryByID" resultType="com.weno.pojo.Girl">
select * from girl where id=#{id};
</select>
在Java文件中,映射方法:
Girl queryByID(int id);
傳入多個參數
- java基本對象
在映射文件中
<select id="queryByGirl" resultType="com.weno.pojo.Girl">
select * from girl where id=#{id};
<!-- 會自動調用getID()函數去獲取ID -->
</select>
在Java文件中,映射方法:
Girl queryByID(Girl g);
在測試文件中
Girl g = new Girl();
g.setId(17);
// 可以加多個set
Girl girl = mapper.queryByGirl(g);
- Map傳遞參數
在映射文件中
<select id="queryByGirl1" resultType="com.weno.pojo.Girl">
select * from girl WHERE id=#{id};
</select>
<!-- 其中id要跟Map里面的key一樣 -->
在Java文件中,映射方法:
Girl queryByGirl1(Map<String,Object> map);
在測試文件中
Map<String,Object> map= new HashMap<String, Object>();
map.put("id",17);
// id對應xml文件中的id
Girl girl=mapper.queryByGirl1(map);
- @Param傳遞參數
在映射文件中
<select id="queryByGirl2" resultType="com.weno.pojo.Girl">
select * from girl WHERE id=#{id} and flower=#{flower};
</select>
在Java文件中,映射方法:
Girl queryByGirl2(int id,String flower);
測試文件
GirlMapper mapper = sqlSession.getMapper(GirlMapper.class);
Girl girl=mapper.queryByGirl2(17,"rose");
如果這時候運行,則會報錯
org.apache.ibatis.exceptions.PersistenceException:
### Error querying database. Cause: org.apache.ibatis.binding.BindingException: Parameter 'id' not found. Available parameters are [0, 1, param1, param2]
### Cause: org.apache.ibatis.binding.BindingException: Parameter 'id' not found. Available parameters are [0, 1, param1, param2]
大概意思就是,mapper方法的參數綁定異常。
原因:
這個異常的產生原因是因為,當mapper接口方法有多個參數
時,java不會保存行參的記錄,java在運行的時候會把方法中的參數(int id,String flower)變成這樣:(int arg0,String arg1),這樣我們就沒有辦法去傳遞多個參數(注意,在多個參數時才會發生)
解決方法:
3.1 將參數映射文件中的參數改為
<select id="queryByGirl2" resultType="com.weno.pojo.Girl">
select * from girl WHERE id=#{0} and flower=#{1};
</select>
或者將參數改為param1和param2
<select id="queryByGirl2" resultType="com.weno.pojo.Girl">
select * from girl WHERE id=#{param1} and flower=#{param2};
</select>
這兩個沒什么區別,只不過一個是從0開始,有個是從1開始罷了。
3.2 使用@param
盡管上面的的方法能夠解決這個問題,但是顯而易見,這個不符合程序的設計理念,因為閱讀代碼的時候沒辦法馬上理解內容。所以可以使用@Param解決這個問題。
映射方法
Girl queryByGirl3(@Param("id") int id,@Param("flower")String flower);
映射文件
<select id="queryByGirl3" resultType="com.weno.pojo.Girl">
select * from girl WHERE id=#{id} and flower=#{flower};
</select>
這樣就可以開開心心的使用我的flower
了。

至於使用哪一個,那就看具體情況,哪一個方便就使用哪一個了。