1.IF标签

需求:根据条件查询用户

  在Mapper.xml中编写

    <!-- 根据sex和username查询user -->
    <select id="findbySexandUsername" parameterType="User" resultType="User">
        select * from user where sex = #{sex} and username = #{username}
    </select>

  问题:当传入的参数中缺少需要的属性时,不能查出信息

使用IF标签解决:

    <!-- 根据sex和username查询user -->
    <select id="findbySexandUsername" parameterType="User" resultType="User">
        select * from user
        where 1=1
        <if test="sex!=null and sex!='' ">
            and sex = #{sex}
        </if>
        <if test="username!=null and username!='' ">
            and username = #{username}
        </if>
    </select>

2.WHERE标签

  问题:上面的IF标签 中 Where 1=1 显得很麻烦

使用where解决

    <!-- 根据sex和username查询user -->
    <select id="findbySexandUsername" parameterType="User"
        resultType="User">
        select * from user
        <!-- where标签可以自动添加where,同时处理sql语句中第一个and关键字 -->
        <where>
            <if test="sex!=null and sex!='' ">
                and sex = #{sex}
            </if>
            <if test="username!=null and username!='' ">
                and username = #{username}
            </if>
        </where>

    </select>
where标签可以自动添加where,同时处理sql语句中第一个and关键字

3.SQL标签

  问题:在一个Mapper.xml中有许多重复的语句

使用SQL标签解决

    <!-- 查询所有的orders -->
    <select id="findAllOrders" resultMap="ordersResultMap">
        select * from orders
    </select>

    <!-- 声明sql片段 -->
    <sql id="selectUser">
        select * from user
    </sql>

    <!-- 根据sex和username查询user -->
    <select id="findbySexandUsername" parameterType="User" resultType="User">

        <include refid="selectUser"/>

        <!-- where标签可以自动添加where,同时处理sql语句中第一个and关键字 -->
        <where>
            <if test="sex!=null and sex!='' ">
                and sex = #{sex}
            </if>
            <if test="username!=null and username!='' ">
                and username = #{username}
            </if>
        </where>

    </select>

  如果要使用别的namespace中的sql标签,在refid中加入namespace名字

4.FOREACH

  当查询需要用到in时。例如:根据多个id查询用户信息

  需要通道foreach标签

1.数组

接口

    /**
     * 根据ids来查询
     */
    public List<User> findByIds(int[] ids);

映射

    <!-- 根据ids来查询 -->
    <select id="findByIds" parameterType="int[]" resultType="User">
        select * from user
        where
        id in
        <!-- foreach标签,进行遍历 -->
        <!-- collection:遍历的集合 -->
        <!-- item:遍历的项目,可以随便写,,但是和后面的#{}里面要一致 -->
        <!-- open:在前面添加的sql片段 -->
        <!-- close:在结尾处添加的sql片段 -->
        <!-- separator:指定遍历的元素之间使用的分隔符 -->
        <foreach collection="ids" item="id" open="(" close=")" separator=",">
            #{id}
        </foreach>
    </select>

测试

    /**
     * 根据ids
     */
    @Test
    public void m05() {
        // 获取sqlSession,和Spring整理后由Spring管理
        SqlSession sqlSession = this.sqlSessionFactory.openSession();
        // 从sqlSession中获取Mapper接口的代理对象
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

        // 执行查询
        int[] ids = new int[3];
        ids[0] = 10;
        ids[1] = 16;
        ids[2] = 22;

        List<User> list = userMapper.findByIds(ids);
        for (User user : list) {
            System.out.println(user);
        }
    }

  注意:这样写会报错

  原因:这种情况映射中的collection必须按照规范写

  ids 改为 array

再次测试:

2.集合

    /**
     * 根据ids
     */
    @Test
    public void m05() {
        // 获取sqlSession,和Spring整理后由Spring管理
        SqlSession sqlSession = this.sqlSessionFactory.openSession();
        // 从sqlSession中获取Mapper接口的代理对象
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

        // 执行查询
        List<Integer> ids = new ArrayList<>();
        ids.add(10);
        ids.add(16);
        ids.add(22);

        List<User> users = userMapper.findByIds(ids);
        for (User user : users) {
            System.out.println(user);
        }
    }
}
    /**
     * 根据ids来查询
     */
    public List<User> findByIds(List ids);
    <!-- 根据ids来查询 -->
    <select id="findByIds" parameterType="List" resultType="User">
        select * from user
        where
        id in
        <!-- foreach标签,进行遍历 -->
        <!-- collection:遍历的集合,这里是QueryVo的ids属性 -->
        <!-- item:遍历的项目,可以随便写,,但是和后面的#{}里面要一致 -->
        <!-- open:在前面添加的sql片段 -->
        <!-- close:在结尾处添加的sql片段 -->
        <!-- separator:指定遍历的元素之间使用的分隔符 -->
        <foreach collection="ids" item="id" open="(" close=")" separator=",">
            #{id}
        </foreach>
    </select>

  注意:同样不能随意写collection

  应该将 ids 改为 list

