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

做网站与做app哪个容易企业公司网站建设

做网站与做app哪个容易,企业公司网站建设,永兴县网站建设专业,做网站模板的海报尺寸多少目录 1. 以基本类型参数为例测试#{ }与${ }传递参数的区别 1.1 参数为Integer类型 1.2 参数为String类型 2. 使用#{ }传参存在的问题 2.1 参数为排序方式 2.2 模糊查询 3. 使用${ }传参存在的问题 3.1 SQL注入 3.2 对比#{ } 与 ${ }在SQL注入方面存在的问题 3.3 预编译…

目录

1. 以基本类型参数为例测试#{ }与${ }传递参数的区别

1.1 参数为Integer类型

1.2 参数为String类型

2. 使用#{ }传参存在的问题

2.1 参数为排序方式

2.2 模糊查询

 3. 使用${ }传参存在的问题

3.1 SQL注入

3.2 对比#{ } 与 ${ }在SQL注入方面存在的问题

3.3 预编译SQL与即时SQL

3.4 解决模糊查询只能使用${}的问题


使用MyBatis进行数据库操作在进行参数传递时,有#{ } 与 ${ }两种方式。

本文介绍两种方式的区别;

1. 以基本类型参数为例测试#{ }与${ }传递参数的区别

1.1 参数为Integer类型

在UserInfoMapper文件中创建selectOne方法,分别使用#{ } 与 ${ }传递参数:

package com.zhouyou.mybatisdemo1.mapper;
import com.zhouyou.mybatisdemo1.model.UserInfo;
import org.apache.ibatis.annotations.*;import java.util.List;@Mapper
public interface UserInfoMapper {@Select("select* from userinfo where id= #{id}")UserInfo selectOne(Integer id);
}

编写测试类UserInfoMapperTest及测试方法:

package com.zhouyou.mybatisdemo1.mapper;import com.zhouyou.mybatisdemo1.model.UserInfo;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.util.List;import static org.junit.jupiter.api.Assertions.*;
@Slf4j
@SpringBootTest
class UserInfoMapperTest {@Autowiredprivate UserInfoMapper userInfoMapper;@Testvoid selectOne() {log.info(userInfoMapper.selectOne(4).toString());}
}

 使用#{ }的运行测试类情况:

使用${ }的运行测试类情况:

可见当参数为Intgeer类型时,使用#{ } 与 ${ }均可正确传递参数;

1.2 参数为String类型

在UserInfoMapper文件中创建selectOneByName方法,分别使用#{ } 与 ${ }传递参数:

package com.zhouyou.mybatisdemo1.mapper;
import com.zhouyou.mybatisdemo1.model.UserInfo;
import org.apache.ibatis.annotations.*;import java.util.List;@Mapper
public interface UserInfoMapper {@Select("select* from userinfo where username =#{username}")
//    @Select("select* from userinfo where username =${username}")UserInfo selectOneByName(String name);
}

编写测试类UserInfoMapperTest及测试方法:

package com.zhouyou.mybatisdemo1.mapper;import com.zhouyou.mybatisdemo1.model.UserInfo;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.util.List;import static org.junit.jupiter.api.Assertions.*;
@Slf4j
@SpringBootTest
class UserInfoMapperTest {@Autowiredprivate UserInfoMapper userInfoMapper;@Testvoid selectOneByName() {log.info(userInfoMapper.selectOneByName("zhangsan").toString());}
}

启动测试类,

对于使用#{ } 进行参数传递的方法,可正确运行;

对于使用${ } 进行参数传递的方法报错如下:

使用#{ }时,如果参数为String类型,会自动加上'  '

使用${ }时,会直接进行拼接,故如果参数为字符串类型,需手动增加 '  ',修改SQL语句如下:

@Select("select* from userinfo where username ='${username}'")

重启测试类,启动成功,日志如下:

2. 使用#{ }传参存在的问题

2.1 参数为排序方式

现以实现升序(参数为asc)或降序(参数为desc)的全列查询为例,分别使用#{ } 与 ${ }进行参数传递:

1、使用#{ }进行参数传递:

在UserInfoMapper中编写排序方法:

    // 排序@Select("select* from userinfo order by id #{sort}")List<UserInfo> selectUserBySort(String sort);

生成测试方法并对排序结果进行打印:

    @Testvoid selectUserBySort() {log.info(userInfoMapper.selectUserBySort("asc").toString());}

启动测试类,报错如下: 

2、使用${ }参数传递:

在UserInfoMapper中编写修改排序方法,使用${ }传参:

    @Select("select* from userinfo order by id ${sort}")List<UserInfo> selectUserBySort(String sort);

启动测试类,运行成功:

可见当参数为sql查询语句的排序方式:asc与desc时,若使用#{ }进行参数传递,则在该字符串上加上' '会造成错误,因此对于参数为排序方式的方法,只能使用${ }进行参数传递

