MyBatis `<include refid="XXX">`标签详解

发布时间 2023-11-27 14:48:46作者: Bunnyfufuu666

MyBatis <include refid="XXX">标签详解

MyBatis作为一种优秀的持久化框架,提供了丰富的XML配置选项,其中<include>标签是一个非常有用的特性,用于引入SQL片段,提高代码的可维护性和可读性。

解释

  • <include>标签用于引用SQL代码片段。
  • refid是引用的SQL片段的id名称,必须保持唯一。

作用

  • 避免重复编写相同的SQL片段,提高代码复用性。
  • 方便后期维护,当需要修改SQL片段时,只需修改片段的定义,而不必修改每个引用该片段的地方。
  • 在SQL语句中明确指定字段,而不使用*通配符,有助于提高代码效率。

代码示例

<sql id="Student_Column_List" >
    studentID, studentName, studentAge, studentEmail, studentComment
</sql> 

<select id="selectByPrimaryKey" resultMap="com.rr.dto.StudentDto" parameterType="java.lang.Long">
    select 
    <include refid="Student_Column_List" />
    from t_student
    where studentID = #{studentID, jdbcType=BIGINT}
</select>

返回自增id

在插入操作中,如果需要返回自增id,可以使用以下方式:

<insert id="insertSelective" parameterType="cn.tencent.eee.aaa.dao.model.User" useGeneratedKeys="true" keyProperty="id">
    <!-- 插入操作的具体语句 -->
</insert>

注意:

  1. 通过以上方式获取自增id时,会直接赋值到领域模型的实体id中,可以通过实体对象的id属性获取。

    Integer i = user.getId;
    if(userMapper.insertSelective(user) > 0){
       i = user.getId;
    }
    
  2. 如果<insert>标签包含多条insert语句,返回的自增id将是最后一条insert语句生成的id。

动态排序示例

SELECT 
    name, sex, age, user_grade as userGrade
FROM user
<if test="orderField != null" >
    ORDER BY
    <choose>
        <when test="orderField == 'name'">
            name ${orderType}
        </when>
        <when test="orderField == 'age'">
            age ${orderType}
        </when>
        <when test="orderField == 'userGrade'">
            user_grade ${orderType}
        </when>
        <otherwise>
            create_time ${orderType}
        </otherwise>
    </choose>
</if>

上述示例中,使用<choose><when>标签根据传入的参数进行动态排序,提高了查询灵活性。

注意: mapper接口和xml包名要保持一致,以免出现扫描不到的问题。这是一个常见的错误,容易被忽视。