欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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的设计也挺好,考虑了这种情况。好了就到这里,希望能帮助大家在做模糊查询时,减少掉坑。我就被坑过。