九、MyBatis动态SQL

@[toc]

九、动态SQL

9.1 if

总结:根据标签中test属性所对应的表达式决定标签中的内容是否需要拼接到SQL中。

sql 复制代码
User getUserByParamsWithIf(User user);
bash 复制代码
<select id="getUserByParamsWithIf" resultType="User">
        select * from litemall_user where 1=1
        <if test="username != '' and username != null">
            and username = #{username}
        </if>
        <if test="id != 0 and id != null">
            and id = #{id}
        </if>
    </select>

9.2 where

总结

  • 当where标签中有内容时,会自动生成where关键字,并且将内容前多余的and或or去掉。
  • 当where标签中没有内容时,此时where标签没有任何效果。
  • 注意:where标签不能将其中内容后面多余的and或or去掉。
sql 复制代码
User getUserByParamsWithWhere(User user);
bash 复制代码
<select id="getUserByParamsWithWhere" resultType="User">
        select * from litemall_user
        <where>
            <if test="username != '' and username != null">
                and username = #{username}
            </if>
            <if test="id != 0 and id != null">
                and id = #{id}
            </if>
        </where>
    </select>

9.3 trim

总结:trim用于去掉或添加标签中的内容

常用属性

  • prefix:在trim标签中的内容的前面添加某些内容

  • prefixOverrides:在trim标签中的内容的前面去掉某些内容

  • suffix:在trim标签中的内容的后面添加某些内容

  • suffixOverrides:在trim标签中的内容的后面去掉某些内容

sql 复制代码
User getUserByParamsWithTrim(User user);
bash 复制代码
<select id="getUserByParamsWithTrim" resultType="User">
        select * from litemall_user
        <trim prefix="where" suffixOverrides="and">
            <if test="username != '' and username != null">
                 username = #{username} and
            </if>
            <if test="gender != 0 and gender != null">
                 gender = #{gender} and
            </if>
            <if test="id != 0 and id != null">
                id = #{id} and
            </if>
        </trim>
    </select>

9.4 choose、when、otherwise

总结:相当于if..else if ..else ,其中when至少要有一个,otherwise最多只能有一个。

sql 复制代码
List<User> getUserByParamsWithChoose(User user);
bash 复制代码
<select id="getUserByParamsWithChoose" resultType="User">
        select * from litemall_user
        <where>
            <choose>
                <when test="username != '' and username != null">
                    username = #{username}
                </when>
                <when test="gender != 0 and gender != null">
                    gender = #{gender}
                </when>
                <when test="id != 0 and id != null">
                    id = #{id}
                </when>
            </choose>
        </where>
    </select>

9.5 foreach

总结:属性:

  • collection:设置要循环的数组或集合

  • item:表示集合或数组中的每一个数据

  • separator:设置循环体之间的分隔符

  • open:设置foreach标签中的内容的开始符

  • close:设置foreach标签中的内容的结束符

9.6 SQL片段

总结:sql片段,可以记录一段公共sql片段,在使用的地方通过include标签进行引入。

csharp 复制代码
User getUserByParamsWithSQLFragment();
bash 复制代码
<sql id="userColumns">
        id, username, password, mobile, gender, last_login_ip
</sql>
<select id="getUserByParamsWithSQLFragment" resultType="User">
        select <include refid="userColumns"></include> from litemall_user where id = 4
</select>

本人其他相关文章链接

1.一、MyBatis简介:MyBatis历史、MyBatis特性、和其它持久化层技术对比、Mybatis下载依赖包流程 2.二、搭建MyBatis采用xml方式,验证CRUD(增删改查操作) 3.三、MyBatis核心配置文件详解 4.四、MyBatis获取参数值的两种方式(重点) 5.五、MyBatis的增删改查模板(参数形式包括:String、对象、集合、数组、Map) 6.六、MyBatis特殊的SQL:模糊查询、动态设置表名、校验名称唯一性 7.七、MyBatis自定义映射resultMap 8.八、(了解即可)MyBatis懒加载(或者叫延迟加载) 9.九、MyBatis动态SQL 10.十、MyBatis的缓存 11.十一、MyBatis的逆向工程 12.十二、MyBatis分页插件

重要信息

相关推荐
砍树+c+v几秒前
3a 感知机训练过程示例(手算拆解,代码实现)
人工智能·算法·机器学习
zy_destiny2 分钟前
【工业场景】用YOLOv26实现4种输电线隐患检测
人工智能·深度学习·算法·yolo·机器学习·计算机视觉·输电线隐患识别
放氮气的蜗牛8 分钟前
从头开始学习AI:第五章 - 多分类与正则化技术
人工智能·学习·分类
Black蜡笔小新10 分钟前
终结“监控盲区”:EasyGBS视频质量诊断技术多场景应用设计
人工智能·音视频·视频质量诊断
聊聊科技10 分钟前
打破固化编曲思维,AI编曲软件为原创音乐人注入制作歌曲伴奏新创意
人工智能
智驱力人工智能12 分钟前
货车违规变道检测 高速公路安全治理的工程实践 货车变道检测 高速公路货车违规变道抓拍系统 城市快速路货车压实线识别方案
人工智能·opencv·算法·安全·yolo·目标检测·边缘计算
乾元12 分钟前
实战案例:解析某次真实的“AI vs. AI”攻防演练
运维·人工智能·安全·web安全·机器学习·架构
AiTop10017 分钟前
智谱开源GLM-OCR:0.9B小模型在复杂文档处理登顶SOTA
人工智能·ai·aigc
晓晓不觉早18 分钟前
OpenAI Codex App的推出:多代理工作流的新时代
人工智能·gpt
大数据在线22 分钟前
硬件涨价超级周期:智算中心价值逻辑迎来重构
人工智能·数据中心·智算中心·内存涨价·曙光存储