MyBatis动态SQL

MyBatis的动态SQL MyBatis的映射文件中支持在基础SQL上添加一些逻辑操作,并动态拼接成完整的SQL之后再执行,以达到SQL复用、简化编程的效果。Mybatis 动态 sql 可以让我们在 Xml 映射文件内,以标签的形式编写动态 sql,完成逻辑判断和动态拼接 sql 的功能。 阅读详情

1、动态SQL简介

●动态SQL是MyBatis强大的特性之一,极大的简化我们SQL拼装的操作

●动态SQL元素和使用JSTL或其它类似基于XML的标签类似

●MyBatis采用功能强大的基于OGNL的表达式来简化操作

●OGNL对象图导航语言,这是一种强大的表达式语言,通过它可以非常方便的操作对象属性。类似于我们的EL表达式。
   ○访问对象属性 ${对象名.属性名}
   ○调用方法 ${对象名.方法名}
   ○运算符:算术运算符、逻辑运算符(and or not )、比较运算符

●动态SQL就是通过一系列的标签来完成判断,进行SQL语句的组装

2、where和if标签

需求:根据用户名、id、state等多个条件查询用户信息

<?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接口的路径-->
<mapper namespace="com.bdit.dao.IUserMapper">

    <!--模糊查询like  #后面的名字任意-->
    <select id="find" resultType="User" parameterType="String">
        select * from user where id=#{id} or name like #{name}
    </select>
    
</mapper>
@Test
    public void find() {
        IUserMapper userMapper = sqlSession.getMapper(IUserMapper.class);
        User user = new User();
        user.setId(9);
        user.setUsername("%an%");
        List<User> list = userMapper.findUser(user);
        for (User user1:list) {
            System.out.println(user1);
        }
    }

加入以上查询条件,我们不传递id,而且条件由or换成and,就会查不到任何数据。实际情况下的组合查询,都会进行非空判断,然后进行查询条件的组装。在MyBatis框架中,提供类where标签和if标签来实现动态SQL语句。

●where标签:处理SQL语句,自动添加where关键字,并去掉紧跟在它后面的一个and或者or
●if标签:test属性,判断表达式真假

<select id="find" resultType="user">
        select * from user
    <where>
        <if test="id!=null">
            or id=#{id}
        </if>
        <if test="name!='' and name!=null">
            or name like #{name}
        </if>
    </where>
  </select>

3、SQL标签

将SQL语句通用的部分进行抽取,其它SQL语句通过标签引入也可以使用。

<select id="find" resultType="user">
        select <include refid="user_common"/> from user
    <where>
        <if test="id!=null">
            or id=#{id}
        </if>
        <if test="name!='' and name!=null">
            or name like #{name}
        </if>
    </where>
  </select>

<!--封装sql里面的数据名,便于查询-->
    <sql id="user_common">
        id,name,keyword,description
    </sql>

4、foreach标签传入集合

删除多条数据的SQL语句,delete from user where id in(1,2,4,5,6)

foreach标签遍历集合拼接SQL语
   ●collection 属性:遍历传入的集合,当参数是集合时,collection属性值固定为list
   ●open属性:遍历拼接前
   ●close属性:遍历拼接后
   ●separator属性:拼接的符号
   ●item属性:遍历到的元素

<select id="findList" resultType="user" parameterType="list">
        select <include refid="user_common"></include> from user
        <foreach collection="list" open="where id in(" close=")" separator="," item="item">
            #{item}
        </foreach>
</select>
@Test
    public void findList(){
        IUserMapper iUserMapper=sqlSession.getMapper(IUserMapper.class);
        List<Integer> list=new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        List<User> list2=iUserMapper.findList(list);
        for(User l:list2){
            System.out.println(l);
        }
    }

5、foreach标签传入数组

foreach标签遍历集合拼接SQL语句
   ●collection 属性:遍历传入的数组,当参数是数组时,collection属性值固定为array
   ●open属性:遍历拼接前
   ●close属性:遍历拼接后
   ●separator属性:拼接的符号
   ●item属性:遍历到的元素

