MyBatis的10种用法( 三 )

if + set实现修改语句当update语句中没有使用if标签时,如果有一个参数为null,都会导致错误 。当在update语句中使用if标签时,如果前面的if没有执行,则或导致逗号多余错误 。使用set标签可以将动态的配置SET 关键字,和剔除追加到条件末尾的任何不相关的逗号 。使用if+set标签修改后,如果某项为null则不进行更新,而是保持数据库原值 。如下示例:
<!-- 4 if/set(判断参数) - 将实体类不为空的属性更新 --><update id="updateStudent_if_set" parameterType="liming.student.manager.data.model.StudentEntity">UPDATE STUDENT_TBL<set><if test="studentName != null and studentName != '' ">STUDENT_TBL.STUDENT_NAME = #{studentName},</if><if test="studentSex != null and studentSex != '' ">STUDENT_TBL.STUDENT_SEX = #{studentSex},</if><if test="studentBirthday != null ">STUDENT_TBL.STUDENT_BIRTHDAY = #{studentBirthday},</if><if test="studentPhoto != null ">STUDENT_TBL.STUDENT_PHOTO = #{studentPhoto, javaType=byte[], jdbcType=BLOB, typeHandler=org.apache.ibatis.type.BlobTypeHandler},</if><if test="classId != '' ">STUDENT_TBL.CLASS_ID = #{classId}</if><if test="placeId != '' ">STUDENT_TBL.PLACE_ID = #{placeId}</if></set>WHERE STUDENT_TBL.STUDENT_ID = #{studentId};</update>if + trim代替where/set标签trim是更灵活的去除多余关键字的标签,他可以实现where和set的效果 。
trim代替where<!-- 5.1if/trim代替where(判断参数) -将实体类不为空的属性作为where条件--><select id="getStudentList_if_trim" resultMap="resultMap_studentEntity">SELECT ST.STUDENT_ID,ST.STUDENT_NAME,ST.STUDENT_SEX,ST.STUDENT_BIRTHDAY,ST.STUDENT_PHOTO,ST.CLASS_ID,ST.PLACE_IDFROM STUDENT_TBL ST<trim prefix="WHERE" prefixOverrides="AND|OR"><if test="studentName !=null ">ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName, jdbcType=VARCHAR}),'%')</if><if test="studentSex != null and studentSex != '' ">AND ST.STUDENT_SEX = #{studentSex, jdbcType=INTEGER}</if><if test="studentBirthday != null ">AND ST.STUDENT_BIRTHDAY = #{studentBirthday, jdbcType=DATE}</if><if test="classId != null and classId!= '' ">AND ST.CLASS_ID = #{classId, jdbcType=VARCHAR}</if><if test="classEntity != null and classEntity.classId !=null and classEntity.classId !=' ' ">AND ST.CLASS_ID = #{classEntity.classId, jdbcType=VARCHAR}</if><if test="placeId != null and placeId != '' ">AND ST.PLACE_ID = #{placeId, jdbcType=VARCHAR}</if><if test="placeEntity != null and placeEntity.placeId != null and placeEntity.placeId != '' ">AND ST.PLACE_ID = #{placeEntity.placeId, jdbcType=VARCHAR}</if><if test="studentId != null and studentId != '' ">AND ST.STUDENT_ID = #{studentId, jdbcType=VARCHAR}</if></trim></select>trim代替set<!-- 5.2 if/trim代替set(判断参数) - 将实体类不为空的属性更新 --><update id="updateStudent_if_trim" parameterType="liming.student.manager.data.model.StudentEntity">UPDATE STUDENT_TBL<trim prefix="SET" suffixOverrides=","><if test="studentName != null and studentName != '' ">STUDENT_TBL.STUDENT_NAME = #{studentName},</if><if test="studentSex != null and studentSex != '' ">STUDENT_TBL.STUDENT_SEX = #{studentSex},</if><if test="studentBirthday != null ">STUDENT_TBL.STUDENT_BIRTHDAY = #{studentBirthday},</if><if test="studentPhoto != null ">STUDENT_TBL.STUDENT_PHOTO = #{studentPhoto, javaType=byte[], jdbcType=BLOB, typeHandler=org.apache.ibatis.type.BlobTypeHandler},</if><if test="classId != '' ">STUDENT_TBL.CLASS_ID = #{classId},</if><if test="placeId != '' ">STUDENT_TBL.PLACE_ID = #{placeId}</if></trim>WHERE STUDENT_TBL.STUDENT_ID = #{studentId}</update>foreach对于动态SQL 非常必须的,主是要迭代一个集合,通常是用于IN 条件 。List 实例将使用“list”做为键,数组实例以“array” 做为键 。
foreach元素是非常强大的,它允许你指定一个集合,声明集合项和索引变量,它们可以用在元素体内 。它也允许你指定开放和关闭的字符串,在迭代之间放置分隔符 。这个元素是很智能的,它不会偶然地附加多余的分隔符 。
注意:你可以传递一个List实例或者数组作为参数对象传给MyBatis 。当你这么做的时候,MyBatis会自动将它包装在一个Map中,用名称在作为键 。List实例将会以“list”作为键,而数组实例将会以“array”作为键 。


推荐阅读