博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

mybatis动态SQL 的使用----v.0.0.2

Posted on 2021-03-31 23:32  海绵谷  阅读(51)  评论(0编辑  收藏  举报

引申

  1. 什么是动态sql?动态SQL指的是事先无法预知具体的条件,需要在运行时根据具体的情况动态地生成SQL语句。假设我们有一个获取用户信息查询操作,具体的查询条件是不确定的,取决于Web前端表单提交的数据,可能根据用户的Id进行查询,也可能根据用户手机号或姓名进行查询,还有可能是这几个条件的组合。这个时候就需要使用MyBatis的动态SQL特性了。

  2. MyBatis两种常用的参数占位符#{}${}的区别?

使用`#{}`参数占位符时,占位符内容会被替换成“?”,然后通过PreparedStatement对象的setXXX()方法为参数占位符设置值;而${}参数占位符内容会被直接替换为参数值。
使用`#{}`参数占位符能够有效避免SQL注入问题,所以我们可以优先考虑使用#{}占位符,当 #{} 参数占位符无法满足需求时,才考虑使用`${}`参数占位符

mybatis 有哪些用于动态sql的标签

  1. where:该标签用于保证至少有一个查询条件时,才会在SQL语句中追加WHERE关键字。
  2. if test:该标签用于判断参数是否满足条件,满足条件才会追加该标签里语句。
  3. <choose|when|otherwise>:该标签也是用判断参数是否满足条件,但是这个包含不满足条件追加的语句。所有的标签和标签是互斥的,当任何一个标签满足条件时,其他标签均视为条件不成立
  4. foreach:该标签用于对集合参数进行遍历,通常用于构建IN条件语句或者INSERT批量插入语句。

对应示例sql

传入的参数是Map类型的

<select id="getHouseList" resultType="Houses" parameterType="java.util.Map">
        select t.* from  house t
        <where>
            <if test="search.name != null and search.name != '' ">
                and t.name like CONCAT('%','${search.name}','%')
            </if>
            <if test="search.type != null and search.type != '' ">
                and t.type = ${search.type}
            </if>

            <choose>
                <when test="search.orderFiled != null and search.orderFiled != '' ">
                    order by t.${search.orderFiled} desc
                </when>
                <otherwise>
                    order by 't.price' desc
                </otherwise>
            </choose>

            <if test="search.pageSize != '' and search.currentPage != '' ">
                limit ${search.currentPage},${search.pageSize}
            </if>
        </where>

    </select>