#{ }和${ }——MtBatis两种参数赋值方式对比

目录

#{ }

${ }

#{ }优点:

${ }使用场景


 

常见面试题!!!

#{ }

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

参数使用 “?”进行占位,为预编译SQL,提前对SQL进⾏编译,然后把参数填充到SQL语句 中.#{} 会根据参数类型,⾃动拼接引号

${ }

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

注意,${ }方式,参数为字符串时需要添加引号

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

${ } 会直接进⾏字符替换,为即时SQL,⼀起对SQL进⾏编译.如果参数为字符串,需要加上引号 '  '

#{ }优点

性能更高

预编译SQL,编译⼀次之后会将编译后的SQL语句缓存起来,后⾯再次执⾏这条语句时,不会再次编译 (只是输⼊的参数不同),省去了解析优化等过程,以此来提⾼效率

更安全(防止SQL注入)

SQL注入例子

@Select("select username, `password`, age, gender, phone from userinfo where 
username= '${name}' ")
List<UserInfo> queryByName(String name);
@Test
void queryByName() {
 List<UserInfo> userInfos = userInfoMapper.queryByName("' or 1='1");
 System.out.println(userInfos);
}

${ }使用场景

使用#{ }时会自动加上引号,所以不能在 SQL 语句的片段(如列名、表名、LIKE 语句的部分模式等)中使用

如:

①排序功能

@Select("select id, username, age, gender, phone, delete_flag, create_time, 
update_time " +
 "from userinfo order by id #{sort} ")
List<UserInfo> queryAllUserBySort(String sort);

使用#{ }时,asc自动加上了引号

正确处理方式是使用${ }

@Select("select id, username, age, gender, phone, delete_flag, create_time, 
update_time " +
 "from userinfo order by id ${sort} ")
List<UserInfo> queryAllUserBySort(String sort);

②like查询

${ }可以完成,但仍然存在SQL注⼊的问题,所以通常使⽤mysql内置函数concat来完成

@Select("select id, username, age, gender, phone, delete_flag, create_time, 
update_time " +
 "from userinfo where username like concat('%',#{key},'%')")
List<UserInfo> queryAllUserByLike(String key);

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值