Mybatis动态SQL

142 阅读1分钟

动态SQL

if

where

trim

XML中可以使用① html特殊转义编码 ② CDATA方式  Alt+会车提示  <![CDATA[<]]>

1、实现动态条件SQL
    test 条件表达式 支持OGNL表达式
2、and动态拼接 出现报错 select * from emp where and username= ?
    ①改为 1=1 and ......
    ② 使用where标签 包含if标签  会自动在关键字 会去掉多余的and或or
    ③ 使用trim   <trim prefix="WHERE" prefixOverrides="and|or">
    功能灵活 广泛 可以用来实现where功能  prefix在包含的SQL前面加上设置的字符串
     prefixOverrides 在 所有包含的SQL前面加上去除的字符串
     suffix 在所有包含的字符串加上指定的字符串
<!--    <select id="selectEmp" resultType="com.kdy.pojo.Emp">-->
<!--        select *  from emp-->
<!--        where 1=1-->
<!--        <if test="id!=null and id !=''"> and id = #{id}</if>-->
<!--        <if test="username!=null and username !=''">and username= #{username}</if>-->
<!--        <if test="beginDate!=null and begindate !=''">and create_date >= #{beginDate}</if>-->
<!--        <if test="endDate!=null and endDate !=''">and create_date &lt;= #{endDate}</if>-->
<!--        <if test="dept_id!=null and dept_id !=''">and dept_id =#{dept_id}</if>-->
<!--    </select>-->


<!--    <select id="selectEmp" resultType="com.kdy.pojo.Emp">-->
<!--        select *  from emp-->
<!--        <where>-->
<!--            <if test="id!=null and id !=''">  id = #{id}</if>-->
<!--            <if test="username!=null and username !=''">and username= #{username}</if>-->
<!--            <if test="beginDate!=null and begindate !=''">and create_date >= #{beginDate}</if>-->
<!--            <if test="endDate!=null and endDate !=''">and create_date &lt;= #{endDate}</if>-->
<!--            <if test="dept_id!=null and dept_id !=''">and dept_id =#{dept_id}</if>-->
<!--        </where>-->
<!--    </select>-->

    <select id="selectEmp" resultType="com.kdy.pojo.Emp11">
        select *  from emp
        <trim prefix="WHERE" prefixOverrides="and|or">
            <if test="id!=null and id !=''">and id = #{id}</if>
            <if test="username!=null and username !=''">and username= #{username}</if>
            <if test="beginDate!=null and begindate !=''">and create_date >= #{beginDate}</if>
            <if test="endDate!=null and endDate !=''">and create_date &lt;= #{endDate}</if>
            <if test="dept_id!=null and dept_id !=''">and dept_id =#{dept_id}</if>
        </trim>
    </select>

froeach

<!--
foreach
    collection 需要循环的集合参数
    item 要循环的变量
    separator  要加的分割符
    open close 开始加的和结束加的字符串
    index 下标 从 0开始

    实现in  ${} 有SQL注入风险
select  *  from emp where username in ("张三","李四")
-->
    <select id="queryEmp3" resultType="com.kdy.pojo.Emp11">
        select  *  from emp
        <where>
        <foreach collection="usernames" item="username" separator="," open=" username in (" close=")" index="i">
            #{username}
        </foreach>

        </where>
    </select>
    

choose when otherwise 多条件取其中一个

<select id="queryEmp1" resultType="com.kdy.pojo.Emp11">
    select * from emp
        <where>
            <choose>
                <when test="deptName=='经理'">dept_id=1</when>
                <when test="deptName=='员工'">dept_id=2</when>
                <otherwise>dept_id=#{id}</otherwise>
            </choose>
        </where>

</select>

set

<!--
set 一般用在update上面
    会自动加上set 关键字 会自动去除最后的,
    使用trim   <trim prefix="set" suffixOverrides=",">
-->
    <update id="updateEmp">
        update emp
        <set>
        <if test="username!=null and username!=''">
        username = #{username},</if>
        <if test="create_date!=null and create_date!=''">create_date=#{create_date},</if>
        <if test="dept_id!=null and dept_id!=''">{dept_id}</if>
        </set>
        where id=#{id}
    </update>

bind 和 sql 代码片段

<!--
        select *  from emp where username like '%' #{username} '%'   空格MySQL中代表链接字符串的意思
        ①空格 或 CONCAT函数
        ②可以拼接好再传进来也可以
        ③ 使用bind在Mapper映射文件上下文声明一个变量 name 变量名  value 支持OGNL表达式


 公共的SQL语句使用sql代码片段声明  <include refid="">进行调用   解决代码冗余

第一步 sql  id  进行声明
第二部  <include refid=""> 进行调用

如果sql中 使用了 #{var1}  必须在include中加入 <property name="var1" value="*"/> 进行替换变量

  -->
    <select id="queryEmp4" resultType="com.kdy.pojo.Emp11">
        <bind name="_username" value="'%'+username+'%'"></bind>
        <include refid="selectEmpSQL">
            <property name="columns" value="*"/>
        </include>
        where username like #{_username}
    </select>

    <sql id="selectEmpSQL">
        select ${columns}  from emp
    </sql>

MyBatis 常用 OGNL表达式

or and == eq != neq lt lte gt gte

in

not in

+ - * / %

! not

e.method(args) 调用对象方法

e.property 对象属性值

e1[e2] 按索引取值 List 数组 和 map

@class@method(args) 调用类的静态方法

@class@field 调用的静态字段值