1. 程式人生 > >Mybatis DAO層引數傳遞

Mybatis DAO層引數傳遞

眾所周知,Mybatis DAO層可以只寫介面方法,在mapper的XML配置檔案中定義與介面方法同名的查詢節點就可以實現操作資料庫的功能。那麼問題來了,如何傳遞合適的引數給SQL語句(配置檔案中定義的,當然配置檔案也可以換成註解的方式,不是本文重點,在此不表)呢?根據引數的數量和型別做如下說明:
1. 單個普通引數(簡單資料型別)

    int deleteById(Integer id);// 資料型別最好用封裝型別,不要用簡單型別int,這樣做有助於拼接SQL的語句的時候判斷引數是不是    
    Null,因為基本型別沒有主動賦值的話,會有預設值,而不是Null。

          <delete id="deleteById" parameterType="java.lang.Integer" >
            DELETE FROM gov_pub_search
               WHERE id = #{id,jdbcType=INTEGER}
          </delete>
    這裡parameterType可以不寫

2. 多個普通引數
這裡可以寫成下面①的樣子,這樣多個引數時,Mybatis會自動把這些引數放到一個map裡面,用param1,param2作為key,有兩種引用
方式1)以序號引用,#{1}代表第一個引數,2)以引數名param1(代表第一個引數)。但是作為一個一個良好的習慣,應當給每個變數命

    int deleteById(Integer id,String name);  ---①
    int deleteById(@Param(value=”id”Integer id, @Param   
           (value=”name”String name)) ;---②
    <delete id="deleteById">
          DELETE FROM gov_pub_search
             WHERE id = #{id,jdbcType=INTEGER}
             <if test="name != null" >
                 ,p_name = #{name}
            </if>  
    </delete>                       

3.單個(多個)集合型別引數
當需要批量操作資料庫的時候,就會傳入一批引數,這時就用到了集合(這裡包括陣列)引數,集合引數傳入方式如下:
3.1. 陣列
int batchUpdateStatusOfChecking(@Param(value=”ids”)String[] ids);

            <update id="batchUpdateStatusOfChecking">
                   update gov_pub_search
                   <set>
                        status = 5
                   </set>
                   <if test="ids != null &amp;&amp; ids != ''">
                         where status in(2,4)
                            and pub_id in
                            <foreach collection="ids" item="item" index="index" open="("
                               separator="," close=")">
                              #{item}
                            </foreach>
                  </if>
            </update>

     這裡引數只有一個數組,多個數組類似。在引用的時候,collection表示傳入的陣列引數的名字,因為這裡我們用@Param顯示給陣列命名 
     了 ,所以可以直接引用這個名字,如果不給陣列顯示命名,Mybatis會把引數放到一個map裡,並且以array作為key。

3.2. 列表(List)

     int batchInsertStudent(List<String> students);

     <insert id="batchInsertStudent"     
         parameterType="java.util.List">  
      insert into student (id,name,sex,tel,address) values
      <foreach collection="list" item="item" index="index"   
       separator="," >  
           (#{item.id},#{item.name},#{item.sex},#{item.tel},# 
           {item.address})  
      </foreach>  
     </insert>

這裡沒有給引數顯示命名,Mybatis會以list作為可以把引數放到map裡。當然作為一
個良好的程式設計習慣,最好顯示的給出一個有意義的名字。

3.3. Map

     int batchUpd(@Param(value="map") Map<String,String> map,
                  @Param("updateBy")String updateBy);
         <update id="batchUpdateStatusForChecking"> 
           <foreach collection="map" index="key"  item="ent" separator=";"> 
              update search
              set status = 2
              <if test="updateBy!= null">
                  ,update_by = #{updateBy}
              </if>
                  ,update_time = #{ent}
                  where pub_id = #{key}
                  and status = 1
            </foreach>
        </update>

        Map<String,String> map = new HashMap<String,String>();

這裡collection的名字只要和介面方法裡的引數名字一直就可以了。
3.4. Map(複雜元素)

public List<BpmDefUser> getByMap(Map<String,List<Long>> map){
        Map<String,Object> params=new HashMap<String, Object>();
        params.put("relationMap", map);
        return this.getBySqlKey("getByMap", params);

    }
<select id="getByMap" resultMap="BpmDefUser">

            <foreach collection="relationMap" index="key"  item="ent" separator="union">
                SELECT *
                FROM BPM_DEF_USER
                where  RIGHT_TYPE=#{key}
                and OWNER_ID in 
                <foreach collection="ent"  item="id" separator="," open="(" close=")">
                    #{id}
                </foreach>
            </foreach>

    </select>

4.混合引數(既有簡單型別,同時又有集合型別)

    int batchUpdateStatusOfChecking(@Param(value="ids")String[]  ids,@Param(value="lastUpdateBy")String lastUpdateBy);

    <update id="batchUpdateStatusOfChecking">
          update gov_pub_search
          <set>
                status = 5
                <if test="lastUpdateBy != null" >
                     ,last_update_by = #{lastUpdateBy}
                </if>
          </set>
          <if test="ids != null &amp;&amp; ids != ''">
             where status in(2,4)
                and pub_id in
                <foreach collection="ids" item="item" index="index" open="("
                             separator="," close=")">
                             #{item}
                 </foreach>
           </if>
    </update>