【Mybatis学习笔记】动态SQL

动态SQL

If 标签

  • 用于在xml配置中进行 语句判断

  • 放在where后面 若满足条件 则拼接对应的字符串

  • // .java中:
    class User{	//员工表
            id;
            username;
            password;
        	depId;
        }
    List<User> select(int depid,String username){
    		...
     mapper = sqlSessin.getMapper(..); 
     
     List<User> users = mapper.select(int depid,String username)
    }
    ----------------------------------
    // .xml中
        
    '查找同部门下同名的员工信息(一般不会这么去查 为了演示啦)'
    <select id="select" resultType = "xxx.User"> 
     	select 
     		id, username, password, depId
     	from  user 
     		where <if test="depId != null">
     				 depId = #{depid}
     		      </if>
     		      <if test="username != null and username != '' ">
     		      	 and username = #{username}
     		      </if>
    </select>
    '若满足test中的判断, 则直接将标签中的sql拼接到sql语句中!'
    ----------------------------------
    
    问题来了!如果 第一条if语句未满足,而第二条if语句满足了 而拼接上去的就是
    select 
     	id, username, password, depId 
     	from  user 
     		where 'and username = #{username}'
     		
     可以很明显发现!and 也被拼接上了,众所周知 这个sql肯定是错误的!
     那有没有办法解决了?
     相信大家想到了!
     --也就是在where起始后面拼接上'永等式'(eg: 1 = 1)!
     
     <select id="select" resultType = "xxx.User"> 
     	select 
     		id, username, password, depId
     	from  user 
     		where 1 = 1 '这就是永等式子'
     		  <if test="depId != null">
     				 and depId = #{depid}
     		  </if>
     		  <if test="username != null and username != '' ">
     		      	 and username = #{username}
     		  </if> 
     </select>
     
     这样子在每个if标签中含有and都不用慌了!
     当然,mybatis也想到了!所以提供了下面的 <Where>标签! 没错就是替代 Where

Where 标签

where会自动处理冲突

  • and 冲突

  • or 冲突

  • 无内容冲突(当where中没有 if 标签拼接的时候,where会自动擦去)

    • // .java中:
      class User{	//员工表
              id;
              username;
              password;
          	depId;
          }
      List<User> select(int depid,String username){
      		...
       mapper = sqlSessin.getMapper(..); 
       
       List<User> users = mapper.select(int depid,String username)
      }
      ----------------------------------
      // .xml中
      <select id="select" resultType = "xxx.User"> 
       	select 
       		id, username, password, depId
       	from  user 
       		<where> 
       			 <if test="depId != null">
       				 and depId = #{depid}
       		      </if>
       		      <if test="username != null and username != '' ">
       		      	 and username = #{username}
       		      </if>
       		 </where>     
      </select>
      'where标签会自动处理if中的and 和 or'
      ----------------------------------
      '如果and or 放在语句后面会怎么样呢?'
      <select id="select" resultType = "xxx.User"> 
       	select 
       		id, username, password, depId
       	from  user 
       		<where> 
       			 <if test="depId != null">
       				  depId = #{depid} 
       				  and
       		      </if>
       		      <if test="username != null and username != '' ">
       		      	  username = #{username}
       		      	  and
       		      </if>
       		 </where>     
      </select>
      'where标签不会处理后面的and or!!!!'
           
      
    • where标签会自动处理if语句中的and 和 or,但仅限于是在语句开头的 and 、or

Trim 标签

这个标签就厉害了!where标签只能解决开头的and… 而Trim可以自定义控制开头、结尾,可以说 功能很强大了。

  • Trim标签中的属性**(仅当Trim标签有内容时才生效)**:

    • prefix
      • 指定添加trim标签内容的前缀
    • suffix
      • 指定添加trim标签内容的后缀
    • suffixOverrides
      • 指定删除trim标签内容的前缀
    • prefixOverrides
      • 指定删除trim标签内容的后缀
  • // .java中:
    class User{	//员工表
            id;
            username;
            password;
        	depId;
        }
    List<User> select(int depid,String username){
    		...
     mapper = sqlSessin.getMapper(..); 
     
     List<User> users = mapper.select(int depid,String username)
    }
    ----------------------------------
    // .xml中
    <select id="select" resultType = "xxx.User"> 
     	select 
     		id, username, password, depId
     	from  user 
     		<trim prefix="where", prefixOverrides="and"> 
     			 <if test="depId != null">
     				  depId = #{depid}
     				  and
     		      </if>
     		      <if test="username != null and username != '' ">
     		      	  username = #{username}
     		      	  and
     		      </if>
     		 </trim>     
    </select>
    'trim标签当有内容时,指定前缀为where,且指定删除后缀and'
    '这样子就解决了!后缀and的冲突问题!'
    其他属性 以此类推...
         
    

