• mybatis传入参数类型parameterType详解


    前言

    Mybatis的Mapper文件中的select、insert、update、delete元素中都有一个parameterType属性,用于对应的mapper接口方法接受的参数类型。

    ( resultType:指定输出结果类型,mybatis将sql查询结果的一行记录数据映射为resultType指定类型的对象。如果有多条数据,则分别进行映射,并把对象放到容器List中。所以即使返回是list数组,resultType也是pojo类型 )

    1. MyBatis的传入参数parameterType类型分两种

       1. 1. 基本数据类型:int,string,long,Date;

       1. 2. 复杂数据类型:类和Map

    2. 如何获取参数中的值:

       2.1  基本数据类型:#{value}或${value} 获取参数中的值

       2.2  复杂数据类型:#{属性名}或${属性名}  ,map中则是#{key}或${key}

    注:#{}与${}的区别:

    #{value}:输入参数的占位符,相当于jdbc的?  防注入   自动添加了‘  ’ 引号!
    例如:select * from user where username = #{name}  //输入的参数lisa,就会自动加上引号
    变成:select * from user where username = ‘lisa’
    注意:value可以写任意变量,没有统一规定

    ${value}:  不防注入,就是字符串拼接 
     例如:select * from user where username like '%${value}%'  //默认不加引号
    注意:只能写value!!!

    select * FROM user WHERE username like "%"'s'"%"//是正确的,符合语法,引号的形式只能是这样,不能变!

    3.案例:

     3.1 基本数据类型案例

    <sql id="Base_Column_List" >
    id, car_dept_name, car_maker_name, icon,car_maker_py,hot_type
    </sql>
    <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Long" >
    select
    <include refid="Base_Column_List" />
    from common_car_make
    where id = #{id,jdbcType=BIGINT}
    </select>
     3.2 复杂类型--map类型   

    <select id="queryCarMakerList" resultMap="BaseResultMap" parameterType="java.util.Map">
    select
    <include refid="Base_Column_List" />
    from common_car_make cm
    where 1=1
    <if test="id != null">
    and cm.id = #{id,jdbcType=DECIMAL}
    </if>
    <if test="carDeptName != null">
    and cm.car_dept_name = #{carDeptName,jdbcType=VARCHAR}
    </if>
    <if test="carMakerName != null">
    and cm.car_maker_name = #{carMakerName,jdbcType=VARCHAR}
    </if>
    <if test="hotType != null" >
    and cm.hot_type = #{hotType,jdbcType=BIGINT}
    </if>
    ORDER BY cm.id
    </select>
     3.3 复杂类型--类类型

    <update id="updateByPrimaryKeySelective" parameterType="com.epeit.api.model.CommonCarMake" >
    update common_car_make
    <set>
    <if test="carDeptName != null" >
    car_dept_name = #{carDeptName,jdbcType=VARCHAR},
    </if>
    <if test="carMakerName != null" >
    car_maker_name = #{carMakerName,jdbcType=VARCHAR},
    </if>
    <if test="icon != null" >
    icon = #{icon,jdbcType=VARCHAR},
    </if>
    <if test="carMakerPy != null" >
    car_maker_py = #{carMakerPy,jdbcType=VARCHAR},
    </if>
    <if test="hotType != null" >
    hot_type = #{hotType,jdbcType=BIGINT},
    </if>
    </set>
    where id = #{id,jdbcType=BIGINT}
    </update>
     3.4 复杂类型--map中包含数组的情况

    <select id="selectProOrderByOrderId" resultType="com.epeit.api.model.ProOrder" parameterType="java.util.HashMap" >
    select sum(pro_order_num) proOrderNum,product_id productId,promotion_id promotionId
    from pro_order
    where 1=1
    <if test="orderIds != null">
    and
    <foreach collection="orderIds" item="item" open="order_id IN(" separator="," close=")">
    #{item,jdbcType=BIGINT}
    </foreach>
    </if>
    GROUP BY product_id,promotion_id
    </select>
    4. Mybatis (ParameterType) 如何传递多个不同类型的参数

    4.1 方法一:不需要写parameterType参数

    public List<XXXBean> getXXXBeanList(String xxId, String xxCode);

    <select id="getXXXBeanList" resultType="XXBean">
    select t.* from tableName where id = #{0} and name = #{1}
    </select>
    由于是多参数那么就不能使用parameterType, 改用#{index}是第几个就用第几个的索引,索引从0开始

    4.2 方法二:基于注解(最简单)

    public List<XXXBean> getXXXBeanList(@Param("id")String id, @Param("code")String code);

    <select id="getXXXBeanList" resultType="XXBean">
    select t.* from tableName where id = #{id} and name = #{code}
    </select>
    由于是多参数那么就不能使用parameterType, 这里用@Param来指定哪一个

    4.3 方法三:Map封装

    public List<XXXBean> getXXXBeanList(HashMap map);


    <select id="getXXXBeanList" parameterType="hashmap" resultType="XXBean">
    select 字段... from XXX where id=#{xxId} code = #{xxCode}
    </select>
    其中hashmap是mybatis自己配置好的直接使用就行。map中key的名字是那个就在#{}使用那个,map如何封装就不用了我说了吧。

    4.4 方法四:List封装

    public List<XXXBean> getXXXBeanList(List<String> list);

    <select id="getXXXBeanList" resultType="XXBean">
      select 字段... from XXX where id in
      <foreach item="item" index="index" collection="list" open="(" separator=","close=")">
        #{item}
      </foreach>
    </select>
    --------------------- 

  • 相关阅读:
    Gof 设计模式
    系统架构师-笔记
    微信小程序弹出层点击穿透问题
    微信小程序-两个input叠加,多次点击字体变粗或闪动
    微信小程序-下拉松开弹不回去顶部留一段空白
    node+vue报错合辑
    Nodejs脚手架搭建基于express的应用
    Vue 核心之数据劫持
    Date——时间戳转化为YYYY-MM-DD h:m:s时间格式
    web页面加载、解析、渲染过程
  • 原文地址:https://www.cnblogs.com/ly570/p/10977727.html
Copyright © 2020-2023  润新知