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”作为键 。
推荐阅读
- 七个对 Web 开发人员有用的资源
- 你必须知道的常用的足够简练的 11 个 Python代码
- 译文 面向 Web 开发人员的 50 多个 ChatGPT 提示
- Linux初学者在学习中常见的困惑
- C#控制台程序如何创建不需要IIS托管的HTTP Rest API
- JavaScript 的 Anti-Debugging 技術
- 工厂模式:将对象的创建与使用分离,提高程序可维护性和可扩展性
- 从不同维度分析:Linux与Windows的区别
- 你应该知道的18个Python函数
- 周冬雨|周冬雨戛纳造型惨遭网友嫌弃,网友言语粗鄙,但说的好有道理!