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. 如何理解Vue的render函数

    第一个参数(必须) - {String | Object | Function} <!DOCTYPE html> <html lang="en"> < ...

  2. 修改ActiveProcessLinks链表隐藏进程

    在Windows内核中有一个活动进程链表AcvtivePeorecssList.它是一个双向链表,保存着系统中所有进程的EPROCESS结构.特别地,进程的EPROCESS结构包含一个具有指针成员FL ...

  3. Python flask构建微信小程序订餐系统✍✍✍

    Python flask构建微信小程序订餐系统  整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课程本身没问题, ...

  4. 随笔-ansible-3

    关于循环的一些事: 是否是因为模块的原因? item适用于copy,但不适用于yum.虽然出现了警告,但并不表示不能用.功能还是不受影响的. 在上例中,我们使用了yum.copy.service模块( ...

  5. 初学者学习PHP开发应该掌握的几段精华代码

    来自:http://hi.baidu.com/dckhello/item/d62b16d8994bf93449e1ddb0 经典循环例子 <HTML><HEAD><TIT ...

  6. YARN设计思路

  7. React和vue的差异和相似地方

    React 单向绑定(加插件后,还是可以双向绑定) Vue 双向绑定 组件化 1. React,需要编写render函数, 2. 当React状态的状态state改变是render就会重新被调用, 重 ...

  8. python的异常捕捉

    你可能会说既然有万能异常Exception,那么我直接用上面的这种形式就好了,其他异常可以忽略 你说的没错,但是应该分两种情况去看 1.如果你想要的效果是,无论出现什么异常,我们统一丢弃,或者使用同一 ...

  9. Excel宏开发之合并单元格

    合并单元格 Sub 宏1() ' ' 宏1 宏 ' ' 快捷键: Ctrl+q ' Application.Goto Reference:="宏1" Application.VBE ...

  10. jquery选择器中中>和空格的区别

    空格:$('parent childchild')表示获取parent下的所有的childchild节点 大于号:$('parent > childchild')表示获取parent下的所有下一 ...