Mybatis中的like查询

转自:http://blog.youkuaiyun.com/zhang98722/article/details/6956571


今天要做一个模糊查询

用的Mybatis

开始写的是:

[html]  view plain copy
  1. select id,bookName,author,publisher,donor,status,createDate,lastUpdate from book   
  2.         <where>  
  3.             <if test="bookName!=null">  
  4.                 bookName like '%#{bookName}%'  
  5.             </if>  
  6.             <if test="author!=null">  
  7.                 and author like '%#{author}%'  
  8.             </if>  


最后改为:

[html]  view plain copy
  1. select id,bookName,author,publisher,donor,status,createDate,lastUpdate from book  
  2.         <where>  
  3.             <if test="bookName!=null">  
  4.                 bookName like CONCAT('%','${bookName}','%' )  
  5.             </if>  
  6.             <if test="author!=null">  
  7.                 and author like CONCAT('%','${author}','%' )  
  8.             </if>  

主要还是MyBatis传值的问题啊

如果不是字符串就没法替换了


### MyBatis中实现LIKE模糊查询MyBatis中,可以通过多种方式实现`LIKE`模糊查询。以下是常见的几种方法及其具体实现: #### 方法一:使用 `concat` 函数和 `#{}` 参数占位符 这种方式利用SQL中的`CONCAT`函数将通配符 `%` 和参数动态拼接在一起。这种方法可以有效防止SQL注入攻击。 ```sql SELECT * FROM table_name WHERE column_name LIKE CONCAT('%', #{param}, '%'); ``` 此方法通过预编译的SQL语句传递参数,从而提高安全性[^1]。 --- #### 方法二:直接使用 `${}` 插入字符串并手动添加 `%` `${}` 是一种直接替换变量的方式,适合用于静态SQL场景。需要注意的是,这种写法存在潜在的安全风险,容易受到SQL注入攻击。 ```sql SELECT * FROM table_name WHERE column_name LIKE '%${param}%'; ``` 尽管如此,在某些特定情况下(如完全信任输入数据),该方法仍然被广泛采用[^2]。 --- #### 方法三:组合 `concat` 和 `${}` 如果希望既保持灵活性又减少安全隐患,则可以选择混合模式——即部分固定逻辑由数据库处理而其他部分交予程序控制。 ```sql SELECT * FROM table_name WHERE column_name LIKE CONCAT('%%', ${param}); ``` 不过仍需谨慎对待任何未经验证的数据源[^3]。 --- #### 方法四:借助双竖线 (`||`) 实现 Oracle 数据库下的功能扩展 对于支持特殊运算符 (比如Oracle 的 || ) 的 RDBMS 而言, 我们还可以尝试如下形式: ```sql -- 适用于 Oracle 数据库环境 SELECT * FROM table_name WHERE column_name LIKE '%' || #{param} || '%'; ``` 这同样依赖于框架内部机制完成最终解析工作[^4]. --- #### 推荐的最佳实践 综合考虑性能与安全因素之后 , 应优先选用基于 **Prepared Statement** 构建起来的标准接口调用链路; 同时确保所有外部提交过来的内容都经过严格校验后再参与实际执行流程. ```java // Java Mapper Interface Example List<Record> findRecordsByKeyword(@Param("keyword") String keyword); ``` 配合上述任意一条合法声明即可满足日常开发需求的同时保障整体质量水平处于可控范围之内 . ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值