Mybatis实战 之 入参封装

Mybatis实战 之 入参封装

本节我们将详细学习一下Mybatis对传入参数的封装或处理。


实例

  • 单个参数的处理
    对于单个参数的传入,在Mapper接口中我们可以直接使用该参数

    • 例子

       int deleteByPrimaryKey(Integer pid);
       <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
          delete from products
          where pid = #{pid,jdbcType=INTEGER}
        delete>

  • 传入多个参数
    传入多个参数并且使用Mybatis默认的处理方式的话,Mybatis会将传入的参数按先后顺序转化为一个Map,第一个参数的Key值为 param1,第二个参数的Key值为 param2,依次类推。在Mapper接口中将直接使用param1…..paramN来代表指定位置的参数。

    • 例子

      Product selectProductByCritiers(String pname,String type);
       <select id="selectProductByCritiers" resultMap="BaseResultMap">
          select 
          "Base_Column_List" />
          from products
          where pname = #{param1,jdbcType=VARCHAR}
          and type=#{param2,jdbcType=VARCHAR}
        select>

      入参有顺序限制


  • 使用@Param 注解传入多个参数
    在使用@Param注解传入参数时,Mybatis将为每一个参数根据@Param中的值封装成一个Map,Map中的每一个Key值为每一个@Param中的值,无先后顺序,@Param中的值唯一。

    • 例子

       Product selectProductByCritiers(@Param("productName")String pname,@Param("ProductType")String type);
      <select id="selectProductByCritiers" resultMap="BaseResultMap">
          select 
          "Base_Column_List" />
          from products
          where pname = #{productName,jdbcType=VARCHAR}
          and type=#{ProductType,jdbcType=VARCHAR}
        select>

  • 使用POJO 入参
    在使用Mybatis 我们常用整个POJO 对象作为参数的传入,此时Mybatis 将会把 POJO 封装成一个Map,Key为属性名称,value值属性值。在使用参数是,直接使用Map中的Key值即属性名称即可

    • 例子

      int insert(Product product);
       
          insert into products (pid, pname, type, 
            price, createTime)
          values (#{pid,jdbcType=INTEGER}, #{pname,jdbcType=VARCHAR}, #{type,jdbcType=VARCHAR}, 
            #{price,jdbcType=DOUBLE}, #{createTime,jdbcType=TIMESTAMP})
        

      使用场景为传入参数恰好是POJO对象中对应的属性(可以不是全)。


  • 使用Map 入参
    从以上的入参形式可以看出,Mybatis 对参数的处理不管时那一种那是都会将入参参数封装成一个Map,Mapper接口取用的便是封装后Map的Key,使用的值便是Map对应Key的Value值。
  • 例子

    Map<String,Object> paramMap = new HashMap<>();
    paramMap.put("pname", "SpringBootDemo");
    paramMap.put("type", "第一次世界大战");
    Product product = martkeService.selectByMap(paramMap);
    Product selectByMap(Map<String,Object> map);
    
      <select id="selectByMap" resultMap="BaseResultMap">
        select 
        "Base_Column_List" />
        from products
        where pname = #{pname,jdbcType=VARCHAR}
        and type=#{type,jdbcType=VARCHAR}
      select>

    一般使用场景为,实体POJO 对象无法满足传入参数对应的类型且参数较多时。


  • 特殊场景
    然而在实际的运用过程中以上的入参方式标准都无法满足我们的需求,那么我们可以看看一下特殊场景下入参的实现方式:

    • 部分参数声明

      Product selectProductByCritiers(@Param("productName")String pname,String type);
       <select id="selectProductByCritiers" resultMap="BaseResultMap">
          select 
          <include refid="Base_Column_List" />
          from products
          
          where pname = #{productName,jdbcType=VARCHAR}
           
          and type=#{param2,jdbcType=VARCHAR}
        select>
    • 多参数+POJO

      Product selectProductByMultParam(@Param("id")Integer id,Product product );
          
        <select id="selectProductByMultParam" resultMap="BaseResultMap">
          select
          <include refid="Base_Column_List" />
          from products where 1 = 1 
           <if test="pid != null">
               
             and  pid=#{id,jdbcType=INTEGER}
            if>
            <if test="pname != null">
            
             and pname =#{pname,jdbcType=VARCHAR}
            if>
            <if test="type != null">
             and type =#{type,jdbcType=VARCHAR}
            if>
            <if test="price != null">
             and price =#{price,jdbcType=DOUBLE}
            if>
          <if test="orderByClause != null">
            order by ${orderByClause}
          if>
        select>
    • 使用其他Conllection入参
      在实际的开发中我们也经常使用List/Set/Array来做参数传入,下面我们来详细学习一下各自使用的场景的实现吧。首先Mybatis 对 List/Set/Array 入参是可以直接使用 conllection 来使用指定的元素,并且Mybatis 对List 和Array 还做了特殊处理,可以直接使用list/array来使用指定元素。

      • 使用List 入参

        Product selectProductByList(List paramList); 
          <select id="selectProductByList" parameterType="java.util.list" resultMap="BaseResultMap">
              select
               <include refid="Base_Column_List" />
               from products
               
               where pid=#{conlletion[0],jdbcType=INTEGER}
               and type=#{conlletion[1],jdbcType=VARCHAR}
          select>

        由于Mybatis 对List有做特殊处理因而可以是:

          <select id="selectProductByList" parameterType="java.util.list" resultMap="BaseResultMap">
              select
               <include refid="Base_Column_List" />
               from products
               
               where pid=#{list[0],jdbcType=INTEGER}
               and type=#{list[1],jdbcType=VARCHAR}
          select>
      • 使用Aarray 数组入参

        Product selectProductByArray(String [] array);
        <select id="selectProductByArray" resultMap="BaseResultMap">
            select
               <include refid="Base_Column_List" />
               from products
               
               where pid=#{conllection[0],jdbcType=INTEGER}
               and type=#{conllection[1],jdbcType=VARCHAR}
          select>

        由于Mybatis 对Array 数组入参也做了特殊处理,因而可以是:

          <select id="selectProductByArray" resultMap="BaseResultMap">
            select
               <include refid="Base_Column_List" />
               from products
               
               where pid=#{array[0],jdbcType=INTEGER}
               and type=#{array[1],jdbcType=VARCHAR}
          select>
      • 使用Set 入参

        Product selectProductByHashSet(HashSet<Object> paramSet);
        <select id="selectProductByHashSet" resultMap="BaseResultMap">
                select
               <include refid="Base_Column_List" />
               from products
               
               where pid=#{conllection[0],jdbcType=INTEGER}
               and type=#{conllection[1],jdbcType=VARCHAR}
          select>

      • 小结

        • Mybatis 提供了多样的方式来入参,但不论以哪一种方式入参,Mybatis都将会传入的参数封装成一个Map。

        你可能感兴趣的:(MyBatis)