博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MyBatis总结五:#{}和${}的用法和区别
阅读量:4659 次
发布时间:2019-06-09

本文共 1332 字,大约阅读时间需要 4 分钟。

From:

#{}的用法:

我们发现,在Mapper.xml映射文件中,经常使用#{属性名} 来作为SQL语句的占位符,来映射Sql需要的实际参数

如果只有一个参数

也就是说:#{}就是一个预编译的占位符作用,运行的时候会编译成 ? ;但这只适用于只有一个参数的情况,而且这种情况#{id}中的id可以写成任何字符串,比如#{abc}

但是如果我们有多个参数呢?

 

如果有多个参数

解决方案一:按照顺序用 0 1 来标志

解决方案二:按照顺序用param1 param2 来标志

解决方案三:利用参数

public interface UserMapper {    public User getUserByNameAndAge(@Param("username123") String username, @Param("age233") int age); }

这种方式是推荐方式,不过我们需要注意的是xml和interface中的参数名称需要对应。

 

${}的用法:

${}的用法和#{}的用法不同在于: #{}会被编译成?,而${}则会被原样输出(用在参数上,需要用param注解)

public interface UserMapper {    public User getUserById(@Param("id") int id); }

运行的时候 会直接原样输出,不能解决sql注入问题,但是这种情况如果参数是字符串或者日期类型的话 需要手动加单引号 不然会报错;

由于是直接输出的,所以我们在配置mybatis-config.xml的时候 可以用${}来可以配置一些东西,比如:

 

总结:

  #是占位符, 会对SQL进行预编译,相当于?; $是做sql拼接, 有SQL注入的隐患 2. #不需要关注数据类型, MyBatis自动实现数据类型转换; ${} 必须自己判断数据类型

​   两者都支持@param注解, 指定参数名称, 获取参数值. 推荐这种方式

 

  一般做参数传递,都会使用#{}

  如果不是做预编译,而是做拼接sql, 会使用${}, 例如表名称的变化,或者用在其他配置文件中

转载于:https://www.cnblogs.com/joeblackzqq/p/10773210.html

你可能感兴趣的文章
LightOJ - 1297 Largest Box LightOJ(一元三次方程求极大值)
查看>>
883H - Palindromic Cut(思维+STL)
查看>>
.NET FTP上传文件
查看>>
操作系统中的调度算法
查看>>
JVM方法调用栈
查看>>
目标跟踪之Lukas-Kanade光流法
查看>>
python基础(第二课)
查看>>
C语言预处理条件语句的 与或运算
查看>>
D1图论最短路专题
查看>>
.Net core的日志系统
查看>>
shell脚本颜色的设置
查看>>
2019春总结作业
查看>>
小程序数据绑定的拓展用法
查看>>
DRF 版本 认证
查看>>
MVC 4将jQuery升级到1.9出现各种问题。。。
查看>>
JedisPool资源池优化
查看>>
第2次作业+105032014140
查看>>
JS防抖与节流
查看>>
redhat enterprixe 5.0 DNS 服务配置与管理
查看>>
Django ORM不完全操作
查看>>