Mybatis 动态sql

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

Worker类

public class Worker {

    private int id;
    private String name;
    private int age;
    private String sex;
    private Date birthday;
    private String address;

workerDao

public interface WorkerDao {

    //List<Worker> getWorkersByAge() throws Exception;
    //List<Worker> getWorkersByAge(Map<String,Object> map) throws Exception;

    List<Worker> getWorkersByAge(WorkerCondition workerCondition) throws Exception;

    /**
     * 根据姓名和年龄查询工人,如果没有传递参数则查询所有
     * @param workerCondition
     * @return
     * @throws Exception
     */
    List<Worker> getWorkersByNameAndAge(WorkerCondition workerCondition) throws Exception;

    /**
     * 根据姓名进行模糊查询
     * @param workerCondition
     * @return
     * @throws Exception
     */
    List<Worker> getWorkersLikeName(WorkerCondition workerCondition) throws Exception;


    List<Worker> selectWorkersByIds(WorkerCondition workerCondition) throws Exception;

    List<Worker> selectWorkersByMap(WorkerCondition workerCondition) throws Exception;

    List<Worker> selectWorkersByWhen(WorkerCondition workerCondition) throws Exception;

    List<Worker> getWorkersByTrim(WorkerCondition workerCondition) throws Exception;

}

workerDao.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.hsj.dao.WorkerDao">

    <!-- 
    1.定义sql片段
     注意:定义sql片段时一定不要在里面写where标签,因为当前定义的sql片段可能会在其它的where标签中进行引用,会
     造成多个where关键字从而出现错误

     -->
    <sql id="sqlwhere">
            <if test="name!=null and name.length()>0">
                and name=#{name} 
            </if>

            <if test="age!=null and age!=0">
                and age=#{age}
            </if>
    </sql>
    <!-- 
    parameterType="map" 
     -->
    <select id="getWorkersByAge" parameterType="workerCondition"  resultType="worker">
        <!-- html实体集的使用:
        &lt;等价于<
        &gt;

        select * from t_worker where  age&gt;=18 and age&lt;=20
        select * from t_worker where  age&gt;=#{min} and age&lt;=#{max}
         -->
        select * from t_worker where  age&gt;=#{min} and age&lt;=#{max}
    </select>

    <sql id="NameAndAge">
        name,age
    </sql>
    <select id="getWorkersByNameAndAge" parameterType="workerCondition" resultType="worker">
        <!-- select * from t_worker where 1=1
        <if test="name!=null and name.length()>0">
            and name=#{name} 
        </if>

        <if test="age!=null and age!=0">
            and age=#{age}
        </if> -->


        <!-- select * from t_worker -->
        select 
            <include refid="NameAndAge"/>
         from t_worker
        <!-- 
        where标签的作用:
            A:当where子标签中有任何一个条件成立则会自动在select 字段列表 from  表名 后加追加where关键字
            B:可以自动删除第一个成立的条件前面的谓词(逻辑运算符)
         -->
        <!-- <where>
            <if test="name!=null and name.length()>0">
                and name=#{name} 
            </if>

            <if test="age!=null and age!=0">
                and age=#{age}
            </if>
        </where> -->

        <where>
            <!-- 2.引用已经定义的sql片段 -->
            <include refid="sqlwhere"/>

        </where>


    </select>


    <select id="getWorkersLikeName" parameterType="workerCondition" resultType="Worker">
        select * from t_worker
        <where>
            <if test="name!=null">
                and name like '%' #{name} '%'
            </if>
        </where>

    </select>

    <select id="selectWorkersByIds" parameterType="workerCondition" resultType="Worker">
        select * from t_worker 
        <where>
            <if test="ids!=null and ids.length>0">
                <!-- 
                collection="ids":指定 workerCondition对象中的集合或者数组属性
                item="id":将集合中的每一个元素取出来分别赋值给id变量 
                open="id in (":组拼字符串的开始部分的内容
                close=")":组拼字符串的结束部分的内容
                separator=",":指定每次变量元素后的分隔符

                id in (1,2,3,4,5)

                 -->
                <!-- <foreach collection="ids" item="id" open="id in (" close=")" separator=",">
                    #{id}
                </foreach> -->

