1、if用法

<select id="selectUser" resultType="com.forest.owl.entity.User">
    select * from user
    where 1=1
    <if test="userName != null and userName != '' ">
        and user_name like concat('%', #{userName}, '%')
    </if>
    <if test="userPhone != null and userPhone !='' ">
        and user_phone=#{userPhone}
    </if>
</select>

2、choose

<select id="selectUser" resultType="com.forest.owl.entity.User">
    select * from user
    where 1=1 /*此处不可忽略*/
    <choose>
        <when test="id != null">
            and id=#{id}
        </when>
        <when test="userName != null and userName !='' ">
            and user_name=#{userName}
        </when>
        <otherwise>
            and 1=2 /*此处不可忽略*/
        </otherwise>
    </choose>
</select>

 3、where

where标签内如果没有符合条件的选项,则最后生成的sql语句不含where;如果有符合条件的,则生成的sql语句会自动去除两端的and

<select id="selectUser" resultType="com.forest.owl.entity.User">
    select * from user
    <where>
        <if test="userName != null and userName != '' ">
        and user_name like concat('%', #{userName}, '%')
        </if>
        <if test="userEmail != null and userEmail != '' ">
        and user_email = #{userEmail}
        </if>
    </where>
</select>

 4、set

<update id="updateUserById">
    update user
    <set>
        <if test="userName != null and userName != '' ">
        user_name=#{userName},
        </if>
        id=#{id}  /*此处不可忽略*/
    </set>
    where id=#{id}
</update>

 5、foreach

collection:必填,值为要迭代循环的属性名。

item:变量名,值为要从迭代对象中取出的每一个值

index:索引的属性名。在集合数组下为索引值,在Map对象下为Map的key值。

参数为List的情况

<select id="selectByIdList" resultType="com.forest.owl.entity.User">
    select * from user
    where id in
    <foreach collection="list" open="(" close=")" separator="," item="id" index="i">
    #{id}
    </foreach>
</select>

参数为Map的情况

    <update id="updateByMap">
        update user
        set
        <foreach collection="_parameter" item="val" index="key" separator=",">
            ${key}=#{val}
        </foreach>
        where id=#{id}
    </update>

6、bind

bind标签可以使用OGML表达式创建一个变量病绑定到上下文中。

<if test="userName != null and userName != '' ">
and user_name like concat('%', #{userName}, '%')
</if>

可以通过bind改写成

<if test="userName != null and userName != '' ">
    <bind name="userNameLike" value=" '%' + userName + '%' "/>
    and user_name #{userNameLike}
</if>

7、如果测试的时候想知道映射XML中方法执行的参数 可以这么做:

public class StringUtil{
    public static void print(Object parameter){
        System.out.println(parameter);
    }
}
<bind name="print" value="@com.forest.owl.util.StringUtil@print(_parameter)" />

 8、鉴别器映射(discriminator)

有时单独一个映射会需要返回不同数据类型的结果集,discriminator就是为了用来处理这种情况。

因为感觉这个标签不会很常用,所以不做进一步了解,暂时给出简单的代码,后续有需要再回来翻阅:

  <resultMap id="UserAndRole" extends="BaseResultMap" type="com.forest.owl.entity.User">
    <discriminator javaType="int" column="enabled">
      <" resultMap="resultMap1"/>
      <" resultMap="resultMap2"/>
    </discriminator>
  </resultMap>

mybatis入门篇:mybatis动态SQL的更多相关文章

  1. Spring Boot MyBatis升级篇-注解-动态SQL(if test)-方案二:@Provider(8)

    1)动态语言注解(2)@Provider使用思路(3)@SelectProvider小试牛刀(4)@SelectProvider初露锋芒(5)@SelectProvider过关斩将(6)@Insert ...

  2. 持久层之 MyBatis: 第二篇 :动态SQL And多表查询

    MyBatis入门到精通 完整CRUD UserDaoImpl 编写UserDao对应的UserDaoMapper.xml 添加UserDao的测试用例 编写UserDao的测试用例 解决数据库字段名 ...

  3. mybatis入门基础(五)----动态SQL

    一:动态SQL 1.1.定义 mybatis核心对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接.组装. 1.2.案例需求 用户信息综合查询列表这个statement的定义使用动态s ...

  4. Mybatis第三篇【动态SQL】

    动态SQL 何为动态SQL??回顾一下我们之前写的SSH项目中,有多条件查询的情况,如下图 我们当时刚开始做的时候,是需要在Controller中判断SQL是否已经有条件了,因为SQL语句需要拼接起来 ...

  5. MyBatis学习总结_11_MyBatis动态Sql语句

    MyBatis中对数据库的操作,有时要带一些条件,因此动态SQL语句非常有必要,下面就主要来讲讲几个常用的动态SQL语句的语法 MyBatis中用于实现动态SQL的元素主要有: if choose(w ...

  6. MyBatis:学习笔记(4)——动态SQL

    MyBatis:学习笔记(4)——动态SQL

  7. SSM框架之Mybatis(6)动态SQL

    Mybatis(6)动态SQL 1.动态SQL 出现原因:有些时候业务逻辑复杂时,我们的 SQL 是动态变化的,此时在前面的学习中我们的 SQL 就不能满足要求了 1.1.if标签 我们根据实体类的不 ...

  8. Spring mybatis源码篇章-动态SQL节点源码深入

    通过阅读源码对实现机制进行了解有利于陶冶情操,承接前文Spring mybatis源码篇章-动态SQL基础语法以及原理 前话 前文描述到通过mybatis默认的解析驱动类org.apache.ibat ...

  9. SSM框架开发web项目系列(四) MyBatis之快速掌握动态SQL

    前言 通过前面的MyBatis部分学习,已经可以使用MyBatis独立构建一个数据库程序,基本的增删查改/关联查询等等都可以实现了.简单的单表操作和关联查询在实际开的业务流程中一定会有,但是可能只会占 ...

  10. Mybatis分页查询与动态SQL

    一.Mybatis的分页查询 由于第一二节较为详细讲述了Mybatis的环境搭建,文件配置,SQL编写和Java代码实现,所以接下来的讲述都将只抽取关键代码和mapper文件中的关键sql,详细的流程 ...

随机推荐

  1. Day1-浅谈接口测试

    1.接口测试的定义:从数据库里面取数据,插入数据,把前段和后端联系起来: 2.接口测试的必要性: 1)前端未开发好,但是接口已开发 2)页面上测不了的,可以通过接口来测试 3.接口测试需要注意: 1) ...

  2. ANOVA-方差分析和单尾方差分析

    https://www.cnblogs.com/webRobot/p/6877283.html https://blog.csdn.net/zijinmu69/article/details/8056 ...

  3. Array.sort()

    sort() : 是对数组的元素进行排序,并返回一个数组.默认排序方式是根据字符串的Unicode码表的码点. 由于取决于具体实现,所以无法保证它的时间和空间复杂度. arr.sort(compare ...

  4. 我的代码-test models

    # coding: utf-8 # In[2]: import pandas as pdimport numpy as npfrom sklearn.preprocessing import bina ...

  5. 第四次SCRUM任务

    一.第四次SCRUM任务 继第三次的任务之后,对最终的部署做一定的完善,以及系统的BUG调试,压力测试,会议明确最终的方案. 二.用户故事 1.用户可以进行输入用户名密码登录和注册. 2.用户可以在程 ...

  6. ubuntu16.04中如何启用floodlight的其中一种方式

    1. 提前一台安装好mininet,另一台安装好floodlight 2. 在mininet里面的custom文件夹下自定义文件ProjectGroup10_Topology.py from mini ...

  7. 爬虫模块介绍--request(发送请求模块)

    爬虫:可见即可爬   # 每个网站都有爬虫协议 基础爬虫需要使用到的三个模块 requests 模块  # 模拟发请求的模块 PS:python原来有两个模块urllib和urllib的升级urlli ...

  8. ERROR: cannot launch node of type [turtlebot_teleop/turtlebot_teleop_key] 问题解决

    当遇到问题

  9. python入门——热量转换 I

    热量转换 I 描述 卡路里,简称卡(Calorie),缩写为cal,定义为在1个大气压下,将1克水提升1摄氏度所需要的热量,卡是能量单位,被广泛使用在营养计量方面.国际能量标准单位是焦耳(joule) ...

  10. 当yum安装出现Error: Package: glibc-headers .....时

    环境 CentOS Linux release 7.4.1708 (Core)   当使用yum源安装时,出现以下报错 Error: Package: glibc-headers-.el7_4..x8 ...