mybatis select查询之like的秘密
程序员文章站
2022-06-03 09:45:39
...
mybatis select查询之like的秘密
前言
sql中的like是干嘛的?
定义是这样说的:
LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式。
可能这个描述,大概都不了解,单是我们学过的猿们都知道,可以用来模糊查询。
在mybatis中怎么使用呢?接着往下看
使用like模糊查询
例如我们有一个需求是查询姓名中包含 “方”的
这里有一个user对象,他有两个属性,姓名和性别
public class user{
public String userName;
public String sex;
//get set 函数省略
}
我们的controller有一个查询姓名的接口
@RestController
public class UserController {
@Autowired
private UserService userService ;
/**
* 查询姓名中包含“方”的
*/
@PostMapping("/select")
public String select(username){
List<User> mList= userService .select(username);
return "ok";//随便返回一个字符串
}
}
mapper接口
@Mapper
public interface UserDao{
List<User> select( @Param("username") String username)
}
我们在mapper文件中怎么写这个查询语句呢?
我们熟悉mysql中的会这样写
<select id="select" resultType="com.fm.User">
SELECT * from user where username like "%"#{username}"%"
</select>
也可以使用CONCAT函数连接
<select id="select" resultType="com.fm.User">
SELECT * from user where username like CONCAT("%",#{username},"%")
</select>
我们熟悉 oracle中的小伙伴会这样写
<select id="select" resultType="com.fm.User">
SELECT * from user where username like CONCAT("%",CONCAT(#{username},"%"))
</select>
这是因为:
1、使用这种写法“%#{username}%”,在myabtis解析后在oracle中执行会报错,不是oracle不支持这种写法,是解析成oracle语句时的格式不对。
2、当使用CONCAT函数,oracle有两个CONCAT函数
Mysql支持多个字符串拼接:
CONCAT(str1,str2,…)
Oralce只支持两个字符串的拼接,若想拼接多个字符串可以嵌套使用concat
CONCAT(str1,str2)
适配多个数据库的写法
有时候我们开发的代码,可能会迁移到另外一个数据库中,遇到这种情况,我们为了不修改代码,mybatis还有一种写法可以应对这种情况,使用bind标签。
bind标签可以使用OGNL表达式创建一个变量并将其绑定到上下文中
<select id="select" resultType="com.fm.User">
SELECT * from user
<where>
<bind name="username " value=" '%' + username + '%' "/>
username LIKE #{username}
</select>
个人还是比较推荐第二种,mybatis的设计也挺好,考虑了这种情况。好了就到这里,希望能帮助大家在做模糊查询时,减少掉坑。我就被坑过。