                <!-- 
                    方式一:
                     and id=1 or id=2 or id=3 or id=4 
                 -->
                <!--  
                    方式二:
                     and id=1 or id=2 or id=3 or id=4 
                <foreach collection="ids" item="id" open="id=" close="" separator="or id=">
                    #{id}
                 </foreach> -->

                 <!-- 
                   方式三:
                  and id=1 or id=2 or id=3 or id=4 
                  -->
                 <foreach collection="ids" item="id" open="" close="" separator="or">
                    id=#{id}
                 </foreach>
             </if>
        </where>

    </select>

    <select id="selectWorkersByMap" parameterType="workerCondition" resultType="Worker">
        select * from t_worker 
        <where>
            <if test="map!=null">
                <if test="map.condition!=null">
                    and name like '%' #{map.condition} '%'
                </if>

                <if test="map.age!=null">
                    and age = #{map.age}
                </if>

            </if>
        </where>
    </select>

    <select id="selectWorkersByWhen" parameterType="workerCondition" resultType="Worker">
        select * from t_worker
        <where>
            <choose>
                <!-- 在choose ...when 表达式中, 如果第一个when的条件成立则不会再执行第二个when条件的判断了和执行了 -->
                <when test="name!=null">
                    and name like '%'  #{name} '%'
                </when>

                <when test="age!=0">
                    and age=#{age}
                </when>

                <!-- 
                当所有的when的测试都为false时才会执行otherwise中的内容
                otherwise必须放在所有的when的后面并且只能有一个otherwise
                 -->
                <otherwise>
                    and 1=1
                </otherwise>
            </choose>
        </where>
    </select>


    <select id="getWorkersByTrim" parameterType="workerCondition" resultType="Worker">
        select * from t_worker

        <!-- 

        select * from t_worker where name=? or age=?  

