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

本文介绍如何使用MyBatis的动态SQL特性提高查询效率,包括通过if和choose标签定制查询语句的方法,并提供了一个自关联的商品类型查询案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

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

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

在mapper.java中代码如下:

     public List<ItemsType> getItems(IntegerEntity ie);  //mapper接口中的方法
上面方法中的参数是一个包装类,里面封装了父类节点的ID属性(int型):

    //封装了父类型的ID
   public class IntegerEntity {
	public IntegerEntity(){}
	public IntegerEntity(int parentId){
		this.parentId=parentId;
	}
        private int parentId;

	public int getParentId() {
		return parentId;
	}

	public void setParentId(int parentId) {
		this.parentId = parentId;
	}
    
因为MyBatis中如果直接使用int类型的会报 there is no getter for property named propertyType in java.lang.Integer

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

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

<select id="getItems" parameterType="com.ipro.shopping.to.IntegerEntity" resultType="itemsType">
	   select * from itemsType
       <where>
          <!--方式一使用choose的方式查询-->
         <!-- <choose>
             <when test="parentId !=0 ">parentTypeId=#{parentId}</when>
             <when test="parentId==0">parentTypeId is null</when>
          </choose> -->
         <!--方式二使用if的方式查询-->
          <if test="parentId!=0">
             parentTypeId=#{parentId}
          </if>
          <if test="parentId==0">
            parentTypeId is null
          </if>
       </where>
	</select>
以上两种方式查询都能够得到正确的结果,语句中使用到的值是使用OGNL的方式传递的。设置好参数类型之后直接

使用ognl表达式就可以了!

个人总结,还请多多指!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值