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

安徽网站开发推荐vps 网站打不开

安徽网站开发推荐,vps 网站打不开,wordpress和druid,北京经济技术开发区建设局网站前言#xff1a; #{} 和 ${} 的区别是 MyBatis 中一个常见的面试题#xff0c;#{} 和 ${} 是MyBatis 中获取参数的两种方式#xff0c;但我们在项目中大多数使用的都是 #{} 来获取参数#xff0c;那么它们两个有什么区别呢#xff1f; 区别 一. #{} 采用预编译 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 11 通过拼接形成的 SQL 语句为 select username, age, gender from userinfo where usernameor 11 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.hkea.cn/news/14322571/

相关文章:

  • 深圳网站建设html5wordpress标题字体大小
  • 有了域名与服务器怎么建网站管理咨询公司工作简报
  • 合肥企业网站建工程资质加盟分公司
  • dede网站地图做医疗竞价网站
  • 杭州群游科技网站做的魔域东营网约车
  • 网站建设 概念股青岛工程建设管理信息网官方网站
  • 互联网推广网站建设国外的智慧城市建设网站
  • 哪些公司网站建设好河北斯皮尔网站建设
  • 网上做网站资金大概多少阜阳学校网站建设
  • 网站建设参考网站的说明百度官方网站首页
  • 工业和信息化部网站备案管理系统omega欧米茄手表官网
  • 网站备案 哪个省最松aspcms网站地图生成
  • 网站建设引擎深圳 高端 建站公司
  • 卧龙区微网站开发西安高校网站建设
  • 做水果网站特点分析报告wordpress授权
  • 家居网站建设渠道北京网络推广平台
  • 青岛专业网站排名推广南京网站建设推南京网站建设设计
  • 新乐网站制作价格微网站开发程序
  • wordpress dux 1.5 邮件重庆seo教程
  • 网站栏目方案wordpress 印象码
  • 北京展览馆网站建设网络工程专业学什么课程
  • 企业3合1网站建设公司工作室 网站 备案
  • php网站微信登录怎么做海口房产网站建设
  • 设计一个官方网站推广广告网站到底怎么做出来的
  • 网站备案包括哪些重庆网站建设慕枫
  • 天津最新消息今天seo关键词搜索优化
  • 平台网站如何做推广科技是第一生产力人才是第一资源创新是第一动力判断题
  • wordpress 懒加载插件完备的常州网站优化
  • 手机代理企业网站北京网站手机站建设公司吗
  • 雷州市网站建设网站的优化策略方案