Mybatis动态SQL语句使用

在实际开发中,有时候查询条件可能是不确定的,查询条件可能有多条也可能没有,这时候就需要用到动态的sql语句拼接功能。

一、ifwheresql标签的使用

需求:在一些高级查询中,查询条件存在的个数不确定。如,SELECT * FROM user WHERE username LIKE ‘%明%‘ AND sex = ‘1‘;

为了能够动态拼接sql语句可以采用以下方式:

UserMapper.xml

<select id="findUserByUserNameAndSex" parameterType="cn.itheima.pojo.User" resultType="cn.itheima.pojo.User">\    SELECT * FROM user
         <!-- where标签作用:
             会自动向sql语句中添加where关键字
             会去掉第一个条件的and语句
         -->
        <where>
            <if test="username != null and username != ‘‘">
              AND username LIKE ‘%${username}%‘
          </if>
            <if test="sex != null and sex != ‘‘">
              AND sex=#{sex}
            </if>
        </where>
    </select>

where标签下的查询条件放在findUserByUserNameAndSex中,只能在该范围内使用。为了实现代码的重用性,通常将查询条件放在外面,由不同的查询共同调用。

  <sql id="user_where">
       <where>
           <if test="username != null and username != ‘‘">
              AND username LIKE ‘%${username}%‘
          </if>
            <if test="sex != null and sex != ‘‘">
            AND sex=#{sex}
            </if>
        </where>
    </sql>
    <select id="findUserByUserNameAndSex" parameterType="cn.itheima.pojo.User" resultType="cn.itheima.pojo.User">
        SELECT * FROM user
        <!-- 调用sql条件 -->
        <include refid="user_where"></include>
    </select>    

UserMapper.java中编写接口

List<User> findUserByUserNameAndSex(User user);

测试

    @Test
    public void testFindUserByUserNameAndSex() throws Exception {
        SqlSession session = sqlSessionFactory.openSession();
        UserMapper userMapper = session.getMapper(UserMapper.class);
        User user = new User();
        user.setUsername("明");
        user.setSex("1");
        List<User> userList = userMapper.findUserByUserNameAndSex(user);
        System.out.println(userList);
    }

二、foreach标签的使用

需求:SQL语句中,SELECT * FROM user WHERE id IN (1,15,22,28);为了从service层接收多个id值,然后使用foreach标签动态拼接多个id值组成完整的SQL语句。

UserMapper.xml

    <select id="findUserByIds" parameterType="cn.itheima.pojo.QueryVO" resultType="cn.itheima.pojo.User">
        SELECT * FROM user
        <where>
            <if test="ids != null">
                <!--
                foreach:循环传入的集合参数
                collection:传入的集合的变量名称
                item:每次循环将循环出的数据放入这个变量
                open:循环开始拼接的字符串
                close:循环结束拼接的字符串
                separator:循环中拼接的分隔符
                 -->
                <foreach collection="ids" item="id" open=" id IN (" close=")" separator=",">
                    #{id}
                </foreach>
            </if>
        </where>
    </select>

QueryVO.java

package cn.itheima.pojo;

import java.util.List;

public class QueryVO {
    private List<Integer> ids;
    public List<Integer> getIds() {
        return ids;
    }
    public void setIds(List<Integer> ids) {
        this.ids = ids;
    }
}

多个id值可以通过QueryVO类传递给DAO层。

UserMapper.java接口中编写接口

List<User> findUserByIds(QueryVO vo);

测试

    @Test
    public void testFindUserByIds() throws Exception {
        SqlSession session = sqlSessionFactory.openSession();
        UserMapper userMapper = session.getMapper(UserMapper.class);
        QueryVO vo = new QueryVO();
        List<Integer> ids = new ArrayList<Integer>();
        ids.add(1);
        ids.add(15);
        ids.add(22);
        ids.add(28);
        vo.setIds(ids);
        List<User> userList = userMapper.findUserByIds(vo);
        System.out.println(userList);
    }

原文地址:https://www.cnblogs.com/binaway/p/9160258.html

时间: 2024-11-16 04:24:31

Mybatis动态SQL语句使用的相关文章

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

