首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >mybatis中#{}和${}的区别

mybatis中#{}和${}的区别

作者头像
只喝牛奶的杀手
发布2019-10-10 17:42:09
1K0
发布2019-10-10 17:42:09
举报

先来回顾一下mybatis 核心概念 :

mapper中使用#{}格式的语法在mybatis中使用Preparement语句来安全的设置值

PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1,id);

执行SQL:select * from emp where name = #{employeeName}

参数:employeeName=>Smith

解析后执行的SQL(我们打开debug日志控制台可以看到):select * from emp where name =

#方式能够很大程度防止sql注入


有时你只是想直接在 SQL 语句中插入一个不改变的字符串。比如,像 ORDER BY $将传入的数据直接显示生成在sql中

  Statement st = conn.createStatement();
  ResultSet rs = st.executeQuery(sql);

执行SQL:select * from emp where name = ${employeeName}

参数:employeeName传入值为:Smith

解析后执行的SQL(我们打开debug日志控制台可以看到):select * from emp where name =Smith

总结:#方式能够很大程度防止sql注入,$方式无法防止Sql注入;$方式一般用于传入数据库对象,使用$要么不允许用户输入这些字段,要么自行转义并检验。一般能用#的就别用$。

再回顾下JDBC执行流程:

  1. 加载JDBC驱动;
  2. 建立并获取数据库连接;
  3. 创建 JDBC Statements 对象;
  4. 设置SQL语句的传入参数;
  5. 执行SQL语句并获得查询结果;
  6. 对查询结果进行转换处理并将处理结果返回;
  7. 释放相关资源(关闭Connection,关闭Statement,关闭ResultSet)。

结合JDBC的执行过程,不难发现归根结底的区别是CreateStatement 和 PrepareStatement 的区别。


每周一句:找到做事的准则、模式和反模式。准则:原则应用到实践中;模式:你应该做的;反模式:你不应该做的。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-10-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 只喝牛奶的杀手 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档