mybatis中的动态SQL

动态SQL是mybatis的强大特性之一,mybatis中的动态sql是通过if set where choose foreache等动态标签来实现的。

①if:根据参数条件判断是否显示某些sql;

例如:List<Teacher> selectMap(Map<String,Object> map);//参数传递的是Map时,#{key}取value
 <select id="selectMap" parameterType="java.util.Map" resultType="Teacher">
        select * from h_teacher
        <where>
        <if test="id!=null">
            id=#{id}
        </if>
        <if test="name!=null and name!=''">
            or name=#{name}
        </if>
        </where>
    </select>

②where:会自动处理where筛选中的sql条件,如果没有任何条件,则不会添加where,如果条件以and、or开头,会自动去除;

例如:List<Teacher> selectMap(Map<String,Object> map);//参数传递的是Map时,#{key}取value
<!--    传递map,指定parameterType为map
        <if test> test中填写boolean类型表达式,判断
-->
    <select id="selectMap" parameterType="java.util.Map" resultType="Teacher">
        select * from h_teacher
        <where>
        <if test="id!=null">
            id=#{id}
        </if>
        <if test="name!=null and name!=''">
            or name=#{name}
        </if>
        </where>
    </select>

③foreach:对集合进行遍历;

例如:int deleteByIds(Integer[] ids);//批量删除  传递数组/集合
 <delete id="deleteByIds">
        delete form h_teacher where id in
        <foreach collection="array" item="id" open="(" close=")" separator=",">
            #{id}
        </foreach>
    </delete>

④choose when otherwise:类似于java中的switch语句,choose=>switch,when=>case,otherwise=>default;

例如:List<Teacher> selectByIdOrName(@Param("id") Integer id, @Param("name") String name);//根据id或name查找数据 演示多个参数的取值方式,通过@Param取别名
<select id="selectByIdOrName" resultType="Teacher">
<!--select * from h_teacher where id=#{id} or name=#{name}-->
        select * from h_teacher
        <where>
<!--choose,when,otherwise 三个标签配合使用,只会匹配一个选项-->
            <choose>
                <when test="id!=null">
                    id=#{id}
                </when>
                <otherwise>
                    name=#{name}
                </otherwise>
            </choose>
        </where>
    </select>

⑤set:元素会动态地在行首插入SET关键字,并会删掉额外的逗号;

例如:int updateSelective(Teacher teacher);//选择性更新
    <update id="updateSelective" parameterType="Teacher">
        update h_teacher
        <!--set标签,会去除末尾的逗号-->
        <set>
            <if test="name!=null">
                name=#{name},
            </if>
            <if test="age!=null">
                age=#{age}
            </if>
        </set>
        where id=#{id}
    </update>

⑥trim:指定以特定字符开始和结束,并去除前后的特定字符;

例如:int insertSelective(Teacher teacher);//选择性插入数据
<insert id="insertSelective" parameterType="Teacher">
        <selectKey keyProperty="id" resultType="integer" order="BEFORE">
            select seq_t_teacher.nextval from dual
        </selectKey>
        insert into h_teacher
        <trim prefix="(" suffix=")" suffixOverrides=",">
            id,
            <if test="name!=null">name,</if>
            <if test="age!=null">age</if>
        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
            #{id},
            <if test="name!=null">#{name},</if>
            <if test="age!=null">#{age}</if>
        </trim>
    </insert>

⑦bind:元素允许你在OGNL表达式以外创建一个变量,并将其绑定到当前的上下文,常用模糊语句查询;

例如:List<Teacher> selectByName(@Param("name") String name);//根据名称进行模糊查询
<!--    bind标签:用来向上下文中存值,name为值的名称,value指定值的内容-->
    <select id="selectByName" resultType="Teacher">
        <bind name="nameLike" value="'%'+name+'%'"/>
        select * from h_teacher where name like #{nameLike}
    </select>

⑧sql:定义sql片段,include引入sql片段;

例如:Teacher selectById(Integer id);//根据主键查询
<!--    通常抽取出通用的sql片段-->
    <sql id="selectColumn">
        id,name,age
    </sql>
    <!-- id指定关联的方法名  resultType:关联返回的类型  parameterType:表示该sql语句中需要传入的参数, 类型要与对应的接口方法的类型一致
        指定参数类型,可省略
        resultType:定义出参,匹配普通Java类型或自定义的pojo【出参类型若不指定,将为语句类型默认类型,如语句返回值为int】
        -->
<!-- #{参数名}:获取接口方法传递的单个参数   -->
    <select id="selectById" parameterType="integer" resultType="Teacher">
        select <include refid="selectColumn"></include> from H_TEACHER where ID=#{id}
    </select>
原文地址:https://www.cnblogs.com/xie-qi/p/12901223.html