不止排序方式,包括参数为表名、字段名等作为参数时,也不能使用#{ }进行参数传递;

2.2 模糊查询

1、使用#{ }参数传递:

 在UserInfoMapper中编写排序方法:

    // 模糊查询@Select("select* from userinfo where username like '%#{partPara}%' ")List<UserInfo> selectUserByLike(String partPara);

生成测试方法并对排序结果进行打印:

    @Testvoid selectUserByLike() {log.info(userInfoMapper.selectUserByLike("tian").toString());}

启动测试类,报错如下: 

可见由于#{ }由于增加引号,也使得模糊查询出现问题。

2、使用${ }参数传递:

  在UserInfoMapper中修改排序方法,使用${ }传递参数:

    // 模糊查询@Select("select* from userinfo where username like '%${partPara}%' ")List<UserInfo> selectUserByLike(String partPara);

启动测试类,运行成功,查询结果如下:

 3. 使用${ }传参存在的问题

3.1 SQL注入

SQL注入:是指将另外的SQL语句作为参数,执行后修改了原本的SQL语句,从而通过执行代码对服务器进行攻击。

比如:正常SQL如下:以参数为'admin'为例:

select* from userinfo where username= 'admin'

试传参为 'or 1 = ' 1,(使用'or 1 = ' 1直接替换admin),则SQL语句变为:

select* from userinfo where username= ''or 1 = ' 1'

1='1'恒成立,故会导致进行全列查询,获取userinfo整张表的信息。

3.2 对比#{ } 与 ${ }在SQL注入方面存在的问题

1、使用# { }传参:

 在UserInfoMapper文件中创建selectOneByName方法,使用#{ } 传递参数:

package com.zhouyou.mybatisdemo1.mapper;
import com.zhouyou.mybatisdemo1.model.UserInfo;
import org.apache.ibatis.annotations.*;import java.util.List;@Mapper
public interface UserInfoMapper {@Select("select* from userinfo where username =${username}")UserInfo selectOneByName(String name);
}

编写测试类UserInfoMapperTest及测试方法:

package com.zhouyou.mybatisdemo1.mapper;import com.zhouyou.mybatisdemo1.model.UserInfo;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.util.List;import static org.junit.jupiter.api.Assertions.*;
@Slf4j
@SpringBootTest
class UserInfoMapperTest {@Autowiredprivate UserInfoMapper userInfoMapper;@Testvoid selectOneByName() {log.info(userInfoMapper.selectOneByName("'or 1='1 ").toString());}
}

运行启动类,可见发生了SQL注入,使得查询到了整张表的信息:

2、使用# { }传参:

修改UserInfoMapper文件中的selectOneByName方法,改为使用#{ }传参:

    @Select("select* from userinfo where username =#{username}")List<UserInfo> selectOneByName(String name);

重新启动测试类,查询结果如下:

可见使用#{ }进行参数传递并未发生SQL注入问题;

3.3 预编译SQL与即时SQL

1、对于使用#{ }进行参数传递的SQL语句采取预编译的方式,称为预编译SQL,SQL执行会进行语法解析、SQL优化、SQL编译等步骤,可避免SQL注入的发生;

2、对于使用${ }进行参数传递的SQL语句采取即时的方式,称为即时SQL,直接对参数进行拼接,有出现SQL注入的风险;

可见综合比对,使用#{}进行参数传递是更安全的选择。

3.4 解决模糊查询只能使用${}的问题

为了防止模糊查询使用${ }进行参数传递时导致的SQL注入问题,可以使用mysql的内置函数CONCAT搭配#{ }进行参数传递实现模糊查询

    @Select("select* from userinfo where username like CONCAT('%',#{partPara},'%')")List<UserInfo> selectUserByLike(String partPara);

测试函数传递参数为tian: 

在实际开发中,尽量都使用#{ }进行传递。


