Mybatis 1对1的关联映射结果集

在MyBatis中,ResultMap被用于详细地描述如何从数据库的结果集映射到Java对象。这对于处理复杂的SQL查询和关联表格非常有用,因为它提供了一种灵活的方式来处理数据库列和Java对象属性之间的不匹配,以及数据嵌套。

ResultMap的基本元素

  • <id>:用来指定类的属性名,它对应表的主键列。MyBatis将使用这个作为对象的标识符。
  • <result>:用于指定一个非主键的字段映射。它将表的列映射到Java对象的属性上。
  • <association>:用于对象的关联映射,主要用于一对一的关系。例如,一个员工只属于一个部门。
  • <collection>:用于集合的映射,主要用于一对多的关系。例如,一个部门有多个员工。

解释<association>标签

<association>元素在ResultMap中表示一个关联的对象,通常是多对一的关系。在您提供的例子中,<association>应该是用于将员工对象(Emp)与其所属部门的对象(Dept)关联起来。

让我们分解这个<association>标签:

  • property:这是Java对象中的属性名,它将保存关联对象的实例。
  • javaType:关联对象的Java类型。
  • column:这是传递给关联查询的参数值的列名,在这个例子中应该是员工表中的部门编号。
  • select:这个属性指定了获取关联对象的查询的id。这意味着MyBatis将使用这个查询来填充property指定的对象属性。

实际应用

xmlCopy code<!-- 员工的ResultMap,包括其关联的部门 -->
<resultMap id="empMap" type="Emp">
    <id property="id" column="emp_id"/>
    <result property="name" column="emp_name"/>
    <result property="job" column="emp_job"/>
    <!-- ...其他员工属性的映射... -->

    <!-- 定义如何加载关联的部门对象 -->
    <association property="dept" javaType="Dept" select="selectDeptByEmpId" column="dept_id"/>
</resultMap>

<!-- 选择部门的查询 -->
<select id="selectDeptByEmpId" resultType="Dept">
    SELECT * FROM dept WHERE dept_id = #{deptId}
</select>

<!-- 查询特定员工及其关联的部门 -->
<select id="findEmpByEmpNo" parameterType="int" resultMap="empMap">
    SELECT * FROM emp WHERE emp_no = #{empNo}
</select>

在这个例子中:

  1. 当调用findEmpByEmpNo查询时,MyBatis会执行查询并将结果集映射到Emp对象。
  2. 对于Emp对象中的dept属性,MyBatis将查找selectDeptByEmpId查询。
  3. MyBatis将dept_id列的值作为参数传递给selectDeptByEmpId查询,获取相应的Dept对象。
  4. 最后,MyBatis会把查询到的Dept对象设置到Emp对象的dept属性中。

这种方式允许延迟加载关联对象,因为select查询可以在需要的时候才执行,而不是在原始查询执行时立即加载,这可以提高性能并减少不必要的数据库访问。

猜你喜欢

转载自blog.csdn.net/Johnor/article/details/134783798
今日推荐