zoukankan      html  css  js  c++  java
  • mybatis动态sql

    一,mybatis 动态sql

      1) mybatis 的动态sql可以对查询条件进行预编译,生成比较灵活的sql语句

    二,常用标签

      1)if   :判断传入参数    

         

     <if test="oIp != null">   <!--test里面是判断条件, oIp 是传入对象中的成员变量 -->
       o_ip,             <!-- 这里是条件成立要添加的内容 -->
     </if>

     

      2)where  :    

         

     select * from
      sys_inf_user
          <where>
              <if test="oId != null"> 
                  o_id = #{oId}
              </if> 
              <if test="oIp != null">
                 and o_ip = #{oIp}
              </if> 
           </where>
            <!--
            用于where处,当其中只有部分条件满足时,会去除条件前面的 and 或者 or
    
            (例如下面的第一个条件不满足,那么sql语句就变成select * from sys_inf_user
    
            where o_ip = #{oIp}),当全部
    
            条件都不满足的时候,会查出全部结果,就相当于select * from  sys_inf_user
    
             where 1=1
            --> 

     

      3)set :      

          

    update sys_inf_user
          <set>
            <if test="uName != null">
              u_name =#{uName},
            </if>
            <if test="">
              u_pwd =#{uPwd},
            </if>
            where u_id = #{uId}
          </set>
         <!--
            一般用于set位置 ,当全部条件不满时,会报错,当部分条件满足时
            会去除条件后面的 ',' 符号;例如下面条件都满足时:sql是: (
            update sys_inf_user u_name =#{uName},u_pwd =#{uPwd}
            where u_id = #{uId}); 可以看出已经去掉了#{uPwd}后面的,符号;
            当下面条件只满足一个时,也会去除尾部的,符号;
          -->
     

     

      4)trim :     

          

        <!-- trim 可以定义规则
            prefixOverrides :表示要去除的前置内容
            prefix : 表示要添加的开始内容
            suffix : 表示要添加的结束内容
            suffixOverrides :表示要去除的后置内容
          -->
    
        <trim prefixOverrides="and | or" prefix="(" suffix=")" suffixOverrides=",">
    
        </trim>
        <!-- trim 的经典实现
    
          set 标签 :
          set标签等效于:
            <trim prefix ="set " suffixOverrides=","> 
    
            </trim>
    
          where 标签:
            <trim prefixOverrides="and | or" prefix="where "> 
    
            </trim>
         -->

     

      5)foreach :  

        

        <!-- 
          collection :传入参数名, List类型写:list 数组类型写:array  map类型写 : 具体key(参考下面foeach遍历map)
    
          item : 表示在迭代过程中每一个元素的别名
    
          index :表示在迭代过程中每次迭代到的位置(下标)
    
          open :前缀
    
          close :后缀
    
          separator :分隔符,表示迭代时每个元素之间以什么分隔
        -->
          <foreach collection="list" open="(" index="index" item="item" close=")" separator=",">
            #{item}
          </foreach>

     三,foreach 使用

       1)批量添加(传入list,list里包含对象)

        1.准备数据:

         命名不规范,只为示例;

    ArrayList<Object> list = new ArrayList<>();
            
            Test test = new Test();
            test.setName("wangwu");
            test.setPwd("123");
            test.setDizhi("北京");
            test.setDianhua("123456789");
            
            Test test2 = new Test();
            test2.setName("lisi");
            test2.setPwd("123456");
            test2.setDizhi("北京,shanghi");
            test2.setDianhua("123456789");
            list.add(test);
            list.add(test2);
            
            int i=testMapper.addTestLists(list);

        

        2.接口

    int addTestLists(ArrayList<Object> list);

        3.sql

    <insert id="addTestLists" parameterType="java.util.List">
        insert into 
        sys_test
        (name,pwd,dianhua,dizhi)
        values
        <foreach collection="list"  separator=","  index="index" item="item">
                (#{item.name},#{item.pwd},#{item.dianhua},#{item.dizhi})            
        </foreach>
    </insert>

       2)批量删除

          1.准备数据:

      

            List<Integer> list = new ArrayList<Integer>();
            list.add(4);
            list.add(5);
            list.add(6);
            list.add(7);
            list.add(8);
            int i=testMapper.deleteTest(list);

          2.接口:

        

    int deleteTest(List<Integer> list);

          3.sql :

    <delete id="deleteTest" parameterType="java.util.List">
        delete from 
        sys_test
        where id in
        <foreach collection="list" open="(" close=")" separator="," index="index" item="item">
            #{item}
        </foreach>
    </delete>

        3)foreach遍历map

          1)数据准备

        Map<Object, Object> hashMap = new HashMap<>();
            hashMap.put("id1", 2);
            hashMap.put("id2", 10);
            int i=testMapper.deleteTests(hashMap);

          2)接口

    int deleteTests(@Param(value="maps")Map<Object, Object> hashMap);

          3)sql

    <delete id="deleteTests" parameterType="java.util.Map">
        delete from 
        sys_test
        where id in
        <foreach collection="maps.values" open="(" close=")" separator="," index="index" item="item">
            #{item}
        </foreach>
    </delete>
  • 相关阅读:
    看下资深架构师平时需要解决的问题,对比你离资深架构师还有多少距离——再论技术架构的升级之路
    要上进总会有时间的,要放松也总会有理由的——记录2年出版2本书带给我的改变,同时分享写书和写博客的技巧
    再论面试前准备简历上的项目描述和面试时介绍项目的要点
    在做技术面试官时,我是这样甄别大忽悠的——如果面试时你有这样的表现,估计悬
    分享些我见到的听到的各种创业经历(有成功也有失败)——分析下创业成功要做到哪些
    写技术文章能帮助大家理顺学习的思路,更能促进自己不断学习——分享下写技术文章的思路
    在博客园写了一年博客,收获的不仅仅是写作技能——我能一直保持积极的学习和工作态度
    Hystrix针对不可用服务的保护机制以及引入缓存
    当你收到面试通知后,通过如下的准备可以大大提升面试成功率
    工作5年左右的程序员如何在职业瓶颈期内快速提升自己的身价?提升后如何有效变现自己的高质量技能?
  • 原文地址:https://www.cnblogs.com/hi-feng/p/7883918.html
Copyright © 2011-2022 走看看