<select id="findArray" resultType="user" parameterType="int[]">
        select <include refid="user_common"></include> from user
        <foreach collection="array" open="where id in(" close=")" separator="," item="item">
            #{item}
        </foreach>
</select>
@Test
    public void findArray(){
        IUserMapper iUserMapper=sqlSession.getMapper(IUserMapper.class);
        int[] id={1,2,3};
        List<User> list=iUserMapper.findArray(id);
        for(User l:list){
            System.out.println(l);
        }
    }

6、foreach标签传入POJO对象

foreach标签遍历集合拼接SQL语句
   ●collection 属性:遍历传入的pojo对象中的集合,collection属性值为pojo中的集合属性名
   ●open属性:遍历拼接前
   ●close属性:遍历拼接后
   ●separator属性:拼接的符号
   ●item属性:遍历到的元素

<select id="findQuary" resultType="user" parameterType="quary">
        select <include refid="user_common"></include> from user
        <foreach collection="list" open="where id in(" close=")" separator="," item="item">
            #{item}
        </foreach>
</select>
//批量查询->POJO全局变量是集合
    @Test
    public void findQuary(){
        IUserMapper iUserMapper=sqlSession.getMapper(IUserMapper.class);
        Quary quary=new Quary();
        List<Integer> list=new ArrayList<>();
        list.add(1);
        list.add(25);
        list.add(20);
        quary.setList(list);
        List<User> list2=iUserMapper.findQuary(quary);
        for(User l:list2){
            System.out.println(l);
        }
    }
MyBatis 中动态 SQL 标签 在 MyBatis 中,动态 SQL 是构建灵活且高效的 SQL 语句的重要工具。通过使用动态 SQL 标签,开发者可以根据不同的条件动态生成 SQL 语句的各个部分,从而避免手动拼接字符串带来的复杂性和潜在的错误。 阅读详情

相关推荐

MyBatis 动态 SQL

MyBatis动态SQL是在XML映射文件中通过特定标签实现SQL语句动态拼接的技术,解决了传统JDBC手动拼接SQL的繁琐问题。文章介绍了MyBatis的9种动态SQL标签:if(条件判断)、where+if(查询条件处理)、set(更新操作)、choose/when/otherwise(多条件分支)、trim(格式化处理)等,并详细说明了各标签的语法和使用场景。动态SQL通过OGNL表达式实现参数值计算和SQL拼接,既提高了开发效率,又需注意性能优化和SQL注入防范。文中提供了多个典型示例,如条件查询、

阿超的博客 1132

MyBatis 动态SQL

MyBatis 动态SQL 1.if <select id="findActiveBlogWithTitleLike" resultType="Blog"> SELECT * FROM BLOG WHERE state = ‘ACTIVE’ <if test="title != null"> AND title like #{title} ...

baov_v_v的博客 190

告别命令行!用这个开源的Web版Kettle工具,5分钟搞定数据集成任务编排

本文介绍了一款开源的Web版Kettle工具,通过直观的拖拽界面大幅提升数据集成效率,告别复杂的命令行操作。该工具基于Kettle核心引擎,支持跨平台协作、轻量化访问和降低学习曲线,特别适合业务分析师快速上手。实测显示,使用该工具后任务配置错误率下降62%,协作效率提升40%。

weixin_30267785的博客 434

【MyBatis】动态SQL

在前一篇中,我们已经讲解了Mybatis的基本使用,那么本篇我们就进一步来了解Mybatis的功能。本篇我们主要讲的是Mybatis中的动态SQL,在前面我们的学习中,我们编写的SQL语句基本都是固定的,每个参数都需要传递,而通过动态SQL,它能根据我们所给的参数,动态地选择参数,不需要每个都传递。

zhyhgx的博客 2203

别再手动抄表了!用MCGS触摸屏自动存数据到U盘,5分钟搞定报表导出

