java_mybatis_mapper_sql语句示例

server/2025/1/15 22:58:08/

需求:

有2张表,一张活动信息表(activity_info), 一张参加活动的商品表(activity_sku)

查询当前在活动期间的,且存在于我输入的商品(sku)列表中的商品(sku)的编号id

参考:63 尚上优选项目-平台管理端-营销活动管理-营销活动接口(开发匹配sku列表接口)_哔哩哔哩_bilibili

SQL语句:

sql语句:

<?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.atguigu.ssyx.activity.mapper.ActivityInfoMapper"><!--如果之前参加过,且活动正在进行-当前时间在活动有效期时间内,则排除商品--><!-- SQL 语句:select asku.sku_idfrom activity_info activityinner join activity_sku asku on activity.id=asku.activity_idwhere asku.sku_id in (1,2,3)  #下面的 foreach 将List<long>变成SQL中的数组形式(1,2,3)and now() between activity.start_time and activity.end_time--><select id="selectSkuInfoIdListExist" resultType="Long">select asku.sku_idfrom activity_info activityinner join activity_sku asku on activity.id=asku.activity_id<where> <!--where, if标签:MyBatis框架的动态SQL元素, 用于根据条件构建SQL语句的一部分--><if test="skuIdList != null">and asku.sku_id in <!--这里的and是为了说明和if的并列关系--><foreach collection="skuIdList" item="skuId" index="index" open="(" separator="," close=")">#{skuId}</foreach></if></where>and now() between activity.start_time and activity.end_time</select>
</mapper>

java mapper定义部分:

java">package com.atguigu.ssyx.activity.mapper;import com.atguigu.ssyx.model.activity.ActivityInfo;
import com.atguigu.ssyx.model.product.SkuInfo;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;import java.util.List;/*** <p>* 活动表 Mapper 接口*/
@Repository
public interface ActivityInfoMapper extends BaseMapper<ActivityInfo> {List<Long> selectSkuInfoIdListExist(@Param("skuIdList") List<Long> skuInfoIdList);
}

执行下面sql语句,效果如下:

sql">select *
from activity_info activity
inner join activity_sku asku on activity.id=asku.activity_id
where asku.sku_id in (1,2,3)
and now() between activity.start_time and activity.end_time 

解释:

这段SQL语句是在尝试结合MyBatis框架的XML映射文件语法和普通SQL语句来查询数据。下面是对这段代码的逐部分解释,以及关于<where>标签下使用and的原因和#{}的用法。

SQL语句解释

  1. 基本查询结构
    • activity_info表(别名为activity)和activity_sku表(别名为asku)中选择asku.sku_id
    • 使用INNER JOIN来连接这两个表,条件是activity.id = asku.activity_id
  2. 条件查询
    • <where>标签和<if>标签是MyBatis框架的动态SQL元素,用于根据条件构建SQL语句的一部分。
    • <if test="skuIdList != null">检查skuIdList变量是否不为null。如果条件为真,则执行内部的SQL片段。
    • <foreach>标签用于遍历skuIdList集合,并为每个元素生成一个sku_id的值,这些值被用于IN查询中,以检查asku.sku_id是否在这些值中。
  3. 固定条件
    • and now() between activity.start_time and activity.end_time是另一个固定条件,检查当前时间是否在活动的时间范围内。

为什么 <where> 标签下要用 and

在MyBatis中,<where>标签用于智能地添加WHERE关键字到SQL语句中,并且会自动处理前面的逻辑运算符(如ANDOR),以避免语法错误。当你在<where>标签内部开始添加条件时,如果<where>是第一个条件(即没有前面的条件),它不会添加WHERE关键字前的ANDOR。但是,如果<where>标签内部有多个条件或者前面已经有条件(比如通过<if>标签添加的条件),并且你想在这些条件之间使用AND来连接,那么你就需要在第一个条件前显式地加上AND。这是因为<where>标签只负责智能地添加WHERE关键字,而不负责处理条件之间的逻辑连接符。

#{} 的惯例用法

