mybatis-动态sql

Posted 爱编程DE文兄

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis-动态sql相关的知识,希望对你有一定的参考价值。

1.where和if标签

  (1)where标签能消除第一个条件的前and 和or关键字,避免了sql语句语法错误

  (2).if标签表示判断

    <!-- 以性别和名字条件查询用户 -->
    <select id="findBySexAndName" parameterType="User" resultType="User">
        <!-- select * from user where username = #{username} and sex = #{sex} -->
        
        select * from user
        <where>
            <if test="username != null and username !=\'\' ">
                username = #{username}
            </if>
            <if test="sex != null and sex != \'\' ">
                and sex = #{sex}
            </if>
        </where>
    </select>

值得一提的是,我们传入的对象的属性,会被逐个提取出来放到一个map中,键为对象属性名,所以在if标签中直接写属性名即可,不需写#{属性名}

 

2.sql片段

  (1)sql标签作用很简单,将sql语句中存在重复性较高的部分提取出来;

    <sql id="userTable">
        select * from user
    </sql>
    <!-- 以性别和名字条件查询用户 -->
    <select id="findBySexAndName" parameterType="User" resultType="User">
        <!-- select * from user where username = #{username} and sex = #{sex} -->
        
        <!-- 引用sql片段 -->
        <include refid="userTable"></include>
        <where>
            <if test="username != null and username !=\'\' ">
                username = #{username}
            </if>
            <if test="sex != null and sex != \'\' ">
                and sex = #{sex}
            </if>
        </where>
    </select>

 

3.foreach标签

  foreach标签用来遍历数组或者集合,下面看下数组和集合出现的三种情况如何使用foreach

  (1)方法参数是含有集合和数组的对象

 

   下面只演示集合,数组跟集合差不读:

    <!-- 传入拥有集合和数组的对象 -->
    <select id="findByListAndArray" parameterType="QueryVo" resultType="User">
        <!-- select * from user where username = #{username} and sex = #{sex} -->
        
        <!-- 引用sql片段 -->
        <include refid="userTable"></include>
        <where>
            <!-- id in (1,2,3) -->
            <foreach collection="list" item="id" open="id in (" close=")" separator=",">
                #{id}
            </foreach>
        </where>
    </select>    

  collection属性值代表传入对象的集合或者数组,item值为集合或数组中每个元素的临时变量,open为遍历拼接前的语句的前缀,close为遍历拼接后的后缀,separator为每遍历一次后追加字符串内容,#{id}取得当前元素的值;foreach有个好处,它能知道有效元素的最后一个元素,在之后空的索引位置将不会遍历

  junit测试:

    @Test
    public void test5() {
        //加载主配置文件
        String resource = "sqlMapConfig.xml";
        
        try {
            //获取指向该配置的流
            InputStream in = Resources.getResourceAsStream(resource);
            
            //获取工厂
            SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
            
            //获取session
            SqlSession session = factory.openSession();
            
            //--------------------------------------------------------------------
            
            //得到代理对象
            UserMapper mapper = session.getMapper(UserMapper.class);
            
            QueryVo vo = new QueryVo();
            
//            Integer[] ids = new Integer[5];
//            ids[0] = 1;
//            ids[1] = 10;
//            ids[2] = 15;
        
//            vo.setIds(ids);
            
            List<Integer> idList = new ArrayList<Integer>();
            
            idList.add(10);
            idList.add(1);
            idList.add(15);
            
            vo.setList(idList);
            
            List<User> list = mapper.findByListAndArray(vo);
            
            System.out.println(list);
            
        } catch (IOException e) {
            e.printStackTrace();
        }
        
    }

  (2)方法参数是数组

 

   junit测试:

    @Test
    public void test6() {
        //加载主配置文件
        String resource = "sqlMapConfig.xml";
        
        try {
            //获取指向该配置的流
            InputStream in = Resources.getResourceAsStream(resource);
            
            //获取工厂
            SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
            
            //获取session
            SqlSession session = factory.openSession();
            
            //--------------------------------------------------------------------
            
            //得到代理对象
            UserMapper mapper = session.getMapper(UserMapper.class);
            
            Integer[] ids = new Integer[5];
            ids[0] = 1;
            ids[1] = 10;
            ids[2] = 15;
        
            List<User> list = mapper.findByArray(ids);
            
            System.out.println(list);
            
        } catch (IOException e) {
            e.printStackTrace();
        }
        
    }

 (3)方法参数是集合 (不演示,参照数组)

以上是关于mybatis-动态sql的主要内容,如果未能解决你的问题,请参考以下文章

mybatis动态sql片段与分页,排序,传参的使用

Mybatis -- 动态Sql概述动态Sql之<if>(包含<where>)动态Sql之<foreach>sql片段抽取

mybatis动态sql之利用sql标签抽取可重用的sql片段

MYBATIS05_ifwherechoosewhentrimsetforEach标签sql片段

[mybatis]动态sql_sql_抽取可重用的sql片段

Mybatis动态sql