mybatis 的动态sql语句是基于OGNL表达式的.可以方便的在 sql 语句中实现某些逻辑. 总体说来mybatis 动态SQL 语句主要有以下几类:1. if 语句 (简单的条件判断)2. choose (when,otherwize) ,相当于java 语言中的 switch ,与 jstl 中的choose 很类似.3. trim (对包含的内容加上 prefix,或者 suffix 等,前缀,后缀)4. where (主要是用来简化sql语句中where条件判断的,能智能的处理 a

mybatis 动态sql语句

mybatis 的动态sql语句是基于OGNL表达式的.可以方便的在 sql 语句中实现某些逻辑. 总体说来mybatis 动态SQL 语句主要有以下几类: 1. if 语句 (简单的条件判断) 2. choose (when,otherwize) ,相当于java 语言中的 switch ,与 jstl 中的choose 很类似. 3. trim (对包含的内容加上 prefix,或者 suffix 等,前缀,后缀) 4. where (主要是用来简化sql语句中where条件判断的,能智能的

Mybatis动态sql语句(OGNL语法)

下面是Mybatis动态sql语句(即OGNL语法)的简单案例 1.创建表 create table test(id int primary key auto_increment,name varchar(20),job varchar(20),dept varchar(20),sal int) charset=utf8; insert into test values (null,'鲁班','java','甲',1456), (null,'后裔','java','甲',2440), (null

MyBatis动态Sql语句

林炳文Evankaka原创作品. 转载请注明出处http://blog.csdn.net/evankaka   MyBatis中对数据库的操作.有时要带一些条件.因此动态SQL语句很有必要.以下就主要来讲讲几个经常使用的动态SQL语句的语法 MyBatis中用于实现动态SQL的元素主要有: if choose(when.otherwise) trim where set foreach 1.if 对属性进行推断.假设不为空则运行推断条件 <select id="selectByCriter

【转】mybatis实战教程(mybatis in action)之八:mybatis 动态sql语句

转自:除非申明,文章均为一号门原创,转载请注明本文地址,谢谢! 转载地址:http://blog.csdn.net/kutejava/article/details/9164353#t5 1. if 语句 (简单的条件判断) 2. choose (when,otherwize) ,相当于java 语言中的 switch ,与 jstl 中的choose 很类似. 3. trim (对包含的内容加上 prefix,或者 suffix 等,前缀,后缀) 4. where (主要是用来简化sql语句中

mybatis动态sql语句问题

1.关于mybatis的insertintoselect命令未结束问题 添加:  useGeneratedKeys="false" 官网的解释是 允许 JDBC 支持自动生成主键,需要驱动兼容.如果设置为 true 则这个设置强制使用自动生成主键,尽管一些驱动不能兼容但仍可正常工作(比如 Derby).

Mybatis使用之动态SQL语句

Mybatis使用之动态SQL语句 一:简介 Mybatis动态SQL语句可帮助我们根据需要动态拼接SQL语句.主要在配置文件中使用<where> <if><choose><when><otherwise> <set> <trim><foreach>标签来实现. 二:具体使用方式 2.1 where 2.1.1 功能 语句的作用主要是简化SQL语句中where中的条件判断,where元素的作用是会在写入wher

Mybatis学习之动态sql语句(7)

Mybatis 的动态sql语句是基于OGNL表达式的.可以方便的在 sql 语句中实现某些逻辑. 总体说来mybatis 动态SQL 语句主要有以下几类: 1. if 语句 (简单的条件判断) 2. choose (when,otherwize) ,相当于java 语言中的 switch ,与 jstl 中的choose 很类似. 3. trim (对包含的内容加上 prefix,或者 suffix 等,前缀,后缀) 4. where (主要是用来简化sql语句中where条件判断的,能智能的

MyBatis的动态SQL语句这么厉害的!

MyBatis动态SQL语句,非常实用 MyBatis 的强大特性之一便是它的动态 SQL.简直厉害啦~ if if 语句比较常用,查询.删除.修改的时候都是可以用到! 其中的 where 1 = 1 仅仅只是为了满足多条件查询页面中不确定的各种因素而采用的一种构造一条正确能运行的动态SQL语句的一种方法. where 1 = 0 这个条件始终为false,结果不会返回任何数据,只有表结构,可用于快速建表 <!-- 测试 if 语句 id 与之查询方法相对应 resultType 表示User对