MyBatis动态SQL学习

MyBatis动态SQL学习


if标签

如果studentName是null或空字符串,此语句很可能报错或查询结果为空。

此时我们使用if动态sql语句先进行判断,如果值为null或等于空字符串,我们就不进行此条件的判断。

	<!-- 查询学生list,like姓名 -->     
	<select id="getStudentListLikeName" parameterType="StudentEntity" resultMap="studentResultMap"> 
    		SELECT * from STUDENT_TBL ST       
		WHERE ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName}),'%')
	</select>

此时,当studentName的值为null或’’的时候,我们并不进行where条件的判断,
所以当studentName值为null或’’值,不附带这个条件,所以查询结果是全部。
由于参数是Java的实体类,所以我们可以把所有条件都附加上,使用时比较灵活, 
new一个这样的实体类,我们需要限制那个条件,只需要附上相应的值就会where这个条件,相反不去赋值就可以不在where中判断。

	<!-- 查询学生list,like姓名,=性别、=生日、=班级,使用where,参数entity类型 --> 
	<select id="getStudentListWhereEntity" parameterType="StudentEntity" resultMap="studentResultMap"> 
    	  SELECT * from STUDENT_TBL ST  
	   	  <where> 
		   <if test="studentName!=null and studentName!='' "> 
		   ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName}),'%')  
		   </if> 
		   <if test="studentSex!= null and studentSex!= '' "> 
		   AND ST.STUDENT_SEX = #{studentSex}  
		   </if> 
		   <if test="studentBirthday!=null"> 
		   AND ST.STUDENT_BIRTHDAY = #{studentBirthday}  
		   </if> 
		   <if test="classEntity!=null and classEntity.classID !=null and classEntity.classID!='' "> 
		   AND ST.CLASS_ID = #{classEntity.classID}  
		   </if> 
		   </where> 
	</select> 

set 和 trim标记的使用 
和之前的where一样,set和trim也是智能标记 
在之前的user.xml中添加

	<update id="updateUserSet" parameterType="User">
		update User
		<set>
			<if test="userName != null">userName=#{userName},</if>
			<if test="password != null">password=#{password},</if>
		</set>
		where id=#{id}
	</update>

运行,执行的SQL语句是 update User SET userName=?, password=? where id=?
set 自动识别并把sql语句中第二个逗号去掉的。此时数据库user表中id为10的username和password都被修改了。


//trim

trim标识为格式化标识,可以与其他标识完成where和set的功能
prefix  前缀增加   suffix  后缀增加    prefixOverrides 自动判断前置   suffixOverrides 自动判断后置
接着来测试一下,在user.xml中添加

		<update id="updateUserTrim" parameterType="User">
		UPDATE User 
      		<trim prefix="SET" suffixOverrides="," suffix="WHERE id = #{id}" >  
	    		<if test="userName != null and userName != '' ">  
            			userName = #{userName},
       	 		</if>
        		<if test="password != null and password != '' ">  
             			password=#{password},
        		</if>  
	  	</trim>

与上面的set语句对比,prefix="SET" 是为SQL语句设置前缀,suffixOverrides是自动判断后缀 ","  
suffix="WHERE id = #{id}" 是自动在加上后缀
运行,执行的SQL代码还是UPDATE User SET userName = ?, password=? WHERE id = ? 
代替where的就是添加 prefix="where"  prefixOverrides="and|or"  trim就会自动的添加前缀where和自动识别和去掉不用的and或or

以下是不熟悉组合运用时分开的写法

    <insert id="insertByValue" parameterType="com.entity.TConsumableInfoEntity">
        INSERT INTO
            ga_dm.t_consumable_info
            (
              <trim suffixOverrides=",">
                  consumable_info_no,
                  <if test="machineSn != null">machine_sn,</if>
                  <if test="swVer != null">sw_ver,</if>
                  <if test="insertDatetime != null">insert_datetime,</if>
                  <if test="updateDatetime != null">update_datetime,</if>
              </trim>
            )
        VALUES
            (
              <trim suffixOverrides=",">
                  #{consumableInfoNo},
                  <if test="machineSn != null">#{machineSn},</if>
                  <if test="swVer != null">#{swVer},</if>
                  <if test="insertDatetime != null">#{insertDatetime},</if>
                  <if test="updateDatetime != null">#{updateDatetime},</if>
              </trim>
            )
        ;
    </insert>

    <update id="updateByPK" parameterType="com.entity.TConsumableInfoEntity">
        UPDATE
            ga_dm.t_consumable_info
        SET
            <trim suffixOverrides=",">
                <if test="update.machineSn != null">machine_sn = #{update.machineSn},</if>
                <if test="update.machineSn == null">machine_sn = NULL,</if>
                <if test="update.swVer != null">sw_ver = #{update.swVer},</if>
                <if test="update.updateDatetime == null">update_datetime = NULL,</if>
            </trim>
        WHERE
            consumable_info_no = #{search.consumableInfoNo}
        ;
    </update>

    <update id="updateByValue" parameterType="com.entity.TConsumableInfoEntity">
        UPDATE
            ga_dm.t_consumable_info
        <set>
            <if test="update.machineSnNullFlag == true">machine_sn = NULL,</if>
            <if test="update.machineSnNullFlag == false"><if test="update.machineSn != null">machine_sn = #{update.machineSn},</if></if>
            <if test="update.swVerNullFlag == true">sw_ver = NULL,</if>
            <if test="update.swVerNullFlag == false"><if test="update.swVer != null">sw_ver = #{update.swVer},</if></if>
            <if test="update.consumableStartDatetimeNullFlag == true">consumable_start_datetime = NULL,</if>
            <if test="update.updateDatetimeNullFlag == true">update_datetime = NULL,</if>
            <if test="update.updateDatetimeNullFlag == false"><if test="update.updateDatetime != null">update_datetime = #{update.updateDatetime},</if></if>
        </set>
        WHERE
            consumable_info_no = #{search.consumableInfoNo}
        ;
    </update>


============

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值