• 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);
        }
  • 相关阅读:
    常州day2
    常州day3
    常州day1p3
    第3章 图像基础
    第2章 什么是深度学习?
    Deep Learning for Computer Vision with Python 第1章:整个内容简介
    双目视觉(1)---立体匹配介绍
    ubuntu 16.04 配置python远程jupyter nootbook环境
    Ubuntu16.04 Caffe CPU版本 安装步骤记录
    opencv(2)- 处理像素值
  • 原文地址:https://www.cnblogs.com/binaway/p/9160258.html
Copyright © 2020-2023  润新知