首页 > 数据库 >【实用技巧】【Mybatis】自定义的动态 SQL

【实用技巧】【Mybatis】自定义的动态 SQL

时间:2024-02-08 15:56:56浏览次数:32  
标签:实用技巧 res 自定义 reqDto test SQL Mybatis customSqlPo po

1  前言

平时我们可能会拼接 SQL,尤其是做一些报表的开发或者连表查询的时候,当条件发生变更或者关联关系需要改变的时候,就需要更改代码里的 SQL,所以我这里弄了一个简易版的基于 Mybatis的动态 SQL调用。

2  实现

主要是 Mybatis的动态 SQL:

// controller层
@Override
@PostMapping(value = "/test", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
public ResultDto<PagerDto<Map>> test(@RequestBody CustomSqlReqDto reqDto) {
    PagerDto<Map> res = portalService.test(reqDto);
    return ResultDto.ok(res);
}
// service层
@Autowired
private AccountRepository accountRepository;
@Override
public PagerDto<Map> test(CustomSqlReqDto reqDto) {
    CustomSqlPo po = new CustomSqlPo();
    po.setMainSql(reqDto.getMainSql());
    po.setParam(reqDto.getParam());
    po.setSorter(reqDto.getSorter());
    po.setHasWhere(reqDto.getHasWhere());
    PagerDto<Map> res = accountRepository.test(po);
    return res;
}
// repository持久层
@Override
public PagerDto<Map> test(CustomSqlPo customSqlPo) {
    Page<Map> pageParam = new Query<Map>(customSqlPo.getParam(), false).getPage();
    Page<Map> page = accountMapper.test(pageParam
            , customSqlPo.getMainSql()
            , customSqlPo.getHasWhere()
            , customSqlPo.getParam()
            , customSqlPo.getSorter());
    PagerDto<Map> res = PagerUtil.changeToPagerDto(page);
    return res;
}
// mapper接口
Page<Map> test(Page<Map> pageParam
            , @Param("mainSql") String mainSql
            , @Param("hasWhere") Boolean hasWhere
            , @Param("param") Map<String, Object> param
            , @Param("sorter") LinkedHashMap<String, Object> sorter);
// xml定义模板
<select id="test" resultType="java.util.Map">
    ${mainSql}
    <choose>
        <when test="hasWhere != null and hasWhere">
            <if test="param != null and param.size() > 0">
                <foreach collection="param.entrySet()" index="key" item="value">
                    and ${key} = #{value}
                </foreach>
            </if>
        </when>
        <otherwise>
            <if test="param != null and param.size() > 0">
                <where>
                    <foreach collection="param.entrySet()" index="key" item="value">
                        and ${key} = #{value}
                    </foreach>
                </where>
            </if>
        </otherwise>
    </choose>
    <if test="sorter != null and sorter.size() > 0">
        order by
        <foreach collection="sorter.entrySet()" index="key" item="value" separator=",">
            ${key} ${value}
        </foreach>
    </if>
</select>

大家主要看最后的这个 SQL 模板,有拼条件的,有拼排序的。

3  效果

3.1  单表查询的

3.2  连表查询的

最后大家可以把这样的 SQL 保存到数据库中,每次调用从数据库中获取 SQL。

大家如果有更好的或者有其他更好的主意的还请多多指教哈。

标签:实用技巧,res,自定义,reqDto,test,SQL,Mybatis,customSqlPo,po
From: https://www.cnblogs.com/kukuxjx/p/18011871

相关文章

  • mybatis 通过拦截器打印完整的sql语句以及执行结果操作
    下面的文件放在source-fw的【jp.co.token.sikyuu.iterceptor】包下面MybatisInterceptor.javaInterceptorForQry.java下面的文件放在source-fw的【jp.co.token.sikyuu.common】包下面FastJsonUtils.java下面的文件放在WebRoot/WEB-INF/lib/路径下面fastjson-......
  • docker---dockerfile自定义镜像指令
    dockerfile指令FROM#指定所基于的镜像名称及其标签来创建新镜像。RUN#在镜像中执行命令。ADD#将文件或目录复制到镜像中。可以使用URL作为源文件。COPY#与ADD类似,将文件或目录复制到镜像中,但不支持URL作为源文件。CMD#指定运行容器时要执行的命令,如果在......
  • MyBatis缓存
    MyBatis缓存缓存就是内存中的数据,常常来自对数据库查询结果的保存,使用缓存,我们可以避免频繁的与数据进行交互,进而提高响应速度。MyBatis也提供两种缓存模式,分为一级缓存和二级缓存。优点:提供查询效率减少频繁进行I/O操作,从而减少数据库的压力。适合存放缓存的数据:【1】查询频......
  • pattern和validator自定义校验规则
    data(){constcheckNum=(rule,value,callback)=>{   if(value||value===0){    if(value<1||value>99){     returncallback(newError('次数取值范围1~99'))    }    if(!Number.isInteger(Number(value)......
  • Mybatis Plus java.lang.NoSuchMethodError: com.baomidou.mybatisplus.core.toolkit.
    问题描述在进行SpringBoot整合MybatisPlus时提示10:49:08.390[restartedMain]DEBUGorg.springframework.boot.context.logging.ClasspathLoggingApplicationListener-Applicationfailedtostartwithclasspath:[file:/D:/%e7%99%be%e5%ba%a6%e7%bd%91%e7%9b%98/Vue......
  • 记录一次Electron程序打包自定义安装包
    首先下载nsNiuNiu打包程序下面就是下载之后解压的文件夹内容,注明了主要文件/文件夹的用途将使用electron-builder打包的文件内容拷贝到FilesToInstall,也就是文件夹下面的内容拷贝过去修改.\SetupScripts\nim\nim_setup.nsi中的内容,这个文件是nsis的打包主文件,在其中设......
  • app.json 中未定义自定义编译中指定的启动页面
    换了启动页,这里得手动改。。。。。。。。。。。[app.json或自定义编译条件错误]app.json中未定义自定义编译中指定的启动页面./pages/index/index(env:Windows),......
  • 固定表结构与可自定义表结构
    整个平台的表结构分为两种:固定的和可自定义的。固定表结构适合于比较固定的信息对象,例如在平台的客户关系管理模块中,尽管各个行业有所差异,但是大同小异,可以固化表结构,使用实体来映射表。对象的编辑界面也是固定的,比较简单。 可自定义的表结构使用于灵活的数据对象,例如平台的人力资......
  • Leaflet 实现自定义瓦片实现xyz信息和边框绘制到瓦片上
    Leaflet实现自定义瓦片的渲染,将一些信息和边框绘制到瓦片上。主要作用是创建一个Canvas元素作为Leaflet的瓦片,并在Canvas上绘制一些文本信息和边框。实现步骤:创建一个Canvas元素作为Leaflet的瓦片,并获取其2D绘图上下文。设置Canvas的大小为当前瓦片的大小。......
  • 代码手术刀-自定义你的代码重构工具
    前言笔者近日在做代码仓库的存量代码缩减工作,首先考虑的是基于静态扫描的缩减,尝试使用了很多工具来对代码进行优化,例如PMD、IDEA自带的inspect功能、findBugs等。但是无一例外,要么过于“保守”,只给出扫描结果,但是无法实现一键优化,要么直接就是有bug(这里特指IDEA2023.1.5专业版-in......