Bootstrap

Spring Mvc那点事---(15)Spring Mvc之mybatis条件表达式

    mybatis像JAVA一样,也有条件表达式,例如if, foreach choose when等,使用条件表达式,可以根据不同的条件动态生成SQL语句,可以根据指定的条件进行查询,更新,删除操作。下面的例子我们演示根据商品编码和商品名称进行查询,如果商品编码不为空,我们根据商品编码进行查询。

  1. if条件表达式

   <!-- 根据SKU名称和编码进行查询 -->
     <select id="getSkuByCondition" parameterType='dto.skus' resultType='dto.skus'>
        SELECT s.Id,s.SkuName,s.SkuCode FROM skus s  where 1=1 
        <if test="SkuName!=null and SkuName!=''">
           and SkuName like #{SkuName}
        </if>
        <if test="SkuCode!='' and SkuCode!=null">
          and SkuCode=#{SkuCode}
        </if>
     </select>
    
  
SELECT s.Id,s.SkuName,s.SkuCode FROM skus s   WHERE s.SkuCode='00002'

	@RequestMapping(value="getSkuByCondition")
	public String getSkuByCondition()
	{
		   String resource = "/conf.xml";
	        //加载mybatis的配置文件
	        InputStream inputstream =this.getClass().getResourceAsStream(resource);
	       
	        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputstream);
	      
	        SqlSession session = sessionFactory.openSession();
	       
	        String statesql= "mapping.skusMapper.getSkuByCondition";//在skusMapper.xml中有命名空间+方法名
	        skus sku=new skus();
	        sku.setSkuCode("00002");//根据商品编码查询
	        java.util.List<skus> listResult= session.selectList(statesql,sku);
           session.close();
           for(dto.skus item:listResult)
           {
        	   System.out.println(item.getId()+"--"+item.getSkuCode()+"--"+item.getSkuName());
           
           }
	    	return "index";
	}
      此时生成的sql语句为
  SELECT s.Id,s.SkuName,s.SkuCode FROM skus s   WHERE s.SkuCode='00002'
        上面的例子通过where 1=1保证SQL语句能正常执行,如果我们不加 where 1=1,在根据商品编码进行查询的时候,SQL就会报错。在没有where 1=1的情况下,我们可以通过where 关键字来解决问题,如下

 2.   Where关键字

   <!-- 根据SKU名称和编码进行查询 -->
     <select id="getSkuByCondition" parameterType='dto.skus' resultType='dto.skus'>
        SELECT s.Id,s.SkuName,s.SkuCode FROM skus s 
        <where>
        <if test="SkuName!=null and SkuName!=''">
           and SkuName like #{SkuName}
        </if>
        <if test="SkuCode!='' and SkuCode!=null">
          and SkuCode=#{SkuCode}
        </if>
        </where>
     </select>
        当然,我们也可以使用trim关键字达到同样的效果,

  3.     Trim关键字

        trim 关键字有以下四个重要属性

        prefix 前缀关键字 ,prefixOverrides前缀关键字判断条件

        suffix 后缀关键字     suffixOverrides后缀关键字判断条件

        

   <!-- 根据SKU名称和编码进行查询 -->
     <select id="getSkuByCondition" parameterType='dto.skus' resultType='dto.skus'>
        SELECT s.Id,s.SkuName,s.SkuCode FROM skus s 
       <trim prefix="WHERE" prefixOverrides="AND |OR " >
        <if test="SkuName!=null and SkuName!=''">
           and SkuName like #{SkuName}
        </if>
        <if test="SkuCode!='' and SkuCode!=null">
          and SkuCode=#{SkuCode}
        </if>
       </trim>
     </select>
     
      上面的配置表示前缀关键字是where ,但是条件中必须有AND或者OR的时候才添加

      mybatis中还有另一种条件表达式。

4.    choose、when、otherwise

  <!-- 根据SKU名称和编码进行查询 -->
     <select id="getSkuByCondition" parameterType='dto.skus' resultType='dto.skus'>
        SELECT s.Id,s.SkuName,s.SkuCode FROM skus s 
         <trim prefix="WHERE" prefixOverrides="AND |OR " >
        <choose>
           <when test="SkuName!=null and SkuName!=''">
            and SkuName like #{SkuName}
           </when>
           <when test="SkuCode!='' and SkuCode!=null">
             and SkuCode=#{SkuCode}
           </when>
           <otherwise>
              and 1=1 
           </otherwise>
        </choose>
           </trim>
     </select>

5. set关键字

    set关键字主要用来进行更新操作。

 <update id="updateConditon" parameterType='dto.skus'>
        UPDATE skus 
        <set>
          skuname=#{SkuName}
        </set>
        where skucode=#{SkuCode}
     </update>
@RequestMapping(value="updateConditon")
	public String updateConditon()
	{
		   String resource = "/conf.xml";
	        //加载mybatis的配置文件
	        InputStream inputstream =this.getClass().getResourceAsStream(resource);
	       
	        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputstream);
	      
	        SqlSession session = sessionFactory.openSession();
	       
	        String statesql= "mapping.skusMapper.updateConditon";//在skusMapper.xml中有命名空间+方法名
	        
	        skus sku=new skus();
	        sku.setSkuName("黑色手表男士款式,经典系列限量版本");
	        sku.setSkuCode("00002");
	        
	        
	        int result = session.update(statesql, sku);
	        session.commit();
           session.close();
	        System.out.println(result);
	    	return "index";
	}

6.foreach关键字

  foreach主要用于循环动态生成SQL,有以下几个属性

  collection:循环的集合
index:索引
item:集合元素
open:开始符号
close:结束符号
separator:分隔符

  

   <!-- 根据SKU名称和编码进行查询 -->
     <select id="getSkuByCondition"  resultType='dto.skus'>
        SELECT s.Id,s.SkuName,s.SkuCode FROM skus s  where s.id in  
        <foreach item="item" index="index" collection="list"  open="(" separator="," close=")">
        ${item}
        </foreach>
     </select>
  
	@RequestMapping(value="getSkuByCondition")
	public String getSkuByCondition()
	{
		   String resource = "/conf.xml";
	        //加载mybatis的配置文件
	        InputStream inputstream =this.getClass().getResourceAsStream(resource);
	       
	        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputstream);
	      
	        SqlSession session = sessionFactory.openSession();
	       
	        String statesql= "mapping.skusMapper.getSkuByCondition";//在skusMapper.xml中有命名空间+方法名
	        /*skus sku=new skus();
	        sku.setSkuCode("00002");//根据商品编码查询
*/	        

	        ArrayList<Integer> list = new ArrayList<Integer>();
            list.add(1);
             list.add(4);
	        
	        java.util.List<skus> listResult= session.selectList(statesql,list);
           session.close();
           for(dto.skus item:listResult)
           {
        	   System.out.println(item.getId()+"--"+item.getSkuCode()+"--"+item.getSkuName());
           
           }
	    	return "index";
	}

下载 http://download.csdn.net/detail/zx13525079024/9546053

   

;