阅读 62

MyBatis嵌套Collection传递常量(冷知识)

甲方的要求比较多,导致了前期设计出现了问题,一对多关系我们需要传递多个参数,真的很坑,还是那句话“实践出真知”,上干货

collection标签是用来处理“一对多”的关系,需要指定映射的Java实体类的属性,属性的javaType(一般为ArrayList,该属性可忽略),List中对象的类型ofType(Java实体类,泛型类型,必填项),MyBatis 可以用两种方式加载:

  • column方式:设置查询数据库表中的字段名称(==冷知识在这里产生==)
  • 自定义映射方式:使用连接查询,MyBatis通过id标签帮我们比较是否重复(或如果没有id标签,就是比较所有的result标签)

上述的关联映射我们都是掌握的,但是有的时候我们可能需要传递多个值的时候,就产生了我们想知道的知识点。


column方式的设置方式:

  • 常用写法:column="USER_NAME"
  • ==冷写法==:column="{userId=id,userName=user_name}"说明:value必须是外层查询的结果字段,必须得有,前面的key,你可以在子查询中作为条件参数去where

想要在MyBatis的collection关联查询中,添加一个常量:classifyId=1作为参数,原先使用的添加方式为

<collection property="classInfoList" column="{classId=class_id,classStatus='1'}"
            javaType="list"
            ofType="com.pangsir.model.ClassInfo"
            select="com.pangsir.mapper.ClassInfoMapper.getClassList">
</collection>
复制代码

==报错信息:会报找不到行:”1 “的错误==,代码修改如下

<resultMap id="studentList" type="com.pangsir.model.Student" >
    <!-- 如果设置column中的KEY,那么在select中执行SQL语句的时候,需要使用#{classId}或者#{classStatus}的方式 -->
    <collection property="classInfoList" column="{classId=class_id,classStatus=class_status}"
                javaType="list"
                ofType="com.pangsir.model.ClassInfo"
                 select="com.pangsir.mapper.ClassInfoMapper.getClassList">
    </collection>
    <!-- 如果只是传递一个字段,可以不用指定KEY,直接使用即可 column=role_id -->
    <collection property="role" column="{roleId=role_id}"
                javaType="list"
                ofType="com.pangsir.model.Role"
                select="com.pangsir.mapper.RoleMapper.loadRole">
    </collection>
</resultMap>
复制代码

基础的学生信息查询语句如下:

<select id="queryAaaVO" resultMap="aaaVO" parameterType="java.util.Map" >
    SELECT
    <include refid="base_Column_List" />,
    1 as class_status
    FROM student
    WHERE
    student_id=#{studentId,jdbcType=BIGINT}
</select>
复制代码

代码中我们增加了一列数据: 1 as class_status,然后将其作为变量在column属性中进行引用即可:classStatus=class_status