当前位置: 首页 > article >正文

java_mybatis_mapper_sql语句示例

需求:

有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_id
        from activity_info activity
        inner join activity_sku asku on activity.id=asku.activity_id
        where 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_id
        from activity_info activity
        inner 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定义部分:

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语句,效果如下:

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.kler.cn/a/503311.html

相关文章:

  • G1原理—7.G1的GC日志分析解读
  • SQL Server 查看数据库表使用空间
  • 从CentOS到龙蜥:企业级Linux迁移实践记录(龙蜥开局)
  • 前端:前端开发任务分解
  • Windows图形界面(GUI)-QT-C/C++ - QT控件创建管理初始化
  • fisco bcosV3 Table智能合约开发
  • 如何提升买家秀图片的质量?
  • 在VSCode中设置bash命令行内容简写
  • select 绑定一个对象
  • 浅谈云计算12 | KVM虚拟化技术
  • 第1章 走进Qt Quick的世界
  • Jsoup实现实时爬取
  • 戴尔电脑开机出现MBR和GPT处理
  • 《盘古大模型——鸿蒙NEXT的智慧引擎》
  • ffmpeg 编译遇到的坑
  • 开源临床试验软件OpenClinica的安装
  • x86-64架构的Linux服务器上运行.NET 6.0应用程序,安装runtimes
  • UE5中制作地形材质
  • 按键精灵ios越狱脚本教程:多选框联动的ui界面
  • JavaScript系列(22)--模块化进阶
  • 16. C语言 字符串详解
  • 代码随想录算法训练营第 7 天(哈希表2)| 454.四数相加II 383. 赎金信 15. 三数之和 18. 四数之和
  • 如何知道深度学习模型中,每个模块的功能是什么
  • 腾讯云下架印度云服务器节点,印度云服务器租用何去何从
  • 【面试经典】单词规律
  • 【Vue】点击侧边导航栏,右侧main对应显示