本文详细介绍了如何利用MCGS触摸屏实现工业数据自动记录与U盘导出,彻底告别传统手动抄表方式。通过昆仑通态MCGS系统,可构建零误差自动化报表系统,实现实时数据采集、双重备份及标准CSV格式导出,大幅提升数据准确性和工作效率。

weixin_30872157的博客 792

从零开始:HLW8110电能计量IC的硬件设计与软件调试全攻略

本文详细介绍了HLW8110电能计量IC的硬件设计与软件调试全流程,涵盖核心特性、抗干扰设计、UART通信协议及校准方法。通过实战案例和优化技巧,帮助工程师快速掌握高精度交流测量技术,适用于智能插座、充电桩等应用场景。

p5l2m9n4o6q的博客 576

mybatis强大的动态SQL

我们可以将一些重复性的 SQL 语句进行抽取,以达到复用的效果。:抽取 SQL 语句标签。:引入 SQL 片段标签。抽取的 SQL 语句三、多条件组合查询之<where-if>我们根据实体类的不同取值,使用不同的 SQL语句来进行查询。比如在 id如果不为空时可以根据id查询,如果username 不同空时还要加入用户名作为条件。这种情况在我们的多条件组合查询中经常会碰到。:条件标签。如果有动态条件,则使用该标签代替 where 关键字。:条件判断标签。查询条件拼接。

2501_90401192的博客 1636

RK3588 Ubuntu 20.04 编译 eglinfo 踩坑实录:从 Python 环境配置到 Mali 驱动调试

本文详细解析了在RK3588平台上使用Ubuntu 20.04编译eglinfo的全过程,包括Python环境配置、waf构建系统升级、Mali驱动调试等关键步骤。通过系统级软链接方案、驱动状态诊断和EGL环境验证技巧,帮助开发者快速解决常见问题,构建可靠的图形调试环境。

weixin_29158047的博客 373

Mybatis-动态SQL

在页面原型中,列表上方的条件是动态的,是可以不传递的,也可以只传递其中的1个或者2个或者全部。而在我们刚才编写的SQL语句中,我们会看到,我们将三个条件直接写死了。如果页面只传递了参数姓名name 字段,其他两个字段 性别 和 入职时间没有传递,那么这两个参数的值就是null。此时,执行的SQL语句为:这个查询结果是不正确的。正确的做法应该是:传递了参数,再组装这个查询条件;如果没有传递参数,就不应该组装这个查询条件。

actavy的博客 3027

腾讯云TDSQL MySQL版 - 开发指南兼容性

语言结构 分布式实例支持所有 MySQL 使用的文字格式,包括: String Literals Numeric Literals Date and Time Literals Hexadecimal Literals Bit-Value Literals Boolean Literals NULL Values String Literals String Literals 是一个 bytes 或者 characters 的序列,两端被单引号'或者双引号"包围,TDSQL MySQL版

weixin_43872058的博客 909

解决西门子Step 7 basic 找不到许可证问题

你在使用博图软件是否遇到过Step 7 basic 找不到许可证的问题呢!不言怕,今天我就来告诉你该如何处理吧!看步骤: 1.删除原授权的License: 打开Automation License Manager应用,然后我们可以发现仅有的License Key前面有一个时钟,说明它已经过期不可用,我们就要去寻求新的Key. 打开“我的电脑”,选择C盘,点击上方查看 点击选项–>查看 然...

让技术没有门槛 14万+

Mybatis之动态SQL

MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句的痛苦。例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。 利用动态 SQL 这一特性可以彻底摆脱这种痛苦。 虽然在以前使用动态 SQL 并非一件易事,但正是 MyBatis 提供了可以被用在任意 SQL 映射语句中的强大的动态 SQ...

JustinNeil的博客 1万+

SAP接口错误查询日志

随着数字经济的迅速发展,企业数字化转型不在只追求“业财一体化”,而是在业务端也想要进行更为精细化的管理,所以很多企业在SAP ERP的基础上,集成更多垂直领域更精细的外围系统,比如销售CRM系统,采购SRM系统,生产MES系统等等,琳琅满目的产品,那对SAP实施来说,系统集成过程中,接口的一些报错查询能力必不可少,今天我们就介绍一下,SAP和CRM系统集成中接口常见的报错。

