MyBatis取值方式#{}和${}的区别

select * from user where id=${id} and user_name=#{username}
Preparing: select * from user where id=2 and user_name=?

区别

1、#{}:是以预编译的方式将参数设置到 sql 语句中的,相当于 PreparedStatement   可以防止 sql 注入攻击

     ${}:是直接将值拼接到 sql 语句中的,会有安全问题

2、能用 #{} 就不用 ${} 

3、原生jdbc不支持占位符的地方我们就可以使用${}进行取值。比如分表、排序。。。按年份分表拆分(其实我理解就是 #{} 获取的的参数有引号,而 ${} 获取的参数无引号)

select * from ${year}_salary where xxx;
select * from ${tableName} order by ${f_name} ${order}

4、#{}:更丰富的用法:

     规定参数的一些规则:

     javaType、jdbcType、mode(存储过程)、numericScale、resultMap、typeHandler、jdbcTypeName、expression(未来准备支持的功能)

    jabcType 通常需要在某种特定的条件下被设置

          在我们数据为 null 时,有些数据库可能不能识别 mybatis 对 null 的默认处理,比如 oracle  会报JdbcType OTHER:无效的类型;因为 mybatis 的全局配置文件中默认是JdbcTypeForNull = OTHER,会把所有的 null 都映射的 Jdbc 的 OTHER 类型。

          解决方案:

                1、#{username,jdbcType=NULL};

                2、把全局的 JdbcTypeForNull 改成 NULL

<!--
    1、设置对应字段的 jdbcType 但是这个只针对这里的这个字段
-->
<insert id="addUser">
    insert into user(user_name) values(#{username,jdbcType=NULL})
</inset>

<!-- 
    把全局的 jdbcTypeForNull 的值改为 NULL 
-->
<settings>
    <setting name = "jdbcTypeForNull" value = "NULL" />
</settings>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值