项目场景:
此处为SSM项目中的实践,仅展示部分相关代码:我的实体类为BaseStaffPO
controller层
BaseStaffController.java
@ApiOperation(value = "根据名字查询" , httpMethod = "POST")
@RequestMapping("/selectByName")
public List<BaseStaffPO> selectByName(@RequestParam("name") String staffName , Model model){
List<BaseStaffPO> list = baseStaffService.queryByName("%"+staffName+"%");
model.addAttribute("list",list);
return list;
}
service层
BaseStaffService.java
List<BaseStaffPO> queryByName(String staffName);
实现类:BaseStaffServiceImpl.java
@Override
public List<BaseStaffPO> queryByName(String staffName) {
return baseStaffMapper.selectByName(staffName);
}
dao层
BaseStaffMapper.java
List<BaseStaffPO> selectByName(String staffName);
BaseStaffMapper.xml
<select id="selectByName" resultType="baseStaffPO">
select * from base_staff where staff_name like #{staffName}
</select>
方式一
如图中所示,在Controller层传参时传入已拼接 “%” 的字符串
方式二
在 Sql 语句中拼接通配符
使用 ${}
<select id="selectByName" resultType="baseStaffPO">
select * from base_staff where staff_name like '%${staffName}%'
</select>
注意:这里的 ‘%${staffName}%’ 不能缺少单引号,缺少单引号程序会报错,同时 #{} 要改为 ${},原因是如果加上单引号,那么 %#{staffName}% 就被当成是一个字符串,而 #{} 在字符串中不能识别,要改写成 ${} 这种形式。
但是通过 ${} 的方式拼接的sql语句,不再是以占位符的形式生成sql,而是以拼接字符串的方式生成sql,这样做会引发sql注入的问题。
使用 #{}
<select id="selectByName" resultType="baseStaffPO">
select * from base_staff where staff_namelike "%"#{staffName}"%"
</select>
服务器执行日志:
此方法可以防止sql注入
方式三
使用 MySQL 的 concat() 函数
使用方法:
concat(str1,str2,…)
返回结果为连接参数产生的字符串。如有任何一个参数为NULL ,则返回值为 NULL。
<select id="selectByName" resultType="baseStaffPO">
select * from base_staff where staff_name like concat('%',#{staffName},'%')
</select>
查看服务器执行日志,可以发现此方法在处理#{ }时,经过了预编译处理,可以防止sql注入,同时又能够直接写在配置文件中