        prefix="where":自定义条件的前缀
        prefixOverrides="or":去掉前缀后面和当前属性值第一个相同的内容
        suffix="qq":指定后缀的内容
        suffixOverrides="or":去掉后缀前面和当前属性值相同的最后一个内容
         -->
        <trim prefix="where" prefixOverrides="or"  suffixOverrides="or">
            or name=#{name}
            or
            age=#{age}
            or 
        </trim>
    </select>

</mapper>
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 Example Criteria like 模糊查询

用Mybatis代码生成工具会产生很多个XXXExample类,这些类的作用是什么? 查阅了很多资料,在这里总结归纳一下 简介 XXXExample类用于构造复杂的筛选条件 它包含一个名为Criteria的内部静态类,它包含将在where子句中一起结合的条件列表。 Criteria类的集合允许您生成几乎无限类型的where子句。 可以使用createCriteria方法或or方法创建Criteri...

我在阴山下 3万+

立创EDA开源足轮机器人:基于STM32F407与ESP32的LQR自平衡与FOC驱动设计全解析

本文详细解析了基于立创EDA平台的开源足轮机器人项目。该项目采用STM32F407作为主控,ESP32负责无线通信,并应用LQR自平衡算法与FOC驱动技术,实现了机器人的稳定站立、移动转向及复杂地形适应能力。文章深入剖析了其硬件架构、软件设计及调试经验,为机器人运动控制学习提供了宝贵参考。

weixin_42608299的博客 232

【MyBatis】动态SQL

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

zhyhgx的博客 2203

VTK 9.2.0 在 Windows 10 上编译全记录:从 CMake 配置到 VS2019 项目生成(附 Qt 环境变量避坑点)

本文详细记录了VTK 9.2.0在Windows 10上的编译全过程,从CMake配置到VS2019项目生成,特别强调了Qt环境变量的避坑点。通过实战步骤和调试技巧,帮助开发者顺利完成VTK编译,适用于三维可视化开发。

weixin_30082367的博客 363

[Multisim][模电实验]简易函数信号发生器的设计与实现_北京邮电大学2019级信通院电子电路实验下

本文记述了笔者设计并实现以±12V供电电压输出1KHZ~10KHZ频率连续可调的方波、三角波和正弦波的过程。其中,方波输出电压峰峰值为12V(误差<20%),占空比可调、三角波输出电压峰峰值为8V(±20%),正弦波输出电压峰峰值≥1V。

lgc0208的博客 4万+

mybatis强大的动态SQL

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

2501_90401192的博客 1636

Android开发必备:TBS腾讯浏览服务静态集成完整指南(附Demo下载)

本文详细解析了Android开发中TBS腾讯浏览服务的静态集成方案,通过对比动态集成,深入剖析了其核心原理与适用场景。文章提供了从环境准备、资源获取、项目配置到代码初始化的完整指南,并重点介绍了WebView与文件预览等高级特性的实战应用。针对集成过程中的常见问题,提供了详尽的排查清单与性能调优建议,旨在帮助开发者构建极致稳定、不依赖网络的WebView与文件预览功能。文末附有经过验证的Demo项目可供下载参考。

earth的博客 366

Mybatis-动态SQL

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

actavy的博客 3027

Unity3D用c#脚本调用前端javascript函数:H5获取unity - webgl 加载并初始化完成的消息

unity3d发布的Webgl 可以作为静态文件加载到H5页面中,并通过javascript 调用unity内置的C#脚本函数,详见Webgl调用unity api。而往往我们需要知道Webgl ready的消息,本文将给出unity 内部调用javascript函数的方案加以解决。

Bravo 2475

Eclipse邂逅Deepseek:本地化部署全攻略

通过前面一系列的步骤,我们成功地在 Eclipse 中完成了 Deepseek 的本地化部署,并且对部署后的功能进行了测试和优化,还解决了可能遇到的一些常见问题。这一过程不仅让我们体验到了将强大的大语言模型与高效的开发环境相结合的魅力,也为我们在软件开发过程中带来了诸多便利。本地化部署 Deepseek 到 Eclipse,使得我们在代码编写过程中能够获得智能的代码补全和精准的问答支持,大大提高了开发效率。同时,本地化部署保障了数据的安全性和隐私性,避免了数据在传输过程中可能面临的风险。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 4509

Mybatis之动态SQL

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

JustinNeil的博客 1万+

装配完整性检查系统:基于YOLOv10的螺丝/零件缺失自动检测(含UI界面与完整代码)

建议自行采集装配场景数据,标注缺失螺丝、错误零件等,模拟真实缺陷。手机/工业相机采集图像;使用LabelImg进行目标标注;转换为 YOLO 格式。本文构建了一个完整的装配完整性检测系统,基于 YOLOv10 实现高精度螺丝缺失检测,并使用 PyQt5 构建了图形界面,实现一键导入与可视化检测流程,适用于工业质检自动化部署。项目可灵活扩展至零件缺失、错装、错位、顺序错误等检测场景,是深度学习在制造业中落地的典型应用案例之一。

YOLO 701

MyBatis 动态SQL详解

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

Coisini__S的博客 1268

零基础入门simulink1000例--第112例:在 Simulink 中构建一个基本的相控阵雷达波束形成系统仿真模型

摘要:本文详细介绍了使用Simulink实现相控阵雷达波束形成技术的完整流程。从创建Simulink模型、设计天线阵列、信号生成,到波束形成算法实现和结果可视化,涵盖了关键步骤。文章重点讲解了均匀线性阵列的设计、线性调频信号生成、相位偏移计算等核心技术,并提供了MATLAB代码示例。通过Scope或ArrayPlot模块进行结果分析,最终可导出为嵌入式代码部署。该系统展现了电子扫描波束的技术优势,为雷达系统设计提供了有效的仿真方法。

amy_mhd的博客 209

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

MyBatis 实现动态 SQL

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

2302_76339343的博客 2375

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Mybatis动态SQL

Mybatis 动态Sql

心流时间的博客 1247

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【MyBatis】动态 SQL

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

weixin_63466958的博客 1363

MyBatis 之 动态 SQL

动态 SQL

lfm1010123的博客 2133

Mybatis的动态SQL

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

m0_73971785的博客 1274

【MyBatis】如何编写动态SQL

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

小七的博客 1169

MyBatis——动态SQL

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

zxb的博客 1918
上一篇: MyBatis one to one 二次查询
下一篇: MyBatis 二级缓存
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值