Mybatis DAO层参数传递

转载 2017年12月04日 19:15:02


众所周知,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>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
这里没有给参数显示命名,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>();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

这里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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

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>

Mybatis DAO层参数传递

众所周知,Mybatis DAO层可以只写接口方法,在mapper的XML配置文件中定义与接口方法同名的查询节点就可以实现操作数据库的功能。那么问题来了,如何传递合适的参数给SQL语句(配置文件中定义...

Mybatis Dao层参数传递的三种方式

本文来自收集整理: UserDao接口有一个方法  Public User selectUser(String name,String area); 第一种:            Us...

Java相同类型的两个对象比较属性值,得到不同属性的名称和对应的值,附代码实例

假设现在有需求如下:比较2个相同类型的不同对象,找到这2个对象的不同的地方,并展示记录一下。当然说的是相互对应的属性啦。 带着这个需求,看下面的例子。(我写代码的都不嫌弃长,你看代码的就也别嫌弃咯。)...

后台(36)——MyBatis的原始Dao开发方式

在本篇文章中,我们在上一篇博客的基础上来一起完成原始Dao开发方式。
  • lfdfhl
  • lfdfhl
  • 2017年03月12日 20:35
  • 756

MyBatis DAO层传递参数到mapping.xml

总结我所用到的MyBatis,Dao层传递参数到mapping.xml文件的几种方式: 第一种:传递单个参数 Dao层Code片段: /** * 根据articleId查询XXXX详情. *...

Mybatis使用之参数传递

摘要: 主要记录Mybatis是如何映射传递的参数的。分四种来记录:1、java基本类型的传递、2、Java对象形式传递 3、多参数传递4、集合类型参数传递...

MyBatis映射文件中多参数传递的问题

文章转载自:http://www.cnblogs.com/mingyue1818/p/3714162.html?utm_source=tuicool 一、单个参数: public ...

【mybatis】零碎拾起之参数传递

最近项目使用的SSM框架,之前也总结过一些关于Mybatis的东西,现在想继续总结一下,mybatis参数传递的简单知识。 1.传递一个参数 传递一个参数一般情况下直接用就可以,不需要map,不需要实...

MyBatis多参数传递之注解方式示例

http://legend2011.blog.51cto.com/3018495/1015003   若映射器中的方法只有一个参数,则在对应的SQL语句中,可以采用#{参数名}的方式来引用此...

MYbatis 多参数传递方式

Mybatis查询传递参数的三种方式 1.用注解的方式传递多个参数 2.构建map 3.构建查询条件类...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Mybatis DAO层参数传递
举报原因:
原因补充:

(最多只允许输入30个字)