<association> 是 mybatis 中处理一对一或一对多关系的映射元素,用于将查询结果中的嵌套数据映射到 java 对象的属性中。它常用于表示对象之间的关联关系,尤其是在复杂的数据库查询结果需要映射为嵌套对象时。
1. 作用与用途
- 一对一关系:当一个对象包含一个关联对象时(例如,一个
user只对应一个address),可以使用<association>映射一对一关系。 - 一对多关系:当一个对象包含多个关联对象时(例如,一个
org对应多个user),可以使用<association>映射一对多关系。 - 多级嵌套映射:当查询涉及多个关联对象时,
<association>可以帮助将查询结果自动填充到 java 对象中,避免手动编写复杂的映射代码。
2. <association> 基本用法
property:java 对象中用于存储关联对象的属性名。resultmap:指定一个resultmap,指明如何将查询结果中的字段映射到该关联对象。columnprefix:为数据库列加上前缀,避免列名冲突。
3. 示例说明:一对一与一对多映射
假设有两个实体:user 和 address,以及 org 和多个 user,我们分别演示如何使用 <association> 进行一对一和一对多的映射。
4. 示例 1:一对一关联映射
数据表结构
假设数据库中有两张表:users 和 address。
users 表:存储用户信息
| user_id | user_name |
|---|---|
| 1 | alice |
| 2 | bob |
address 表:存储地址信息
| address_id | user_id | street | city |
|---|---|---|---|
| 1 | 1 | 123 main | nyc |
| 2 | 2 | 456 elm | la |
1.1 定义 java 类
// user.java
public class user {
private int id;
private string name;
private address address; // 一对一关联
// getters and setters
}
// address.java
public class address {
private int id;
private string street;
private string city;
// getters and setters
}
1.2 创建 resultmap
<!-- address resultmap -->
<resultmap id="addressresultmap" type="com.example.address">
<result property="id" column="address_id"/>
<result property="street" column="street"/>
<result property="city" column="city"/>
</resultmap>
<!-- user resultmap -->
<resultmap id="userresultmap" type="com.example.user">
<id property="id" column="user_id"/>
<result property="name" column="user_name"/>
<association property="address" resultmap="addressresultmap"/>
</resultmap>
1.3 sql 查询
<select id="finduserwithaddress" resultmap="userresultmap">
select u.user_id, u.user_name, a.address_id, a.street, a.city
from users u
left join address a on u.user_id = a.user_id
where u.user_id = #{userid}
</select>
1.4 结果映射
如果查询 user_id=1,返回如下数据:
| user_id | user_name | address_id | street | city |
|---|---|---|---|---|
| 1 | alice | 1 | 123 main | nyc |
结果会映射为:
user user = new user();
user.setid(1);
user.setname("alice");
address address = new address();
address.setid(1);
address.setstreet("123 main");
address.setcity("nyc");
user.setaddress(address);
5. 示例 2:一对多关联映射
数据表结构
假设有两张表:org 和 users。
org 表:存储组织信息
org_id org_name 101 finance 102 hr users 表:存储用户信息
user_id user_name org_id 1 alice 101 2 bob 101 3 carol 102
2.1 定义 java 类
// user.java
public class user {
private int userid;
private string username;
// getters and setters
}
// org.java
public class org {
private int orgid;
private string orgname;
private list<user> users; // 一对多关联
// getters and setters
}
2.2 创建 resultmap
<!-- user resultmap -->
<resultmap id="userresultmap" type="com.example.user">
<result property="userid" column="user_id"/>
<result property="username" column="user_name"/>
</resultmap>
<!-- org resultmap -->
<resultmap id="orgresultmap" type="com.example.org">
<result property="orgid" column="org_id"/>
<result property="orgname" column="org_name"/>
<association property="users" resultmap="userresultmap"/>
</resultmap>
2.3 sql 查询
<select id="findorgwithusers" resultmap="orgresultmap">
select o.org_id, o.org_name, u.user_id, u.user_name
from org o
left join users u on o.org_id = u.org_id
</select>
2.4 结果映射
查询返回结果:
| org_id | org_name | user_id | user_name |
|---|---|---|---|
| 101 | finance | 1 | alice |
| 101 | finance | 2 | bob |
| 102 | hr | 3 | carol |
会映射为:
list<org> orgs = new arraylist<>();
// org 1
org org1 = new org();
org1.setorgid(101);
org1.setorgname("finance");
user user1 = new user();
user1.setuserid(1);
user1.setusername("alice");
user user2 = new user();
user2.setuserid(2);
user2.setusername("bob");
org1.setusers(arrays.aslist(user1, user2));
// org 2
org org2 = new org();
org2.setorgid(102);
org2.setorgname("hr");
user user3 = new user();
user3.setuserid(3);
user3.setusername("carol");
org2.setusers(arrays.aslist(user3));
// 添加到列表
orgs.add(org1);
orgs.add(org2);
6. 总结
<association>用途:- 一对一关系:通过
<association>映射一个对象到另一个对象的属性。 - 一对多关系:通过
<association>映射多个对象到一个集合属性。 - 嵌套结果映射:支持多级嵌套查询,将复杂的查询结果映射为多层嵌套的 java 对象。
- 一对一关系:通过
常用属性:
property:指定要填充的 java 类属性。resultmap:指向用于处理该关联对象映射的resultmap。columnprefix:给数据库列名加前缀,避免列名冲突。
查询结果映射:
<association>会根据查询返回的结果自动将嵌套对象填充到 java 对象中,简化了复杂的查询结果的处理。
通过合理使用 <association>,你可以轻松地处理一对一和一对多的对象关系,避免手动编写复杂的结果映射代码,提升代码的可维护性和可读性。
到此这篇关于mybatis中一对一、一对多的<association> 配置使用的文章就介绍到这了,更多相关mybatis 一对一、一对多配置内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论