九、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分页插件

重要信息

相关推荐
明月_清风15 分钟前
开发者网络概念全扫盲:一篇搞定
后端·网络协议
甲维斯43 分钟前
500块的豆包,能帮我搞定这个么?!
人工智能
火山引擎开发者社区1 小时前
当 Agent 自己做 SRE:详解 ArkClaw 自动化可观测体系的工程实践
人工智能
Coffeeee3 小时前
两个例子,帮你快速理解什么是Token
人工智能·程序员·ai编程
饼干哥哥3 小时前
用AI全自动剪辑,日更 100条爆款视频——HyperFrames、Remotion、Git使用入门
人工智能·机器学习·ai编程
用户83244598541323 小时前
深入拆解 AlexNet:跟着一张猫咪照片,看数据如何流动
人工智能
饼干哥哥4 小时前
开源Skills|搭建亚马逊动态关键词库系统,每天抓SSS级机会词
人工智能·深度学习·数据分析
刘马想放假4 小时前
Modbus 全栈技术解析:TCP、RTU、ASCII、RTU over TCP
数据结构·网络协议
Weigang4 小时前
别等 Agent 上线后补评估:先用 DeepEval 写失败样本
人工智能
MomentYY4 小时前
AI 到底是“懂”,还是在“猜”?
前端·人工智能·ai编程