您当前的位置: 首页 >  sql

梁云亮

暂无认证

  • 3浏览

    0关注

    1211博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【精品】MyBatis 动态SQL

梁云亮 发布时间:2020-04-19 11:17:16 ,浏览量:3

MyBatis中用于实现动态SQL的元素主要有:

if

	select * from tb_emp where 1=1
	
		and deptno=#{deptno}
	
	
		and ename=#{ename}
	

代码含义:如果提供了deptno参数,那么就满足条件deptno=#{deptno};如果提供了ename参数,那么就满足条件ename=#{ename},最终返回的就是满足这些条件的所有的Emp。

choose

choose通常都是与when和otherwise搭配使用:when元素表示当when中的条件满足的时候执行的内容。当所有的条件都不满足的时候就输出otherwise中的内容。


	select * from tb_emp where 1=1
	
		
			and deptno=#{deptno}
		
		
			and ename=#{ename}
		
		
			and hiredate>#{hiredate}
		
	

代码含义:当deptno!=null的时候就输出and deptno=#{deptno},不再执行下面的条件判断;当deptno为空且ename!=null的时候,就输出and ename=#{ename};当所有条件都不满足的时候就输出and hiredate>#{hiredate}中的内容。

示例:模拟if-else结构


    
        
            update tb_city
            set `name`=#{name,jdbcType=VARCHAR},
                priority=#{priority,jdbcType=INTEGER},
                province_id=#{provinceId,jdbcType=BIGINT},
                `state`=#{state,jdbcType=INTEGER}
            where id = #{id,jdbcType=BIGINT}
        
        
            insert into tb_city (`name`, priority, province_id, `state`)
            values (#{name,jdbcType=VARCHAR}, #{priority,jdbcType=INTEGER}, #{provinceId,jdbcType=BIGINT}, #{state,jdbcType=INTEGER})
        
    

where

用来简化SQL语句中where的条件判断。如果所有的条件都不满足,那么MyBatis就会查出所有的记录;如果输出后是and 开头的,MyBatis会把第一个and忽略;当然如果是or开头的,MyBatis也会把它忽略;此外,对于where元素中的空格问题,MyBatis也会智能的帮我们加上。


	select * from tb_emp
	
		
			and deptno=#{deptno}
		
		
			and ename=#{ename}
		
	

说明: 如果deptno=null且ename!=null,那么输出的整个语句会是select * from tb_emp where ename= #{ename},而不是select * from tb_emp where and ename= #{ename},因为MyBatis会智能的把第一个and或or给忽略掉。

trim

可以在它自己包含的内容前加上某些前缀或后缀,对应的属性是prefixOverrides和suffixOverrides。


	select * from tb_emp
	
		
			and deptno=#{deptno}
		
		
			and ename=#{ename}
		
	

上面代码中的prefixoverride是去掉第一个and。属性说明 :

  • prefix,suffix 表示在trim标签包裹的部分的前面或者后面添加内容
  • 如果同时有prefixOverrides,suffixOverrides 表示会用prefix,suffix覆盖Overrides中的内容。
  • 如果只有prefixOverrides,suffixOverrides 表示删除开头的或结尾的xxxOverides指定的内容。
set

在包含的语句前输出一个set,然后如果包含的语句是以逗号结束的话将会把该逗号忽略,如果set包含的内容为空的话则会出错。


	update tb_emp
	
		
			ename=#{ename},
		
		
			sal=#{sal}
		
	
	where empno=#{empno}

foreach

它可以在SQL语句中迭代一个集合,主要用于构建in条件。foreach元素的属性主要有item、index、collection、open、separator、close,其中:

  • item:指对集合迭代时,当前迭代到的元素的别名。
  • index:用于表示在迭代过程中,每次迭代到的位置。
  • open:表示该语句以什么开始。
  • separator:被迭代的元素之间以什么符号作为分隔符。
  • close表示以什么结束。
  • collection:该属性是必须指定的,但是在不同情况下,该属性的值是不一样的,主要有一下3种情况:
    • 如果传入的是单参数且参数类型是一个List的时候,其值为list;

      
      	select * from tb_emp where empno in
      	
      		#{item}
      	
      
      
    • 如果传入的是单参数且参数类型是一个array数组的时候,其值为array;

      
      	select * from tb_emp where empno in
      	
      		#{item}
      	
      
      
    • 如果传入的参数是多个的时候,我们需要将这些封装成一个Map

      
      	select * from tb_emp where empno in
      	
      		#{item}
      	
      
      
关注
打赏
1665409997
查看更多评论
立即登录/注册

微信扫码登录

0.1303s