mybatis association , collection 标签使用

本文详细介绍了MyBatis框架中如何通过resultMap进行一对一和一对多的关联映射,包括使用select属性动态加载关联对象和直接在内部定义关联对象的方式。通过对User和Record两个类的实例讲解,展示了如何在XML配置文件中实现复杂的数据映射。

##自己记录一下
#####定义User ,Record

public class User {
	private String user_id;
	private String user_name;
	private List<Record> recordList;
	private Record record;
}
public class Record {
	private String record_id;
	private String record_name;
}
<resultMap id="userMap" type="com.air.manager.pojo.agent.User">
		<id column="USER_ID" property="user_id" jdbcType="VARCHAR" />
		<result column="USER_NAME" property="user_name" jdbcType="VARCHAR" />

	    // 一、关联单个对象 association ,如果关联对象超过一个会报错	
        //方法1 使用select属性查找selectRecordByUserId去加载
		<association property="record" column="USER_ID" select="selectRecordByUserId"/>

        //方法2 直接在内部定义record属性
        <association property="record" javaType="com.air.manager.pojo.agent.Record" >
            <id column="RECORD_ID" property="record_id" jdbcType="VARCHAR" />
		    <result column="RECORD_NAME" property="record_name" jdbcType="VARCHAR" />
        </association >

        // 二、关联对象集合 collection
        //方法1 使用select属性查找selectRecordByUserId去加载
		<collection property="recordList" column="USER_ID" select="selectRecordByUserId"/>

        //方法2 直接在内部定义recordList集合 ,javaType="java.util.ArrayList"可以不添加
        <collection property="recordList" ofType="com.air.manager.pojo.agent.Record"  javaType="java.util.ArrayList" >
            <id column="RECORD_ID" property="record_id" jdbcType="VARCHAR" />
		    <result column="RECORD_NAME" property="record_name" jdbcType="VARCHAR" />
        </collection>
</resultMap>
<select id="queryList" resultMap="userMap">
		 SELECT 
			 T.USER_ID ,
			 T.USER_NAME
		 FROM KING_USER T 
</select>

<resultMap id="recordMap" type="com.air.manager.pojo.agent.Record">
		<id column="RECORD_ID" property="record_id" jdbcType="VARCHAR" />
		<result column="RECORD_NAME" property="record_name" jdbcType="VARCHAR" />
</resultMap>
	
<select id="selectRecordByUserId" resultMap="recordMap">
		SELECT  
         R.RECORD_ID,
         R.RECORD_NAME
    	FROM KING_RECORD R WHERE R.USER_ID=#{userId} //这里的userId名称可以随意,一样可以取到值
</select>
### MyBatisAssociationCollection 的区别及使用场景 在 MyBatis 中,`<association>` 和 `<collection>` 是两个重要的标签,用于处理复杂的关系映射。以下是它们的区别及其适用的使用场景。 #### 1. Association 的底层实现与使用场景 `<association>` 标签主要用于处理一对一和多对一的关系。它通过反射机制将数据库结果集中的字段映射到 Java 对象的属性中。当需要将一个单独的对象(如另一个实体类)嵌套到当前对象中时,使用 `<association>` 标签[^4]。 例如,假设有一个 `User` 类和一个 `Profile` 类,其中每个用户都有一个唯一的个人资料(一对一关系)。在这种情况下,可以使用 `<association>` 标签来映射 `Profile` 对象到 `User` 对象中。 ```xml <resultMap id="userResultMap" type="User"> <id property="id" column="user_id"/> <result property="name" column="user_name"/> <association property="profile" javaType="Profile"> <id property="id" column="profile_id"/> <result property="email" column="email"/> </association> </resultMap> ``` #### 2. Collection 的底层实现与使用场景 `<collection>` 标签主要用于处理一对多的关系。它通过缓存和反射机制将数据库结果集中的多个记录映射为集合类型的属性。当需要将一组对象(如列表或集合)嵌套到当前对象中时,使用 `<collection>` 标签[^4]。 例如,假设有一个 `Order` 类和一个 `OrderItem` 类,其中每个订单包含多个订单项(一对多关系)。在这种情况下,可以使用 `<collection>` 标签来映射 `OrderItem` 列表到 `Order` 对象中。 ```xml <resultMap id="orderResultMap" type="Order"> <id property="id" column="order_id"/> <result property="date" column="order_date"/> <collection property="items" ofType="OrderItem"> <id property="id" column="item_id"/> <result property="name" column="item_name"/> <result property="price" column="item_price"/> </collection> </resultMap> ``` #### 3. AssociationCollection 的主要区别 - **关系类型**:`<association>` 适用于一对一或多对一的关系,而 `<collection>` 适用于一对多的关系[^4]。 - **目标类型**:`<association>` 的目标是单个对象,而 `<collection>` 的目标是一个集合类型的属性(如 `List` 或 `Set`)[^2]。 - **配置参数**:两者都支持 `javaType` 和 `ofType` 属性,但 `javaType` 通常用于指定单个对象的类型,而 `ofType` 用于指定集合中元素的类型。 #### 4. 使用示例 以下是一个结合了 `<association>` 和 `<collection>` 的完整示例: ```xml <resultMap id="userWithOrdersResultMap" type="User"> <id property="id" column="user_id"/> <result property="name" column="user_name"/> <association property="profile" javaType="Profile"> <id property="id" column="profile_id"/> <result property="email" column="email"/> </association> <collection property="orders" ofType="Order"> <id property="id" column="order_id"/> <result property="date" column="order_date"/> <collection property="items" ofType="OrderItem"> <id property="id" column="item_id"/> <result property="name" column="item_name"/> <result property="price" column="item_price"/> </collection> </collection> </resultMap> ``` 在这个示例中: - `User` 对象包含一个 `Profile` 对象(一对一关系),因此使用 `<association>`。 - `User` 对象还包含一个 `Order` 列表(一对多关系),因此使用 `<collection>`。 - 每个 `Order` 对象包含一个 `OrderItem` 列表(一对多关系),因此再次使用 `<collection>`。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值