zoukankan      html  css  js  c++  java
  • 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)方法参数是集合 (不演示,参照数组)

  • 相关阅读:
    ElastaticSearch学习笔记(三) ----- 聚合查询
    ElastaticSearch学习笔记(二) ----- DSL查询与过滤
    ElastaticSearch学习笔记(一) ----- 基础概念
    BizTalk连接SAP方法
    解决spark日志清理问题
    Spark Standalone模式 高可用部署
    @Data注解踩坑之大小写
    SVN No such revision *
    svn: Base checksum mismatch on
    Bean的原始版本与最终版本不一致?记一次Spring IOC探索之旅
  • 原文地址:https://www.cnblogs.com/ibcdwx/p/12941965.html
Copyright © 2011-2022 走看看