使用Mybatis模糊查询

项目场景:

此处为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注入,同时又能够直接写在配置文件中

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值