weixin_43657667的博客 2047

MyBatis 动态SQL详解

注意,``失败后, `` 关键字只会去掉库表字段赋值前面的and,不会去掉语句后面的and关键字,即注意,`` 只会去掉`` 语句中的最开始的and关键字。在实际开发中会遇到许多相同的SQL,比如根据某个条件筛选,这个筛选很多地方都能用到,我们可以将其抽取出来成为一个公用的部分,这样修改也方便,一旦出现了错误,只需要改这一处便能处处生效了,此时就用到了这个标签了。这个标签和是天仙配,是共生的,include用于引用sql标签定义的常量。

Coisini__S的博客 1268

AI 学术科研与论文写作的正确打开方式!不套提示词模板,靠这个思路完美实现人机共创

真正的“人机共创”,也就是AI引导我思考的过程,如果你想用你的模糊需求,去写出专业化的学术内容,那是不可能的。对想快速完成某些学术任务的同仁来说,我们完全不用去抠提示词的细节,直接用魔法打败魔法,设计一段优化提示词的结构化提示词(提示词架构),辅助优化你的模糊需求。创建好之后,可以对它提你的任何模糊学术需求,比如写论文、写综述、学术润色等等,它绝不会直接帮你生成,而是先搞懂你的真实意图。以上整个流程,完全没有一句废话,先是思考,再是向你提问弄懂你的意图,最后整合你给出的关键信息,直接优化你给的模糊需求。

智能AI让学术科研更容易 477

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Mybatis动态SQL

Mybatis 动态Sql

心流时间的博客 1247

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

MyBatis 实现动态 SQL

MyBatis 中的动态 SQL 就是SQL语句可以根据不同的情况情况来拼接不同的sql。 本文会介绍 xml 和 注解 两种方式的动态SQL实现方式。

2302_76339343的博客 2375

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Mybatis的动态SQL

Test public void insertMoreByList(){ User user1 = new User("a1","男","北京");

m0_73971785的博客 1274

MyBatis 之 动态 SQL

动态 SQL

lfm1010123的博客 2133

MyBatis——动态SQL

动态SQL是MyBatis中的一种功能,允许你在XML映射文件中编写动态生成的SQL语句。主要用于解决SQL语句需要根据不同情况进行变化的问题。例如,你可能需要根据用户输入的查询条件生成不同的where子句,或者可能需要根据程序运行时的状态切换不同的join子句等。MyBatis提供了一套丰富的标签库来帮助你编写动态SQL,包括等。

zxb的博客 1918

【MyBatis】如何编写动态SQL

如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。在循环的时候拼接多个sql条件,用trim标签的prefixOverrides属性覆盖第一个and或者or,前缀加上"and (“,后缀加上” )",动态生成一个条件满足多种情况的sql。使用动态 SQL 并非一件易事,但借助可用于任何 SQL 映射语句中的强大的动态 SQL 语言,MyBatis 显著地提升了这一特性的易用性。

小七的博客 1169

【MyBatis】动态 SQL

这些标签可以根据传入的参数动态地添加、删除或修改 SQL 语句的某些部分。语句,用来根据不同条件选择执行不同的 SQL 语句,包含。标签根据传入的条件判断是否包含该 SQL 片段。用于在 SQL 语句中循环处理集合或数组,常用于。文件中使用特定的标签来完成的。子句中的值,并且自动加上括号和逗号分隔符。,则将相应的条件添加到 SQL 查询中。是指在程序执行过程中,根据实际的情况。标签用于自动处理 SQL 语句中的。部分,避免了多余的逗号和条件。部分,它会自动去除多余的。,之后的条件会自动处理为。

weixin_63466958的博客 1363
上一篇: MyBatis配置详解和增删改查
下一篇: MyBatis多表关联查询
忘记自我介绍
博客等级 码龄6年 16粉丝 78原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值