MyBatis动态SQL之一使用 if 标签和 choose标签

来源:互联网 发布:微分几何 知乎 编辑:程序博客网 时间:2024/06/05 09:19

转:http://blog.csdn.net/dukangcheng/article/details/50823598


        使用MyBatis写动态SQL查询相比Hiberntate是非常方便的。select不仅能够根据mapper接口中的返回值自动匹配

查询selectOne还是selectList,而且在查询中还可以灵活的定制查询的方式,添加if 或者 choose等标签进行查询。

        下面我们来看一看怎么通过这些标签灵活的定义查询的语句,最大限度的提升查询的效率:

         我以一个自关联的商品类型为例ItemsType类型为例,商品类型里面有一个父类型即parentType属性,现在就需要通过

父类型查询商品类型,返回的结果是一个List<ItemsType>的集合类型,也就是相当于一棵树的查询,根据父节点查询子节点

在mapper.Java中代码如下:

[html] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. public List<ItemsType> getItems(IntegerEntity ie);  //mapper接口中的方法  
上面方法中的参数是一个包装类,里面封装了父类节点的ID属性(int型):

[html] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1.    //封装了父类型的ID  
  2.   public class IntegerEntity {  
  3. public IntegerEntity(){}  
  4. public IntegerEntity(int parentId){  
  5.     this.parentId=parentId;  
  6. }  
  7.        private int parentId;  
  8.   
  9. public int getParentId() {  
  10.     return parentId;  
  11. }  
  12.   
  13. public void setParentId(int parentId) {  
  14.     this.parentId = parentId;  
  15. }  
  16.      
因为MyBatis中如果直接使用int类型的会报 there is no getter for property named propertyType in java.lang.Integer

的异常,所以使用了包装类来避免这样的情况发生。

所以在mapper.xml中查询的方式是:

[html] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. <select id="getItems" parameterType="com.ipro.shopping.to.IntegerEntity" resultType="itemsType">  
  2.        select * from itemsType  
  3.        <where>  
  4.           <!--方式一使用choose的方式查询-->  
  5.          <!-- <choose>  
  6.              <when test="parentId !=0 ">parentTypeId=#{parentId}</when>  
  7.              <when test="parentId==0">parentTypeId is null</when>  
  8.           </choose> -->  
  9.          <!--方式二使用if的方式查询-->  
  10.           <if test="parentId!=0">  
  11.              parentTypeId=#{parentId}  
  12.           </if>  
  13.           <if test="parentId==0">  
  14.             parentTypeId is null  
  15.           </if>  
  16.        </where>  
  17.     </select>  
以上两种方式查询都能够得到正确的结果,语句中使用到的值是使用OGNL的方式传递的。设置好参数类型之后直接

使用ognl表达式就可以了!

个人总结,还请多多指!


0 0
原创粉丝点击