Mybatis的常用的9种动态sql标签

简介: Mybatis的常用的9种动态sql标签

1:动态标签

MyBatis9种动态标签

MyBatis提供了9种动态SQL标签:if ,where,trim,choose, when ,otherwise, foreach,set,bind

其执行原理为,使用OGNL从SQL参数对象中计算表达式的值,根据表达式的值动态拼接SQL,以此来完成动态SQL的功能。

2: if

当参数满足条件才会执行某个条件

 <if test="id!=null and id!='' ">
     id=#{id}
 </if>
  <if test="id!=null and id!='' ">
     from A表
 </if>

3:where

解决 where and 形式的sql生成, <where>一般会加载动态条件中配合使用, 在有条件的情况下它会自动在所有条件的前面加上WHERE关键字, 还会去掉所有条件前面的AND/OR

<where>
    <if test="id!=null and id!='' ">
        and  id=#{id}
    </if>
    <if test="username!=null and username!='' ">
        and user_name=#{username}
    </if>
    <if test="beginDate!=null and beginDate!='' ">
        and create_date >=#{beginDate}
    </if>
    <if test="endDate!=null and endDate!='' ">
        and create_date <![CDATA[<=]]> #{endDate}
    </if>
    <if test="deptId!=null and deptId!='' ">
        and dept_id=#{deptId}
    </if>
</where>

4:trim

<trim> 它的功能比较灵活、广泛。 它可以用来实现<where>节点的功能

prefix在所有包含的SQL前面加上指定的字符串

prefixOverrides 在所有包含的SQL前面加上去除指定的字符串

suffix 在所有包含的SQL后面加上指定的字符串

prefixOverrides 在所有包含的SQL后面加上去除指定的字符串

<trim prefix="WHERE" prefixOverrides="and|or"  >
    <if test="id!=null and id>0 ">
        and  id=#{id}
    </if>
    <!--OGNL调用对象的方法-->
    <if test="username!=null and username.indexOf('徐')>-1 ">
        and user_name=#{username}
    </if>
    <if test="beginDate!=null">
        and create_date >=#{beginDate}
    </if>
    <if test="endDate!=null">
        and create_date <![CDATA[<=]]> #{endDate}
    </if>
    <!--OGNL: gt 是大于  调用静态方法 -->
    <if test="deptId!=null and deptId gt @cn.tulingxueyuan.pojo.Emp@getNum() ">
        and dept_id=#{deptId}
    </if>
</trim>

5:choose when otherwise

<choose when otherwise>

多条件取其中一个

    <select id="QueryEmp2" resultType="Emp">
        <include refid="SelectEmp">
            <property name="columns" value="id,dept_id"/>
        </include>
        <where>
            <choose>
                <when test="deptName=='经理'">
                    dept_id=1
                </when>
                <when test="deptName=='普通员工'">
                    dept_id=2
                </when>
                <otherwise>
                    dept_id=#{id}
                </otherwise>
            </choose>
        </where>
    </select>

6:foreach

<foreach> 循环

实现in 范围查询 使用$可以实现但是有sql注入风险

collection 需要循环的集合的参数名字

item 每次循环使用的接收变量

separator 分割符设置(每次循环在结尾添加什么分隔符,会自动去除最后一个结尾的分隔符)

open 循环开始添加的字符串

close 循环结束添加的字符串

index 循环的下标的变量

<!--
-->
select * from emp
<where>
    <foreach collection="usernames" item="username" separator="," open=" username in (" close=")" index="i" >
        #{username}
    </foreach>
</where>

7:set

<update id="update">
        update emp
        <!--<trim prefix="set" suffixOverrides=",">
            <if test="username!=null and username!='' ">
            user_name=#{username},
            </if>
            <if test="createDate!=null and createDate!='' ">
            create_date=#{createDate},
            </if>
            <if test="deptId!=null and deptId!='' ">
            dept_id=#{deptId}
            </if>
        </trim>-->
        <set>
            <if test="username!=null and username!='' ">
                user_name=#{username},
            </if>
            <if test="createDate!=null">
                create_date=#{createDate},
            </if>
            <if test="deptId!=null and deptId!='' ">
                dept_id=#{deptId},
            </if>
        </set>
        where  id=#{id}
    </update>

8:bind