05.Mybatis动态sql的更多相关文章

  1. MyBatis 动态SQL(十二)

    动态条件查询 以下是我们数据库表 tb_user 的记录: 假设现在有一个需求,就是根据输入的用户年龄和性别,查询用户的记录信息.你可能会说,这太简单了,脑袋里立马蹦出如下的 SQL 语句: SELE ...

  2. mybatis动态sql以及分页

    1.mybatis动态sql 2.模糊查询 3.查询返回结果集的处理 4.分页查询 5.特殊字符处理 1.mybatis动态sql If.trim.foreach If 标签判断某一字段是否为空 &l ...

  3. mybatis实战教程(mybatis in action)之八:mybatis 动态sql语句

    mybatis 的动态sql语句是基于OGNL表达式的.可以方便的在 sql 语句中实现某些逻辑. 总体说来mybatis 动态SQL 语句主要有以下几类:1. if 语句 (简单的条件判断)2. c ...

  4. 9.mybatis动态SQL标签的用法

    mybatis动态SQL标签的用法   动态 SQL MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么 ...

  5. 自己动手实现mybatis动态sql

    发现要坚持写博客真的是一件很困难的事情,各种原因都会导致顾不上博客.本来打算写自己动手实现orm,看看时间,还是先实现一个动态sql,下次有时间再补上orm完整的实现吧. 用过mybatis的人,估计 ...

  6. Mybatis动态SQL单一基础类型参数用if标签

    Mybatis动态SQL单一基础类型参数用if标签时,test中应该用 _parameter,如: 1 2 3 4 5 6 <select id="selectByName" ...

  7. 超全MyBatis动态SQL详解!( 看完SQL爽多了)

    MyBatis 令人喜欢的一大特性就是动态 SQL. 在使用 JDBC 的过程中, 根据条件进行 SQL 的拼接是很麻烦且很容易出错的. MyBatis 动态 SQL 的出现, 解决了这个麻烦. My ...

  8. Mybatis动态SQL简单了解 Mybatis简介(四)

    动态SQL概况 MyBatis 的强大特性之一便是它的动态 SQL 在Java开发中经常遇到条件判断,比如: if(x>0){ //执行一些逻辑........ }   Mybatis应用中,S ...

  9. mybatis原理分析学习记录,mybatis动态sql学习记录

    以下个人学习笔记,仅供参考,欢迎指正. MyBatis 是支持定制化 SQL.存储过程以及高级映射的持久层框架,其主要就完成2件事情: 封装JDBC操作 利用反射打通Java类与SQL语句之间的相互转 ...

随机推荐

  1. IIS反向代理解决Web前端跨域

    1.1 IIS7反向代理解决跨域问题IIS的版本必须是IIS7及其以上,否则没有反向代理功能:按照以下步骤来配置IIS,以实现反向代理: 1.2 配置步骤1. 下载安装ARR(Application ...

  2. 2018-2019-2-20175323 java实验四 Android程序设计

    (一)安装及配置Andriod Studio,执行HelloWorld 我选择的安装网址下载了3.2.0版本的Andriod Studio 此处应该选择cancel 报错 点击所给链接,安装相应SDK ...

  3. CPUID 指令的使用

    使用 CPUID 指令可以从 processor 厂商里获得关于 processor 的详细信息,CPUID 指令是从 Intel 486 处理器以后开始加入支持. 1. 检测处理器是否支持 cpui ...

  4. go beego

    一. 引入 go get github.com/astaxie/beego go get gitgub.com/beego/bee go get -u gitxxx.... 更新框架 编写 packa ...

  5. 10、 导出python脚本进行数据驱动的接口测试

    postman自带脚本导出功能,对于代码小白来说,可以不错的学习代码级接口测试 第一步:输入接口地址,点击send 第二步:点击code,导出脚本文件,为python脚本 第三步:安装python3以 ...

  6. 了解Metasploit中的Payloads(有效载荷)

    什么是payload? payload又称为攻击载荷,主要是用来建立目标机与攻击机稳定连接的,可返回shell,也可以进行程序注入等.也有人把payloads称 为shellcode. Shellco ...

  7. RHEL7更换yum源

    1,删除注册和订阅提示 查找subscription-manager相关组件: rpm -qa | grep subscription-manager 删除subscription-maanager相 ...

  8. angularJS ng-model与wdatapicker问题记录

    代码: <input type="text" placeholder="开始日期" ng-model="data_start" onF ...

  9. scrapy 多个爬虫运行

    from scrapy import cmdline import datetime import time import os import scrapy from scrapy.crawler i ...

  10. spring MVC 全局的异常处理

    1.使用SimpleMappingExceptionResolver实现异常处理 在Spring的配置文件applicationContext.xml中增加以下内容: <bean class=& ...