Mybatis中的参数问题

参数值获取:
    #{}
    ${}

区别:

    #{}:是以预编译的形式,将参数设置到sql语句中,防止sql注入
    ${} 取出的值直接拼接sql语句中 会有安全问题。

大部分 都是#{}
但还是有用处的

    比如 原声jdbc 不支持占位符的地方就可以使用${} 表名,排序等  
    意思就是说 除了参数使用#{} 其他就得使用${}

举例:

select * from ${year}_salary where xxx;
select * from xx order by ${name};
因为不支持占位符? 所以得使用${}

指定参数的一些规则

最常用的是jdbcType
由于全局配置:jdbcTypeForNull=OTHER;oracle不支持
全局配置默认Mybatis 如果参数为null 就映射为数据库中的Types.OTHER 有些数据库就不能识别mybatis对null的默认处理
mysql兼容比较好 可以传参为null
oracle不能传参为null 所以需要将其指定为null 而不是OTHER
两种解决办法
#{email,jdbcType=NULL}即可 只是局部作用
jdbcTypeForNull=NULL 全局配置

<setting>
        <setting name="jdbcTypeForNull" value="NULL">  //对应数据库的Types.NULL
</setting>

sql映射文件获取参数

单个参数:
mybatis不会做特殊处理 #{任意符号} 整个就代表传入的参数
如果传入的是一个对象那么#{属性名称}就代表该对象的属性
如果是 list对象 比如批量插入 #{item.属性}才可以访问其中的属性

多个参数:
mybatis会做特殊处理。
多个参数会被封装成 一个map,
key:param1…paramN,或者参数的索引也可以
value:传入的参数值
#{}就是从map中获取指定的key的值;

映射文件如何使用传入的参数?
有两个方法:
第一种:默认方法

#{param1}代表第一个参数 #{param2}代表第二个 依次类推 #{param3},#{param4}

<select id="getTeacherByIdAndName" resultType="entity.Teacher">
        select id,name,gender teacher_gender FROM teachers WHERE id = #{param1} AND name = #{param2}
    </select>

第二种:命名参数
明确指定封装参数时map的key;@Param(“id”)
多个参数会被封装成 一个map,
key:使用@Param注解指定的值
value:参数值
#{指定的key}取出对应的参数值
传参的接口中命名参数:@Param注解

public Teacher getTeacherByIdAndName(@Param("id")Integer id,@Param("name")String name);

<select id="getTeacherByIdAndName" resultType="entity.Teacher">
        select id,name,gender teacher_gender FROM teachers WHERE id = #{id} AND name = #{name}
    </select>

额外情况:

public Employee getEmp(@Param("id")Integer id,String lastName);
取值:id==>#{id/param1}   lastName==>#{param2}

public Employee getEmp(Integer id,@Param("e")Employee emp);
取值:id==>#{param1}    lastName===>#{param2.lastName/e.lastName}

特别注意:如果是Collection(List、Set)类型或者是数组,
也会特殊处理。也是把传入的list或者数组封装在map中。
key:Collection(collection),如果是List还可以使用这个key(list)
数组(array)

public Employee getEmpById(List<Integer> ids);
    取值:取出第一个id的值:   #{list[0]}

总结:参数多时会封装map 为了不混乱 :

使用@Param来指定封装的key  
#{key}就可以取出map中的值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值