当前位置: 首页 > news >正文

百度手机怎么刷排名多少钱seo排名优化点击软件有哪些

百度手机怎么刷排名多少钱,seo排名优化点击软件有哪些,网站投放广告多少钱,国内投资咨询网站 html模板前言: #{} 和 ${} 的区别是 MyBatis 中一个常见的面试题,#{} 和 ${} 是MyBatis 中获取参数的两种方式,但我们在项目中大多数使用的都是 #{} 来获取参数,那么它们两个有什么区别呢? 区别 一. #{} 采用预编译 SQL&…

前言:

         #{} 和 ${} 的区别是 MyBatis 中一个常见的面试题,#{} 和 ${} 是MyBatis 中获取参数的两种方式,但我们在项目中大多数使用的都是 #{} 来获取参数,那么它们两个有什么区别呢?

区别

一. #{} 采用预编译 SQL,${} 采用即时 SQL

        现在我们通过 MyBatis 框架的注解方法查询数据库

@Select("select username, `password`, age, gender, phone from userinfo where id=#{id}")
UserInfo queryById(Integer id);

        得到的 MyBatis 日志如下

        我们可以发现,输出的 SQL 语句中,参数并没有拼接到后面,而是用占位符 ?来代替了,我们将这种 SQL 称为预编译 SQL 

        现在我们将 #{} 换成 ${}

@Select("select username, `password`, age, gender, phone from userinfo where id=${id}")
UserInfo queryById(Integer id);

        再次获取 MyBatis 日志

        我们可以看到,这次输出的 SQL 语句,参数直接拼接到了后面,我们将这种 SQL 称为即时 SQL 

        所以 #{} 采用预编译 SQL ,${} 采用即时 SQL 

预编译 SQL,即时 SQL

        1.效率更高

原因:

        绝⼤多数情况下,某⼀条 SQL 语句可能会被反复调⽤执⾏,或者每次执⾏的时候只有个别的值不同,如果每次都需要 经过语法解析, SQL优化、SQL编译等,则效率就明显不⾏了 

        通过 #{} 获取参数是预编译 SQL ,会将参数位置用占位符代替,然后直接进行解析,优化,编译,编译⼀次之后会将编译后的 SQL 语句缓存起来,后⾯再次执⾏这条语句时,不会再次编译 (只是输⼊的参数不同), 省去了解析优化等过程, 以此来提⾼效率,相当于就是一个固定的模板,每次往模板里放参数

        而通过 ${} 获取参数是即时 SQL ,会将参数拼接到 SQL 语句中,然后再将新构成的 SQL 语句发送给数据库进行解析,优化,编译,当传送下一个参数时,依然会执行相同的流程,所以每次传参以后构造新的 SQL 语句都会执行一遍解析,优化,编译的流程,导致效率较低

        2.更安全(防⽌SQL注⼊)

原因:

        SQL注⼊:是通过操作输⼊的数据来修改事先定义好的SQL语句,以达到执⾏代码对服务器进⾏攻击的⽅法。

        我们上面提到通过 #{} 获取参数是预编译 SQL,相当于就是一个固定的模板,每次往模板里放参数,我们以下面的 SQL 语句为例:

select username, age, gender from userinfo where username=#{username};

        上述获取参数是通过 #{} 获取,是预编译 SQL ,所以在还未传入参数的时候,SQL 语句就已经进行解析,优化,编译变成模板了,因此,无论参数输入的是什么内容,都会认为是 username 的值,在 username 这个列中查找对应的数据,因此 SQL 语句的功能不会改变,所以不会存在 SQL 注入

        但我们如下所示,通过 ${} 获取参数的话,就是直接把参数的内容进行拼接产生新的 SQL 语句

select username, age, gender from userinfo where username='${username}';

        假设我们传的参数为 'or 1='1 通过拼接形成的 SQL 语句为

select username, age, gender from userinfo where username=''or 1='1'

        SQL 语句改为上述形式后,黑客便能获得额外的数据,这就是 SQL 注入

二. #{} 会给String类型的参数添加引号,${} 不会

        接下来我们再看String类型的参数

@Select("select username, `password`, age, gender, phone from userinfo where username=#{username}")
UserInfo queryByName(String username);

        得到的 MyBatis 日志如下

        此时我们发送的 SQL 语句成功执行,所以 Mysql 执行的 SQL 语句为:

select username, `password`, age, gender, phone from userinfo where username=‘zhangsan’;

        可见,通过 #{} 获取参数时,如果参数的类型是 String ,就会在放到 SQL  语句中时,自动添加引号

        现在我们将 #{} 换成 ${}

@Select("select username, `password`, age, gender, phone from userinfo where username=${username}")
UserInfo queryByName(String username);

        得到的 MyBatis 日志如下

        

        通过日志我们可以看出,SQL 语句执行失败,因为传入的参数 “zhangsan” 拼接到 SQL 语句中没有加上引号,导致 SQL 语句的语义错误,把 “zhangsan” 认为是一个字段名

        现在我们对上面的代码进行一点修改,对参数添加单引号

@Select("select username, `password`, age, gender, phone from userinfo where username='${username}'")
UserInfo queryByName(String username);

        再次运行得到的 MyBatis 日志如下        

        此时我们的 SQL 语句就正确并成功执行了

使用建议

        我们尽量使用 #{} 获取参数,如果实在需要 ${} 符号获取,就一定要注意 SQL 注入的问题

http://www.yayakq.cn/news/276784/

相关文章:

  • 权威的建筑工程网站莱芜区组织部网站
  • 西昌做网站最省钱的购物软件
  • 网站返回顶部怎么做seo服务器优化
  • wap网站e4a做app项目大全网
  • 网站建设优化服务多少钱制作网站网页设计
  • pc网站建设费用iis默认网站怎么设置
  • 网站建设规范布局WordPress做分类信息平台
  • 免费建站网站黄金网站游戏网站模板下载
  • wordpress建设网站的方法大型网站建设哪家快
  • 免费做国际贸易的网站做公益选哪个网站好
  • 百度站长工具app腾讯微信公众号
  • 强比网站建设wordpress首页文章轮播
  • wap网站开发企业推广费用占比多少合适
  • 2021年建站赚钱广州平面设计
  • 网站ip地址查询物流网站前端模板下载
  • 苏州市建设厅网站做淘宝网站如何提取中间的提成
  • 奎屯网站制作靓号网建站
  • 苏州做网站的企业企业网站推广是不是必要的
  • 有多少个购物网站核酸检测赚了七十亿
  • 网站诊断方案wordpress登入不进去
  • 济南网站优化推广方案国外设计师wordpress主题
  • 做网站的图哪来网页版梦幻西游水晶宫攻略
  • 万网企业网站建设青岛哪家做网站的公司好
  • 厦门杏林建设企业网站dede cms 网站模板
  • 电影网站做seo原子艺术做的网站怎么样子
  • 东莞注塑切水口东莞网站建设c mvc制作网站开发
  • 做外贸兼职的网站有哪些广西住房与建设厅网站
  • 珠宝 网站欣赏wordpress 分页 未找到页面
  • 北京手机网站开发希腊网站后缀
  • 个体经营可以建设网站吗在线设计平台怎么运营