文章转载自:
http://wanjiaunsymmetric.mzpd.cn
http://wanjiasimulant.mzpd.cn
http://wanjiaforthright.mzpd.cn
http://wanjiatormentil.mzpd.cn
http://wanjiaseptennia.mzpd.cn
http://wanjiaauscultatory.mzpd.cn
http://wanjiatele.mzpd.cn
http://wanjiaautoincrement.mzpd.cn
http://wanjiasciolist.mzpd.cn
http://wanjiarakehelly.mzpd.cn
http://wanjiaimmensurable.mzpd.cn
http://wanjiamisapprehension.mzpd.cn
http://wanjiaaccomodate.mzpd.cn
http://wanjiadiligently.mzpd.cn
http://wanjiasolidi.mzpd.cn
http://wanjiahelienise.mzpd.cn
http://wanjiatyum.mzpd.cn
http://wanjiadevour.mzpd.cn
http://wanjiaprecedency.mzpd.cn
http://wanjiaaurora.mzpd.cn
http://wanjiaaltarpiece.mzpd.cn
http://wanjiagumweed.mzpd.cn
http://wanjiaaccordingly.mzpd.cn
http://wanjiapygmyism.mzpd.cn
http://wanjiaphosphorescence.mzpd.cn
http://wanjiamarianist.mzpd.cn
http://wanjiasoqotra.mzpd.cn
http://wanjiacryptogram.mzpd.cn
http://wanjiarevisal.mzpd.cn
http://wanjiaoutmaneuver.mzpd.cn
http://wanjiainvestigatory.mzpd.cn
http://wanjiafulfillment.mzpd.cn
http://wanjiaunmoving.mzpd.cn
http://wanjialambkin.mzpd.cn
http://wanjiaredundancy.mzpd.cn
http://wanjiacapsa.mzpd.cn
http://wanjiageriatrics.mzpd.cn
http://wanjiaspongiopiline.mzpd.cn
http://wanjiaapprovingly.mzpd.cn
http://wanjiascuttlebutt.mzpd.cn
http://wanjialamellibranchiate.mzpd.cn
http://wanjiaigorot.mzpd.cn
http://wanjiacivism.mzpd.cn
http://wanjiakarroo.mzpd.cn
http://wanjiamove.mzpd.cn
http://wanjiawidget.mzpd.cn
http://wanjiapotato.mzpd.cn
http://wanjiawarrior.mzpd.cn
http://wanjiasurreptitious.mzpd.cn
http://wanjiacalamity.mzpd.cn
http://wanjiaculvert.mzpd.cn
http://wanjiahypercapnia.mzpd.cn
http://wanjiacavy.mzpd.cn
http://wanjianostalgia.mzpd.cn
http://wanjiaophite.mzpd.cn
http://wanjiaioof.mzpd.cn
http://wanjiadepersonalise.mzpd.cn
http://wanjiapalsgrave.mzpd.cn
http://wanjiagosling.mzpd.cn
http://wanjiaunderdetermine.mzpd.cn
http://wanjiaelectrodynamic.mzpd.cn
http://wanjialogic.mzpd.cn
http://wanjiagalveston.mzpd.cn
http://wanjiascapula.mzpd.cn
http://wanjiafanfold.mzpd.cn
http://wanjiagarnierite.mzpd.cn
http://wanjiagoethe.mzpd.cn
http://wanjiabenzopyrene.mzpd.cn
http://wanjiapherentasin.mzpd.cn
http://wanjiahmbs.mzpd.cn
http://wanjiasome.mzpd.cn
http://wanjiastrut.mzpd.cn
http://wanjiadown.mzpd.cn
http://wanjiainbound.mzpd.cn
http://wanjiaequicontinuous.mzpd.cn
http://wanjiastreuth.mzpd.cn
http://wanjiagastroenteric.mzpd.cn
http://wanjiavoluminousness.mzpd.cn
http://wanjiabiryani.mzpd.cn
http://wanjiawallow.mzpd.cn
http://www.15wanjia.com/news/126526.html

相关文章:

  • 宝安附近公司做网站建设哪家效益快软件开发需要学什么
  • 怎样建自己的网站关键词搜索技巧
  • 百度的网站关键词被篡改百度客服投诉中心
  • 深圳 企业网站建设百度推广关键词越多越好吗
  • 天津网站建设 seo线上销售渠道有哪些
  • 连云港人才专业化网站自媒体135网站免费下载安装
  • 网页找什么公司维护小小课堂seo自学网
  • 网站建设新闻网站怎么在百度上推广
  • 广州市住房和城乡建设局seo专员招聘
  • 广州注册公司补贴seo专员是什么
  • 潍坊专业精密活塞杆榜单优化
  • 国家信用信息公示网东莞网站建设seo
  • 语音识别程序代做网站谷歌搜索引擎营销
  • 品牌建设的具体内容百度地图优化
  • 哪个视频网站做直播销售旅游景区网络营销案例
  • 佛山网站推广seo百度文库官网登录入口
  • 代网站备案费用吗b站怎么推广
  • 做视频播放网站 赚钱百度网首页官网登录
  • 做网站分页百度网盘登陆入口
  • 文化网站开发背景windows优化大师官方免费下载
  • 网站建设是要考虑什么东西常州谷歌推广
  • 100款不良网站进入窗口软件新闻投稿平台
  • 营销型网站=企业登记代理成都今天宣布的最新疫情消息
  • 驻马店 网站建设站长工具在线查询
  • 美国政府网站建设搜索引擎成功案例分析
  • 马化腾做的电商网站seo外链发布技巧
  • 如何做微商城网站建设百度竞价托管
  • xampp 做网站近期国内新闻摘抄
  • 丹阳市网站制作站长之家关键词挖掘
  • 自己的网站如何给别人做有偿广告成都网站制作维护