使用Mybatis框架,模糊查询 like 语句该怎么写?
时间: 2023-05-20 21:04:11 浏览: 336
在 Mybatis 中,模糊查询 like 语句可以通过在 SQL 语句中使用通配符 % 来实现。例如,如果要查询名字中包含 "张" 的用户,可以使用以下 SQL 语句:
SELECT * FROM user WHERE name LIKE '%张%';
其中,name 是要查询的字段名,% 表示任意字符,所以 %张% 表示名字中包含 "张" 的所有字符串。在 Mybatis 中,可以使用 ${} 或 #{} 来引用变量,所以可以将查询条件作为变量传入 SQL 语句中,例如:
SELECT * FROM user WHERE name LIKE '%${keyword}%';
其中,keyword 是查询条件的变量名。注意,使用 ${} 时,变量的值会直接替换 SQL 语句中的变量名,存在 SQL 注入的风险,而使用 #{} 时,变量的值会被转义,可以避免 SQL 注入的问题。
相关问题
Mybatis框架怎样实现模糊查询的
Mybatis框架中,可以使用动态 SQL 来实现模糊查询。下面是一个例子:
```
<select id="getUserByName" parameterType="String" resultMap="userMap">
SELECT * FROM user WHERE name LIKE CONCAT('%', #{name}, '%')
</select>
```
在上面的 SQL 语句中,使用了 `LIKE` 关键字来进行模糊匹配。同时,使用了 Mybatis 的占位符 `#{name}` 来接收参数值。为了在 SQL 语句中拼接 `%` 符号,可以使用 MySQL 中的 CONCAT 函数。
这里需要注意的是,在 SQL 语句中使用了 `%` 符号,因此需要进行转义,否则可能会被当做占位符处理。可以使用 `\` 或者 `<![CDATA[ ]]>` 标签来进行转义。例如:
```
<select id="getUserByName" parameterType="String" resultMap="userMap">
SELECT * FROM user WHERE name LIKE CONCAT('%', #{name}, '%')
<!-- 或者使用 <![CDATA[ ]]> 标签 -->
<!-- SELECT * FROM user WHERE name LIKE CONCAT('%', #{name}, '%') -->
</select>
```
mybatis中like模糊查询
### 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);
```
配合上述任意一条合法声明即可满足日常开发需求的同时保障整体质量水平处于可控范围之内 .
---
阅读全文
相关推荐
















