目录
常见面试题!!!
#{ }
@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);