在MyBatis中,#{}用于参数替换,并防止SQL注入。它告诉MyBatis将变量值安全地插入到SQL语句中。例如,#{skuId}会被替换为skuIdList集合中当前遍历到的skuId的值。这种方式比直接使用字符串拼接来构建SQL语句要安全得多,因为它可以自动处理参数值的转义,从而防止SQL注入攻击。

总结

  • <where>标签下的and是为了在添加多个条件时,确保SQL语句的逻辑正确性。
  • #{}用于参数替换,是MyBatis中防止SQL注入的推荐做法。
  • 注意,原SQL语句中的where asku.sku_id in (1,2,3)部分看起来是一个错误或遗留代码,因为它与<where><if>标签的逻辑冲突。在实际应用中,应该只使用其中一种方式来指定条件。


http://www.ppmy.cn/server/158676.html

相关文章

多模态人工智能在零售业的未来:通过GPT-4 Vision和MongoDB实现智能产品发现

多模态人工智能在零售业的未来&#xff1a;通过GPT-4 Vision和MongoDB实现智能产品发现 引言 想象一下&#xff0c;顾客在购物时只需上传一张他们所期望的服装或产品的照片&#xff0c;几分钟内便能收到来自他们最喜欢的商店的个性化推荐。这就是多模态人工智能在零售领域所带…

【20250113】基于肌肉形变测量的连续步态相位估计算法,可自适应步行速度和地形坡度...

【基本信息】 论文标题&#xff1a;Continuous Gait Phase Estimation by Muscle Deformations with Speed and Ramp Adaptability 发表期刊&#xff1a;IEEE Sensors Journal 发表时间&#xff1a;2024年5月30日 【访问链接】 论文链接&#xff1a;https://ieeexplore.ieee.or…

JAVA实现2048小游戏(附源码)

文章目录 一、设计来源2048小游戏讲解1.1 主界面1.2 4*4难度界面1.3 5*5难度界面1.4 6*6难度界面1.5 挑战失败提示界面 二、效果和源码2.1 动态效果2.2 源代码 源码下载更多优质源码分享 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/a…

【2024年华为OD机试】(A卷,100分)- 密室逃生游戏 (Java JS PythonC/C++)

一、问题描述 题目描述 小强正在参加《密室逃生》游戏&#xff0c;当前关卡要求找到符合给定密码K&#xff08;升序的不重复小写字母组成&#xff09;的箱子&#xff0c;并给出箱子编号&#xff0c;箱子编号为1~N。 每个箱子中都有一个字符串s&#xff0c;字符串由大写字母、…

【Git版本控制器--2】Git的分支管理

目录 理解分支 分支基本操作 合并冲突 合并模式 分支策略 强制删除分支 理解分支 master主分支 git中会保存每一次我们进行的提交&#xff0c;并把它们保存在对像区中&#xff01; 如图所示的那条线&#xff0c;我们称他为提交时间线&#xff0c;也称之为主线 版本库中…

前端开发:表格、列表、表单

1.表格标签 align 是表格相对于周围元素的对齐方式. align"center" (表格相对于网页剧中对齐) border 表示边框. 1px 表示有边框(数字越大, 边框越粗), "" 表示没边框. cellpadding: 内容距离边框的距离, 默认 1 像素 cellspacing: 单元格之间的距离. 默…

【Linux】Linux基础命令(二)

locate命令 locate命令可以用于快速查找文件的路径&#xff0c;比如我要查找所有.cpp文件的路径&#xff1a; sudo locate *.cppless 命令 less命令和more命令类似&#xff0c;都是查看文件内容&#xff0c;但less命令更强大 可以使用光标上下&#xff08;左右&#xff09;…

操作笔记:使用Everything工具实现大文件快速上传至虚拟机

问题描述&#xff1a; 在尝试通过Xhell上传大文件时&#xff0c;遇到了文件大小超出限制的异常。为了克服这个障碍并能高效地传输大文件到虚拟机中&#xff0c;可以采用以下解决方案。 解决方案概述&#xff1a; 利用Everything工具设置HTTP服务器功能&#xff0c;以此来实现…