mybatis-plus中使用MySQL函数

最近在做的项目有个相册功能,需要按年份分类筛选。这不禁让人想到mysql中的year(date)函数(其实我也没想到,度娘告诉我的)。
year(date)函数是将date中的年份提出来。比如year(‘2022-10-02 12:21:23’) = 2022。那么我们就可以在sql语句中使用这来做判断。例如:

select * 
	from t_picture 
	where album_id = 1 and year(create_time) = "2021" 
	ORDER BY create_time DESC

一开始我想到的是,使用Mybatis-plus(后面简称MP) 中的last()来拼接在最后,无视优化规则直接拼接到 sql 的最后,然后再拼上排序就可以。运行才知道,last()只能调用一次,多次调用以最后一次为准 有sql注入的风险,请谨慎使用,也就是说会把之前的覆盖掉。后来我又去翻MP的手册 Mybatis-Plus官网
发现有一个函数我之前没接触过。apply() 拼接 sql
注意事项:
该方法可用于数据库函数 动态入参的params对应前面applySql内部的{index}部分.这样是不会有sql注入风险的,反之会有!

public PageUtils queryPage(Map<String, Object> param) {
        Integer albumId = Convert.toInt(param.get("albumId"));
        Integer type = Convert.toInt(param.get("type"));
        Integer year = Convert.toInt(param.get("year"));
        IPage<Picture> page = this.page(new Query<Picture>().getPage(param),
                new QueryWrapper<Picture>()
                        .eq(type!=null,"type",type)
                        .eq(albumId!=null,"album_id",albumId)
                        .apply(year!=null,"year(create_time) = {0}",year)
                        .orderByDesc("create_time"));

        return new PageUtils(page);
    }

注意:{0}不要加引号,系统会自动帮你加。加了会随便不到占位,会出现以下错误:

com.baomidou.mybatisplus.core.exceptions.MybatisPlusException: Error: Method queryTotal execution error of sql : 
 SELECT COUNT(1) FROM t_picture WHERE (type = ? AND year(create_time) = '?')
...........
Parameter index out of range (2 > number of parameters, which is 1).

错误解释,只有一个占位,却来两个参数,导致不能运行。这是因为{0}加上引号的原因,MP识别不到占位符。就少一个坑,多出来了个萝卜。

apply()还可用于其他函数,更多用法可自行琢磨

你可能感兴趣的:(mybatis,mysql,数据库,java)