mybatis mapper xml文件的導入方式和查詢方式


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;
    }
}

傳入一個參數

  1. java基本類型
    在映射文件中:
    <select id="queryByID" resultType="com.weno.pojo.Girl">
        select * from girl where id=#{id};
    </select>

在Java文件中,映射方法:

Girl queryByID(int id);

傳入多個參數

  1. 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);
  1. 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);
  1. @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了。

 


 

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM