mybatis-plus 自定义SQL,XML形式,传参的几种方式

mybatisPlus中apply的使用以进行联表等复杂sql语句 select()` 方法用于选择需要返回的列,这里我们选择了 `user.*`、`order.*` 和 `product.*`,即返回三张表的所有列。假设你有三张表:`user`、`order` 和 `product`,它们之间的关系是 `user` 表和 `order` 表通过 `user_id` 进行关联,`order` 表和 `product` 表通过 `product_id` 进行关联。最后,我们使用 `selectMaps()` 方法执行查询,并将结果存储在 `resultList` 中。 阅读详情
AI摘要

本文详细介绍了在使用MyBatis-Plus框架进行数据库操作时,自定义SQL语句并传递参数的多种方法。包括使用QueryWrapper动态拼装SQL,传入简单类型参数,使用实体类或Map类型作为参数,以及具体的代码示例。

前提说明

在使用 mybatis-plus 进行操作数据库,有一部分比较复杂的操作需要写SQL语句,这样就会涉及到传参数。下面记载一下我遇到的几种传参数情况。如果有更好的可以留言,继续完善。

所涉及文件

自定义SQL涉及到两种类型的文件:###Mapper.java 和 ###Mapper.xml 。这两种文件都是mybatis-plus自动生成的。
例如下面的例子:

  1. TGrouponMapper.java文件的内容
public interface TGrouponMapper extends BaseMapper<TGroupon> {
    /**
     * @description: 获取用户参加的团购信息
     * @author: haojg
     * @date: 2020/6/18 19:48
     * @return:
     */
    IPage<TGroupon> selectUserJoinGroupon(Page<?> page, @Param("userId") Long userId);
}

  1. TGrouponMapper.xml文件的内容
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hddata.xpt.db.mapper.TGrouponMapper">
    <select id="selectUserJoinGroupon"  resultType="TGroupon">
        SELECT g.*, ref.join_status, ref.join_name, ref.join_phone, ref.user_id as join_user_id
        FROM t_groupon g, t_groupon_user_ref ref
        WHERE g.id = ref.groupon_id
        AND g.is_delete != 1
        AND ref.user_id = #{userId}
        ORDER BY g.create_time desc
    </select>
</mapper>

传参类型说明

1.Java代码中使用QueryWrapper动态拼装SQL

Java代码中使用QueryWrapper动态拼装SQL后,最后在马Mapper.xml文件中使用。这种情况适用于where条件比较复杂,分支比较多的情况,更多情况自己品味吧。直接上代码如下:

  1. Mapper.java文件内容:
public interface TIdentityDocumentInfoMapper extends BaseMapper<TIdentityDocumentInfo> {
    /**
     * @Description: 根据身份证和医院患者Id获取系统患者Id等信息
     * @Author: Haojg on 2019/8/7 23:37
     * @return:
     */
    List<TIdentityDocumentInfo> getPatientByIdAndPat(@Param(Constants.WRAPPER) QueryWrapper<TIdentityDocumentInfo> wrapper);

}
  1. Mapper.xml文件内容: ew.sqlSegment 是固定的写法,请注意。

    <select id="getPatientByIdAndPat"  resultType="TIdentityDocumentInfo">
        SELECT t1.*, t3.*
        FROM t_medical_card_info t1, t_identity_document_info t3
          WHERE t1.identity_document_id = t3.identity_document_id
          AND ${ew.sqlSegment}
    </select>

  1. 调用接口方法:
    这里通过Java直接拼接where语句。

        QueryWrapper<TIdentityDocumentInfo> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("t3.id", IdCard);
        queryWrapper.eq("t1.hospital_id", hosId);
        List<TIdentityDocumentInfo> queryList = tIdentityDocumentInfoMapper.getPatientByIdAndPat(queryWrapper);

2.简单类型参数(如String,Long,Integer等),适用于固定且确定的参数

这种情况直接上代码。

  1. Mapper.java文件内容,通过 @Param 进行参数设置。
IPage<TGroupon> selectUserJoinGroupon(Page<?> page, @Param("userId") Long userId);
  1. Mapper.xml文件内容:直接使用参数 userId
<select id="selectUserJoinGroupon"  resultType="TGroupon">
        SELECT g.*, ref.join_status, ref.join_name, ref.join_phone, ref.user_id as join_user_id
        FROM t_groupon g, t_groupon_user_ref ref
        WHERE g.id = ref.groupon_id
        AND g.is_delete != 1
        AND ref.join_status != 0
        AND ref.user_id = #{userId}
        ORDER BY g.create_time desc
    </select>

3.参数传入类型为Class类,或mybatis-plus生成的 entity类

  1. Mapper.java文件内容: **HoRefunds ** 是数据库中表映射成的entity类
    int updateRefundOk(@Param("subTable") String subTable, @Param("hoRefunds") HoRefunds hoRefunds);
  1. Mapper.xml文件内容中, 如下面的代码中: hoRefunds.refundResponse , hoRefunds 是 entity类, refundResponse 是字段名称。
    <update id="updateRefundOk">
      update ho_refunds_${subTable} set
        refund_request = #{hoRefunds.refundRequest},
        refund_response = #{hoRefunds.refundResponse},
        err_code = #{hoRefunds.errCode},
        err_code_des = #{hoRefunds.errCodeDes}
      where id = #{hoRefunds.id}
    </update>

4.参数传入类型为Map类型的数据

当entity类不满足情况的时候,可以使用Map类型的数据,具体例子如下。

  1. Mapper.java文件内容: paramsMap 为Map类型
public int getPushHistoryIsExsit(Map<String, Object> paramsMap);
  1. Mapper.xml文件内容中,
    01,标明传入参数的类型 ** parameterType=“java.util.Map” **
    02,直接使用传入参数中的Key, 如:step , cardId, notifyType
    <select id="getPushHistoryIsExsit" parameterType="java.util.Map" resultType="int">
        select count(t1.id) from hcustom_his_push t1
        inner join hcustom_notify_config t2
        on t1.notify_config_id = t2.id
        and t2.notify_steps = #{step} and t2.notify_type = #{notifyType} and t1.medical_card_id = #{cardId}
    </select>

  1. 调用实例
        Map<String, Object> paramsMap = new HashMap<>();
        paramsMap.put("cardId", cardId);
        paramsMap.put("step", step);
        paramsMap.put("notifyType", notifyType);
		int pushCount = hcustomHisPushMapper.getPushHistoryIsExsit(paramsMap);

我目前就使用了这么多,如果大家还有更多用法,欢迎交流!!!

使用mybatisPlus的queryWrapper进行子查询(以及传统xml方式做leftjoin) 然后,我们通过 `checkGroupMapper.selectList` 方法,根据检查套餐与检查组之间的关系表(t_setmeal_checkgroup) 查询所有关联的检查组对象 `groupList`,并通过循环遍历每个检查组对象,再通过 `checkItemMapper.selectList` 方法,根据检查组与检查项之间的关系表(t_checkgroup_checkitem)查询所有关联的检查项对象,然后将检查项列表设置到检查组对象中,最后将检查组列表设置到检查套餐对象中,并返回它。 阅读详情

相关推荐

MyBatis-plus执行自定义SQL

还有另外24篇MySQL+MyBatis+MyBatis-plus相关文章。

lydms的博客 9537

MyBatis-Plus 使用自定义sql语句时的五种参数传递方式

Mybatis(四)SQL语句中参数传递的五种方法

web18334137065的博客 1326

Spring Boot入门(14):使用Mybatis-Plus轻松实现高效自定义SQL操作!

如何使用Mybatis-Plus执行自定义SQL,一文教会你。

**My Coding Family** 3万+

mybatis-plus中apply方法sql like传参

关于在apply中的模糊查询的sql语句怎么传参

weixin_43224069的博客 2393

SPSS&Mplus—共同方法偏差(Common Method Bias)控制与检验

共同方法偏差(Common Method Bias)的控制方法:程序控制(Procedural)和统计控制(Statistical)。

m0_54401011的博客 1万+

【CTF-misc】java盲水印BlindWatermark工具使用

​ 盲水印是一种肉眼不可见的水印方式,对图片资源使用图片盲水印或者文字水印,借此避免数字媒体未经授权的复制和拷贝,可通过对原图进行解码操作,得到水印图来证明版权归属。 题目来源:NewStarCTF 2023 公开赛道 WEEK2|MISC:Jvav

qq_39972370的博客 6447

SpringBoot【九】mybatis-plus之自定义sql零基础教学!

mybatis-plus的基本使用,前两期基本讲的差不多,够日常使用,但是有的小伙伴可能就会抱怨了,若是遇到业务逻辑比较复杂的sql,都使用swagger进行拆分组装?mybatis-plus动态拼接sql满足单表查询,若是遇到多表关联且条件复杂涉及分组就不是那么的灵活,那有办法满足该种特殊需求么?不好意思,还真有,mybatis-plus也早就预料到了会存在该种需求,便对该特殊有了特殊处理,继续沿用了他的兄弟mybatis自定义sql的功能,没想到吧!

mf97532的博客 1649

来自工业界的知识库 RAG 服务(二),RagFlow 源码全流程深度解析

前面介绍过有道 QAnything 源码解析,通过深入了解工业界的知识库 RAG 服务,得到了不少调优 RAG 服务的新想法。因此本次趁热打铁,额外花费一点时间,深入研究了另一个火热的开源 RAG 服务RagFlow的完整实现流程,希望同样有所收获。首先依旧可以先从框架图入手,与常规的 RAG 架构进行一些比较可以看到右侧知识库被明显放大,同时最右侧详细介绍了文件解析的各种手段,比如OCR等,这些在常规的 RAG 中可能会作为一个不起眼的。

易迟的专栏 2万+

Mybatis-Plus:持久层数据的高效处理(新手笔记四)--联表查询基础之手写SQL

前面已经将中绝大部分原生API都已经测试完毕。接着上一章结尾提到的,这一章将学习手写的SQL语句。在学习手写SQL之前,需要介绍一下mapper.xml中的表映射如何编写,因为手写SQL是属于mybatis的内容,而mybatis的映射关系是需要自己手写的。当然在此之前,需要你有一定的SQL基础。在前面我们仅仅学习了SQL的单表查询,而想要实现基于的连表查询则需要自己手写SQL实现,这也是为什么要学习手写SQL的原因。

qq_52434217的博客 1374

Unity URP风格化水面Shader全流程实现与性能优化指南

在游戏开发中,Shader是实现特定视觉风格的核心技术,它通过编写在GPU上运行的程序,控制模型每个像素的最终颜色与光照表现。其原理在于对顶点位置、纹理坐标、光照信息及深度等数据进行一系列数学运算与插值。这项技术的价值在于能够以极高的自由度创造从写实到卡通的各种渲染效果,同时通过算法优化实现对硬件资源的精准控制。在移动游戏、独立游戏等对性能与风格化有强烈需求的场景中,自定义Shader尤为重要。本文聚焦于使用Unity URP渲染管线,从零构建一个高效的风格化水面Shader,详细拆解了深度色、波浪动画、边

weixin_34320724的博客 371

【UE5】RTS游戏的框选功能+行军线效果实现

步骤: 一、项目准备; 二、框选NPC并移动到指定地点; 三、框选效果; 四、行军线效果

ChaoChao66666的博客 2378

Mybatis用xml配置sql传参方式

1、传入一个参数 方法: int deleteByPrimaryKey(Integer id); 配置 <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer"> delete from t_people where id = #{id,jdbcType=INTEGER} </del...

Zystem 2583

【目标检测】IoU(交并比)详解及代码实现

1. IOU概述        IoU的全称为交并比(Intersection over Union),是目标检测中使用的一个概念,IoU计算的是“预测的边框”和“真实的边框”的交叠率-,即它们的交集和并集的比值。最理想情况是完全重叠,即比值为1。 2. IoU计算        IoU等于“预测的边框”和“真实的边框”之间交集和并集的比值。IoU计算如下图,B1为真实

Roaddd的博客 2万+

MyBatis-Plus

在 MyBatis-Plus 中,@TableId注解用于指定数据库表的主键字段,而@IdType则用于设置主键的生成策略。

m0_73837751的博客 1462

uni-app 实现高德 / 百度 / 腾讯地图多端导航跳转(H5最全方案)

本文介绍了一套生产级可复用的多地图导航Hook封装方案。针对开发中常见的经纬度顺序混乱、中文乱码、参数不统一等问题,提供了统一解决方案。方案支持高德、百度、腾讯三大地图平台,封装了各平台的URI参数处理逻辑,包括坐标顺序转换、名称编码、导航模式适配等核心功能。通过组合式API设计,开发者只需调用统一入口即可实现多地图导航跳转,同时保留单独调用各平台的能力。文中还总结了6大常见坑点,并推荐默认使用高德地图作为最稳定的导航方案。该方案适用于车辆定位、物流配送等多种业务场景,可封装为可复用的Hooks组件。

专注于前端开发与实战技巧,记录从零到一的学习与项目经验。分享 Vue3 / JavaScript / TypeScript / Flutter /Uniapp等前端技术,以及 性能优化、工程化、最佳实践。 537

SAP 交货成本(运费)

交货成本: 业务场景: 有些产品或供应商,会产生交货成本(运费、关税等) 业务模拟(以运费为例): 1、运费在采购订单体现:计划运费 ME21N创建采购订单,并且包含运费: MIGO收货时: 由上可知,MIGO时运费最终体现在库存(存货)科目中(V),或者价格差异中(S计价时)。 MIRO发票校验: 运费最终体现在单独科目中: 后台配置: 运费在发票时候...

willieyuan的博客 1万+

菜鸟怎么用Wrapper写多表自定义sql?

文章目录前言一、Wrapper 的使用二、使用步骤1.首先给出一段sql语句首先改xml文件里的sql:Mapper层Service层Controller层url总结 前言 使用了mybatis-plus之后, 自定义SQL的同时也想使用Wrapper的便利 mybatis-plus的依赖 <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus</ar

fighting_xuan的博客 8501

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

MyBatis面试题(2022最新版)

Mybatis面试题

qq_22075913的博客 2336

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

MyBatis-Plus QueryWrapper 深度解析:从基础封装到高阶查询实战

在Java持久层开发中,动态SQL构建是处理复杂查询条件的关键技术。其核心原理是通过对象化、结构化的方式将查询条件抽象为语法树,而非传统的字符串拼接,从而在编译期提供类型安全检查,并从根本上杜绝SQL注入风险。这一技术价值在于显著提升代码的可维护性、安全性和开发效率,使开发者能够以更符合Java编程习惯的方式描述查询逻辑。在实际应用场景中,它广泛用于构建多条件动态筛选、分页查询以及复杂的数据报表功能。本文聚焦于MyBatis-Plus框架中的`QueryWrapper`与`AbstractWrapper`,

weixin_34262482的博客 799

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

MyBatis-Plus实战:从配置到代码生成器,高效开发单表CRUD

在Java后端开发中,数据库访问层的模板化重复代码一直是效率瓶颈。从JDBC到MyBatis-Plus,框架不断将基础CRUD与资源配置自动化,让开发者更专注于业务逻辑。MyBatis-Plus作为MyBatis增强工具,基于BaseMapper与Wrapper条件构造器,免去XML中单调SQL编写,并内置分页、乐观锁、逻辑删除等常用能力,适用于Spring Boot + MySQL项目以及表多、CRUD密集的管理系统。本文结合实训项目,梳理MyBatis-Plus的配置要点、分页与乐观锁使用、字段自动填充

weixin_33888907的博客 355

JdbcTemplate和MyBatis的区别

摘要: JdbcTemplate(Spring框架内置)与MyBatis(独立持久层框架)是Java后端开发中常用的数据库操作工具,二者核心差异显著。JdbcTemplate轻量级,通过封装JDBC简化模板化SQL操作,但SQL硬编码在Java中,需手动处理结果映射;MyBatis则实现SQL与代码解耦,支持XML/注解编写SQL,提供自动映射、动态SQL及缓存功能。JdbcTemplate适合简单场景,学习成本低;MyBatis更灵活,适合复杂查询,但需额外配置。选择时需权衡开发效率、维护性及项目复杂度。

ymqzhy的博客 862

MyBatis04-MyBatis小技巧

#{}与${}、批量删除、模糊查询、java类起别名、mybatis-config配置文件中的<mapper>标签的属性讲解、获取插入数据后的自增主键

qq_31532983的博客 991

mybatis注解动态sql limit like

写在前面 在用mabatis的时候是觉得已经很方便了,但是碰到动态的sql语句,就有点蒙了,昨天刚写完我的动态sql,遇到了不少问题,百度了很多波,好多文章对于like limit涉及的不是很多。在这里做一下记录 问题背景 我需要在下面这张表里,根据 pname 和 typeId 查找这张表里的数据。可是pname 这个字段我是不一定每次都会有的 select count(*) from product where typeId = #{typeId} (and pname like #{pname}) /

EEstefan的博客 1752

MyBatis传参

传入单个参数 sql语句中使用#{任意字符}进行传参 传入多个参数 使用arg0~argN进行传参 使用param1~paramN进行传参 在传参的时候使用注解自定义变量名@Param("自定义名称") 多个参数中有对象时paramN.属性名 传入一个对象 只有一个对象时可以直接使用#{属性名字}进行传参 传入一个Map时 1.可以使用Map中的key值进行传值#{key} 传入一个集合 list[0]~list[n] #{}和${}的区别 ${}可能存在依赖注入 ${}以字符串拼接的形式

weixin_44419615的博客 157

使用 Mybatis 真心不要偷懒!

本文首发于个人微信号《andyqian》,期待你的关注~ 前言 这篇文章非常简单,没有什么高深技术。这些细节用过Mybatis的童鞋都知道。写这篇文章的缘由是:在最近的工作中,接手了一个外包项目,发现项目中 mapper 文件全部是自动生成的,代码十分冗余且不易维护,用知乎上的回答,这算得上是名副其实的”屎山”代码了。现在用 Mybatis做持久层算是Java系的主流,其中有一...

划不出的界限 367

MyBatis-Plus SQL日志打印全指南:从基础配置到全链路追踪

在Spring Boot项目中,数据库操作的可见性是排查性能瓶颈与数据异常的关键,而SQL日志正是透视数据库行为的一扇窗口。了解MyBatis-Plus的底层日志机制,掌握日志级别、参数占位符还原等核心原理,能有效避免线上环境“看不见SQL”的困境。通过p6spy或自定义拦截器,可以将带?的预处理语句还原为可直接执行的完整SQL;引入traceId并集成ELK,则能实现从接口入口到数据库操作的完整链路追踪,让每一次请求的SQL调用有据可查。无论是本地开发调试、生产环境动态开关日志,还是慢SQL监控,合理的S

weixin_34037173的博客 260
低头猛干
博客等级 码龄8年 2粉丝 1原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值