Choose

choose下有两个子标签

  • When**(至少一个)**

  • otherwise**(最多一个)**

  • when 和 otherwise 配合 可以类比成 java中的 if … else… if … else …

  • 当满足when中任意条件时候,则可以不用进行往后的when

  • // .java中:
    class User{	//员工表
            id;
            username;
            password;
        	depId;
        }
    List<User> select(int depid,String username){
    		...
     mapper = sqlSessin.getMapper(..); 
     
     List<User> users = mapper.select(int depid,String username)
    }
    ----------------------------------
    // .xml中
    <select id="select" resultType = "xxx.User"> 
     	select 
     		id, username, password, depId
     	from  user 
     		<trim prefix="where"> 
     			 <choose>
     			 	<when test="depId != null">
     				  depId = #{depid}
     		      	</when>
     		      	<when test="username != null and username != '' ">
     		      	  username = #{username}
     		      	</when>
     		      	'任意的when标签满足时,则choose标签也就结束'
     		      	
     		      	<otherwise>
     		      		depId = 1;
     		      	</otherwise>
     		      	'当when语句没有一个满足时,则会执行otherwise中的内容'
     			 </choose>
     		 </trim>     
    </select>
    
         
    

Foreach

循环功能来啦!有什么用呢?

当你要使用where in(…,…,…)时,通过循环将条件拼接。

  • Foreach

    • collection 指定需要遍历的集合/数组的名称
    • item 指定 集合遍历的临时变量名 类似 java中foreach(ing num: nums) 的num
    • separator 指定遍历分隔符
    • open foreach语句的前缀字符串
    • close foreach语句的后缀字符串
  • // .java中:
    class User{	//员工表
            id;
            username;
            password;
        	depId;
        }
    List<User> select(List<Integer> Ids,List<User> users){){
    		...
     mapper = sqlSessin.getMapper(..); 
     
     mapper.delete( @Param("ids") Ids )
     '注意!这里要用Param标记,因为传入的是集合 mybatis 默认以param0..为键'
     mapper.insert( @Param("users") users )
     
    }
    ----------------------------------
    // .xml中
    '实现批量添加  insert into values (...),(...) 语句'
    <insert id="delete"> 
     	delete from  user 
     		<trim prefix="where in">
     						'设置Param后Ids才查找的到'
     			<foreach collection="Ids" item="id" separator="," open="(" close=")">
     				#{id}
     			</foreach>
     		</trim>
     		</where>     
    </delete>
    ----------------------------------
    '实现批量添加  insert into values (...),(...).. 语句'
    <insert id="delete" userGenerateKeys="true"> 	'开启userGenerateKeys主键自动递增'
     	   insert into values
     	   <foreach collection="users" item="user" separator=",">'每个都要用逗号隔开'
     	   (null, user.username, user.depId, ...)
     	   </foreach>
    
    </insert>
    
         
    

Sql、include

最后一个动态sql标签啦!

  • 作用就是可以绑定指定的sql语句,使用时直接贴标签即可(怎么样!是不是很方便)

  • 当使用时,使用 inculde标签 进行引用 并 设置 对refid属性赋上sql标签id值

  • // .java中:
    class User{	//员工表
            id;
            username;
            password;
        	depId;
        }
    List<User> select(int depid,String username){
    		...
     mapper = sqlSessin.getMapper(..); 
     List<User> users = mapper.select();
    }
    ----------------------------------
    // .xml中
    '用于绑定sql'
    <sql id="userColums">id, username, password, depId</sql>
    
    <select id="select" resultType = "xxx.User"> 
     	select 
     		<include refid="userColums"/>
     	from user     
    </select>
    
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值