-- 空格拼接
select * from emp where user_name like '%' #{username} '%'  
-- concat拼接
select * from emp where user_name like concat('%',#{username},'%')                                                                       
<!--
 <bind> 在Mapper映射文件上下文声明一个变量
    name 变量名称
    value 值(支持OGNL表达式)
-->
<select id="QueryEmp4" resultType="Emp">
    <bind name="_username" value="'%'+username+'%' "/>
    select * from emp where user_name like  #{_username}
</select>  

9:sql

<!--
sql片段  解决SQL中重复的代码冗余,可以提取出来放在sql片段中
    1.  <sql 定义sql片段
            id 唯一标识
    2.   <include 在SQL中引用SQL片段片段
            refid 需要引用的SQL片段的id
            <property 声明变量, 就可以在SQL片段中动态调用,让不同的SQL调用同一个SQL片段达到不同的功能
                name 变量名
                value 变量值
                一般情况使用${}在sql片段中引用.一单引用了,一定保证每个include都声明了该变量
-->
<sql id="selectEmp">
    select ${columns} from emp
</sql>
<select id="QueryEmp4" resultType="Emp">
    <bind name="_username" value="'%'+username+'%' "/>
    <include refid="selectEmp">
        <property name="columns" value="*"></property>
    </include>
    where user_name like  #{_username}
</select> 

10:OGNL表达式

e1 or e2
e1 and e2
e1 == e2,e1 eq e2
e1 != e2,e1 neq e2
e1 lt e2:小于
e1 lte e2:小于等于,其他gt(大于),gte(大于等于) 7 e1 in e2
e1 in e2
e1 not in e2
e1 + e2,e1 * e2,e1/e2,e1 - e2,e1%e2
!e,not e:非,求反
e.method(args)调用对象方法
e.property对象属性值
e1[ e2 ]按索引取值,List,数组和Map
@class@method(args)调用类的静态方法
@class@field调用类的静态字段值
目录
相关文章
|
2天前
|
SQL XML Java
mybatis实现动态sql
MyBatis的动态SQL功能为开发人员提供了强大的工具来应对复杂的查询需求。通过使用 `<if>`、`<choose>`、`<foreach>`等标签,可以根据不同的条件动态生成SQL语句,从而提高代码的灵活性和可维护性。本文详细介绍了动态SQL的基本用法和实际应用示例,希望对您在实际项目中使用MyBatis有所帮助。
23 11
|
1月前
|
SQL 缓存 Java
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
本文详细介绍了MyBatis的各种常见用法MyBatis多级缓存、逆向工程、分页插件 包括获取参数值和结果的各种情况、自定义映射resultMap、动态SQL
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
|
24天前
|
SQL Java 数据库连接
canal-starter 监听解析 storeValue 不一样,同样的sql 一个在mybatis执行 一个在数据库操作,导致解析不出正确对象
canal-starter 监听解析 storeValue 不一样,同样的sql 一个在mybatis执行 一个在数据库操作,导致解析不出正确对象
|
2月前
|
SQL Java 数据库连接
mybatis使用四:dao接口参数与mapper 接口中SQL的对应和对应方式的总结,MyBatis的parameterType传入参数类型
这篇文章是关于MyBatis中DAO接口参数与Mapper接口中SQL的对应关系,以及如何使用parameterType传入参数类型的详细总结。
51 10
|
3月前
|
SQL XML Java
mybatis复习03,动态SQL,if,choose,where,set,trim标签及foreach标签的用法
文章介绍了MyBatis中动态SQL的用法,包括if、choose、where、set和trim标签,以及foreach标签的详细使用。通过实际代码示例,展示了如何根据条件动态构建查询、更新和批量插入操作的SQL语句。
mybatis复习03,动态SQL,if,choose,where,set,trim标签及foreach标签的用法
|
3月前
|
SQL XML Java
mybatis复习04高级查询 一对多,多对一的映射处理,collection和association标签的使用
文章介绍了MyBatis中高级查询的一对多和多对一映射处理,包括创建数据库表、抽象对应的实体类、使用resultMap中的association和collection标签进行映射处理,以及如何实现级联查询和分步查询。此外,还补充了延迟加载的设置和用法。
mybatis复习04高级查询 一对多,多对一的映射处理,collection和association标签的使用
|
2月前
|
SQL XML Java
Mybatis的<where>,<if>等标签用法
这篇文章详细解释了Mybatis中<where>和<if>等标签的用法,展示了如何在SQL动态构建中有效地过滤条件和处理逻辑分支。
254 1
|
2月前
|
SQL Java 数据库连接
Mybatis入门(select标签)
这篇文章介绍了Mybatis中`select`标签的基本用法及其相关属性,并通过示例展示了如何配置和执行SQL查询语句。
52 0
Mybatis入门(select标签)
|
2月前
|
SQL Java 数据库连接
Mybatis的<insert>,<update>,<delete>标签用法
这篇文章详细讲解了Mybatis中<insert>, <update>, <delete>标签的使用方法,并提供了示例代码来展示如何执行数据库的增删改操作。
107 0
|
3月前
|
SQL XML Java
mybatis :sqlmapconfig.xml配置 ++++Mapper XML 文件(sql/insert/delete/update/select)(增删改查)用法
当然,这些仅是MyBatis功能的初步介绍。MyBatis还提供了高级特性,如动态SQL、类型处理器、插件等,可以进一步提供对数据库交互的强大支持和灵活性。希望上述内容对您理解MyBatis的基本操作有所帮助。在实际使用中,您可能还需要根据具体的业务要求调整和优化SQL语句和配置。
67 1