MyBatis 是一种优秀的持久层框架,它提供了一种灵活方便的方式来处理多表操作。多表查询中最常见的场景是多对一和一对多关系。接下来我们详细讲解 MyBatis 如何实现这两种关系的多表查询。
多对一查询
多对一查询通常是一个表中的多条数据对应另一个表中的一条数据。在 MyBatis 中实现多对一查询的步骤如下:
步骤一:建立实体类
我们需要建立两张表的实体类,并通过 Java 类的对象属性来表示多对一关系。
例如我们有两张表 user
和 account
,每个用户在 user
表中都会有一条记录,而每个用户还会有一条 account
记录,表示他的账户信息,那么我们可以建立以下两个实体类:
public class User {
private Integer id;
private String name;
private Account account;
// ...
}
public class Account {
private Integer id;
private String username;
private Double balance;
// ...
}
步骤二:建立 Mapper 接口
我们可以在 Mapper 接口中定义一个查询多对一关系的方法,使用 resultMap
映射返回结果。
public interface UserMapper {
List<User> getUserWithAccount();
}
在 XML 中,我们可以使用 resultMap
来定义多对一的关系。在 resultMap
中,我们需要定义关系字段,并指定它们在结果集中的对应关系。例如:
<resultMap id="userWithAccount" type="User">
<id property="id" column="id" />
<result property="name" column="name" />
<association property="account" javaType="Account">
<id property="id" column="account_id" />
<result property="username" column="username" />
<result property="balance" column="balance" />
</association>
</resultMap>
我们可以使用 association
来表示一个多对一的关系,指定对应的 Java 对象类型,以及关联键和字段映射。
步骤三:编写 SQL 语句
使用 MyBatis 的 XML 映射文件编写查询语句,并使用 resultMap
映射查询结果。
<select id="getUserWithAccount" resultMap="userWithAccount">
SELECT u.id, u.name, a.id AS account_id, a.username, a.balance
FROM user u
LEFT JOIN account a ON u.id = a.user_id
</select>
在 SQL 中,我们使用 LEFT JOIN
来连接两个表,保证即使没有对应的 account
记录,查询结果也不会出错。
示例
下面是一个具体的实现示例,假设我们有以下两张表:
user
id | name |
---|---|
1 | Alice |
2 | Bob |
3 | Charlie |
account
id | username | balance | user_id |
---|---|---|---|
1 | alice | 100 | 1 |
2 | bob | 200 | 2 |
3 | charlie | 300 | 3 |
对应的实体类代码如下:
public class User {
private Integer id;
private String name;
private Account account;
// getter 和 setter 略
}
public class Account {
private Integer id;
private String username;
private Double balance;
private Integer userId;
// getter 和 setter 略
}
我们可以在 XML 映射文件中编写以下查询方法:
<select id="getUserWithAccount" resultMap="userWithAccount">
SELECT u.id, u.name, a.id AS account_id, a.username, a.balance
FROM user u
LEFT JOIN account a ON u.id = a.user_id
</select>
<resultMap id="userWithAccount" type="User">
<id property="id" column="id" />
<result property="name" column="name" />
<association property="account" javaType="Account">
<id property="id" column="account_id" />
<result property="username" column="username" />
<result property="balance" column="balance" />
<result property="userId" column="user_id" />
</association>
</resultMap>
最后我们可以在代码中调用查询方法并输出结果:
List<User> users = sqlSession.selectList("getUserWithAccount");
for (User user : users) {
System.out.println(user.getName() + ": " + user.getAccount().getBalance());
}
输出结果为:
Alice: 100.0
Bob: 200.0
Charlie: 300.0
一对多查询
一对多查询通常是一个表中的一条数据对应另一个表中的多条数据。在 MyBatis 中实现一对多查询的步骤如下:
步骤一:建立实体类
我们需要建立两张表的实体类,并通过 Java 类的对象属性来表示一对多关系。
例如我们有两张表 user
和 order
,每个用户在 user
表中都会有一条记录,而每个用户还会有多条 order
记录,表示他的订单信息,那么我们可以建立以下两个实体类:
public class User {
private Integer id;
private String name;
private List<Order> orders;
// ...
}
public class Order {
private Integer id;
private Integer userId;
private Double amount;
// ...
}
步骤二:建立 Mapper 接口
我们可以在 Mapper 接口中定义一个查询一对多关系的方法,并使用 collection
来指定 Java 对象类型,以及关联键和字段映射关系。
public interface UserMapper {
List<User> getUserWithOrders();
}
<resultMap id="userWithOrders" type="User">
<id property="id" column="id" />
<result property="name" column="name" />
<collection property="orders" ofType="Order">
<id property="id" column="id" />
<result property="userId" column="user_id" />
<result property="amount" column="amount" />
</collection>
</resultMap>
步骤三:编写 SQL 语句
使用 MyBatis 的 XML 映射文件编写查询语句,并使用 resultMap
映射查询结果。
<select id="getUserWithOrders" resultMap="userWithOrders">
SELECT u.id, u.name, o.id, o.user_id, o.amount
FROM user u
LEFT JOIN order o ON u.id = o.user_id
</select>
在 SQL 中,我们使用 LEFT JOIN
来连接两个表,保证即使没有对应的 order
记录,查询结果也不会出错。
示例
下面是一个具体的实现示例,假设我们有以下两张表:
user
id | name |
---|---|
1 | Alice |
2 | Bob |
3 | Charlie |
order
id | user_id | amount |
---|---|---|
1 | 1 | 100 |
2 | 1 | 200 |
3 | 2 | 300 |
对应的实体类代码如下:
public class User {
private Integer id;
private String name;
private List<Order> orders;
// getter 和 setter 略
}
public class Order {
private Integer id;
private Integer userId;
private Double amount;
// getter 和 setter 略
}
我们可以在 XML 映射文件中编写以下查询方法:
<select id="getUserWithOrders" resultMap="userWithOrders">
SELECT u.id, u.name, o.id, o.user_id, o.amount
FROM user u
LEFT JOIN order o ON u.id = o.user_id
</select>
<resultMap id="userWithOrders" type="User">
<id property="id" column="id" />
<result property="name" column="name" />
<collection property="orders" ofType="Order">
<id property="id" column="id" />
<result property="userId" column="user_id" />
<result property="amount" column="amount" />
</collection>
</resultMap>
最后我们可以在代码中调用查询方法并输出结果:
List<User> users = sqlSession.selectList("getUserWithOrders");
for (User user : users) {
System.out.println(user.getName() + ":");
for (Order order : user.getOrders()) {
System.out.println(" " + order.getAmount());
}
}
输出结果为:
Alice:
100.0
200.0
Bob:
300.0
Charlie:
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:MyBatis如何实现多表查询(多对一、一对多) - Python技术站