SSM框架之Mybatis动态sql配置

SSM框架之Mybatis框架的动态sql配置

Mybatis官方中文文档

http://www.mybatis.org/mybatis-3/zh/index.html

在实际的场景中,经常会遇到动态SQL的增、删、改、查问题,这里就必要说明何谓动态SQL,我们举一个实际的例子,比如,在一个web工程中,经常会有一个搜索框,并且在搜索之前通常会进行一个关键词的过滤,比如可以过滤的条件有:姓名、年龄等,这样的话当我们姓名和年龄都不选,则等价于下面的SQL语句

select * from students; – 不去限制姓名和年龄
1
当我们将年龄选择为>20时,相当于下面的SQL语句:

select * from students where age>20;
1
当我们同时选择条件姓名为:张三,年龄>20,则相当于下面的SQL语句:

select * from students where age>20 and name=’张三’;
1
当我们有很多的条件时,此时就需要我们去组合这些条件,并动态的生成一个可执行的SQL语句,这样就不是一个简单的SQL语句能够解决问题,那么我们该怎么办呢?在MyBatis中同样是支持这种动态SQL的写法,具体见下面的内容。

MyBatis动态SQL支持

动态SQL之查询

<?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.yztc.yx.pojo.Emp">

    <!-- resultMap标签将了工程entity实体类中的对象与数据库中的表对应起来
         resultMap中的id属性是一个唯一的名字
         子标签中的id属性用来指定主键
         result标签用来指定其他的键,其中property属性是指实体中的字段,对应的
         column属性表示的数据库中的响应的字段
     -->

    <!-- 动态查询SQL语句 -->
    <!-- 多条件查询 xml中对于特殊符号的处理,有两种思路: 1.使用<![CDATA[我的文本]]> 2.使用转义字符来替代特殊符号 或者between 
        and -->
    <select id="findEmpBySalNameJob" parameterType="com.yztc.yx.pojo.EmpCondition"
        resultType="com.yztc.yx.pojo.Emp">
        <!-- <![CDATA[select empno,ename,job,mgr,hiredate,sal,comm,deptno from 
            emp where ename like '%${kw}%' and job=#{job} and sal>=#{losal} and sal<=#{hisal}]]> -->
        select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp
        where
        ename like '%${kw}%' and job=#{job} and sal&lt;=#{hisal} and
        sal&gt;=#{losal}
    </select>
</mapper>

动态SQL之插入

<!-- 动态insert -->
    <!-- 定义两个sql片段,第一个对应字段名,id属性值任意并且唯一 -->
    <sql id="key">
        <!--后缀判断的条件 -->
        <trim suffixOverrides=",">
            <if test="ename!=null">
                ename,
            </if>
            <if test="job!=null">
                job,
            </if>
            <if test="mgr!=null">
                mgr,
            </if>
            <if test="hiredate!=null">
                hiredate,
            </if>
            <if test="sal!=null">
                sal,
            </if>
            <if test="comm!=null">
                comm,
            </if>
            <if test="deptno!=null">
                deptno,
            </if>
        </trim>
    </sql>
    <sql id="value">
        <trim suffixOverrides=",">
            <if test="ename!=null">
                #{ename},<!-- ognl表达式 -->
            </if>
            <if test="job!=null">
                #{job},
            </if>
            <if test="mgr!=null">
                #{mgr},
            </if>
            <if test="hiredate!=null">
                #{hiredate},
            </if>
            <if test="sal!=null">
                #{sal},
            </if>
            <if test="comm!=null">
                #{comm},
            </if>
            <if test="deptno!=null">
                #{deptno},
            </if>
        </trim>
    </sql><!-- 添加 -->
    <insert id="add" parameterType="com.yztc.yx.pojo.Emp">
        insert into emp(
        <include refid="key" />
        ) values (
        <include refid="value" />
        )
    </insert>

动态SQL之删除

<!-- 动态批量删除 -->
    <delete id="delete" parameterType="int[]">
        delete from emp where empno in
        <!-- foreach:用来循环 collection : 用来指定循环的数据的类型 可以填的值有:array,list,map item 
            : 循环中为每个循环的数据指定一个别名 index : 循环中循环的下标,于参数名一致 open : 开始 close : 结束 separator 
            : 数组中元素之间的分隔符 -->
        <foreach collection="array" item="arrs" open="(" separator=","
            close=")">#{arrs}</foreach>
    </delete>

动态SQL之更新

    <!-- 动态的修改 -->
    <update id="update" parameterType="com.yztc.yx.pojo.Emp">
        update emp
        <set><!--set会删除多余条件的逗号 -->
            <if test="ename">ename=#{ename},</if>
            <if test="job">job=#{job},</if>
            <if test="mgr">mgr=#{mgr},</if>
            <if test="hiredate">hiredate=#{hiredate},</if>
            <if test="sal">sal=#{sal},</if>
            <if test="comm">comm=#{comm},</if>
            <if test="deptno">deptno=#{deptno},</if>
        </set>
        where empno=#{empno}

        <!-- trim : 自定义标签 prefix : 标签名 prefixOverrides : 自动去除第一个条件的内容 suffix : 
            标签名 suffixOverrides : 自动去除最后一个条件的内容 -->
        <!-- <trim prefix="where" prefixOverrides="and | or" ></trim> <trim suffix="set" 
            suffixOverrides="," ></trim> -->
    </update>

动态SQL之条件不确定删选

<!-- 多条件查询,条件个数不确定:select <include refid="myempcolumn"/> from emp 通过动态sql语句 ,达到筛选条件的目的 -->
    <select id="findEmpChanges" parameterType="com.yztc.yx.pojo.EmpCondition"
        resultType="com.yztc.yx.pojo.Emp">
        select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp
        <where><!--可自动去除条件中的and -->
            <if test="kw!=null">and ename like '%${kw}%'</if>
            <if test="job!=null">and job=#{job}</if>
            <if test="losal!=null&amp;&amp;hisal!=null">and sal between #{losal} and #{hisal} </if>
        </where>

        <!-- 类似于java中的switch结构,每次执行的时候,选择其中的一种情况来执行 上面的where标签,条件成立的情况下,三个条件都会执行 -->
        <!-- <choose> <when test="kw!=null"> ename like '%${kw}%' </when> <when 
            test="job!=null"> and job=#{job} </when> <otherwise>....</otherwise> </choose> -->
    </select>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值