Mybatis中的映射结果resutType和resultMap
需求:查询订单信息, 关联查询用户信息
分析:共有订单表和用户表两张表,其中订单表是主表,用户表是从表
关系:一个订单对应着一个用户,从订单到用户是一对一, 从订单到用户是一对一的关联关系
sql:
1
2
3
4
5
6
7
8
|
SELECT orders.* USER.username, USER.sex, USER.address FROM orders, USER |
POJO类:
Orders.java:
1
2
3
4
|
private Integer id; private String orderName; private Date crateTime; 加上 getter/setter 方法 |
User.java:
1
2
3
4
5
6
|
private Integer id; private String username; private String password; private String sex; private String address; 加上 getter/setter 方法 |
(一) 使用resultType实现
为了系统的可扩展性, 需要另外创建一个POJO类的扩展类(扩展类是继承订单POJO还是用户POJO,具体看SQL语句的查询列中查询出来的字段在哪个POJO中占得多, 哪个映射的字段多扩展类就继承哪个POJO类),这里就继承Orders类了,当然继承User类也是可以的:
OrdersUser.java: (这个类将是resultType的映射结果类型)
1
2
3
4
5
6
7
|
public class OrdersUser extends Orders { // 继承这个类,Orders类中的属性全都有了 // 把User的查询列字段加上 private String username; private String sex; private String address; 加上 getter/setter 方法 } |
Mapper接口(这里使用的是动态代理接口),OrdersUserMapper.java:
1
2
3
|
public interface OrdersUserMapper { List<OrdersUser> findOrdersUser() throws Exception(); } |
Mapper接口对应的映射文件, OrdersUserMapper.xml:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
<?xml version= "1.0" encoding= "UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > <mapper namespace= "包.OrdersUserMapper" > <select id= "findOrdersUser" resultType= "包.OrdersUser" > SELECT orders.* USER.username, USER.sex, USER.address FROM orders, USER </select> </mapper> |
(二) 使用resultMap实现
POJO类:直接在Orders.java类中添加User对象属性,比如:
Orders.java:
1
2
3
4
5
6
|
private Integer id; private String orderName; private Date createTime; private User user; // 这里直接引入User对象属性 加上 getter/setter 方法 |
Mapper接口, OrdersUserMapper.xml:
1
2
3
|
public interface OrdersUserMapper { List<Orders> findOrdersUser() throws Exception(); } |
Mapper映射文件(要和Mapper接口同名且在同一个目录下),OrdersUserMapper.xml:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
<?xml version= "1.0" encoding= "UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > <mapper namespace= "包.OrdersUserMapper" > <resultMap id= "findOrdersUserResultMap" type= "包.Orders" > <!-- 映射的Orders类的属性 --> <id column= "id" property= "id" /><!-- USER表字段列的唯一标识 --> <result column= "order_name" property= "orderName" /> <result column= "create_time" property= "createTime" /> <!-- 关联映射的User类的属性 --> <association property= "user" javaType= "包.User" > <id column= "id" /><!-- orders表字段列的唯一标识 --> <result column= "username" property= "username" /> <result column= "sex" property= "sex" /> <result column= "address" property= "address" /> </association> </resultMap> <select id= "findOrdersUser" resultMap= "findOrdersUserResultMap" > SELECT orders.* USER.username, USER.sex, USER.address FROM orders, USER </select> </mapper> |
------------<完>---------------------------------------------------------------------------------
以上是一对一, 下面是一对多的关联关系的映射
需求:查询订单关联查询订单明细的信息
分析:有两张表,订单表orders表和订单明细表ordersdetail
关系:一个订单对应多个订单明细, 从订单到订单明细是一对多的关联关系
用户表和订单表有关系, 订单表和订单明细表有关系, 订单表是中间表
做法:在以上一对一的基础上添加订单明细的映射即可
sql:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
SELECT orders.* USER.username, USER.sex, USER.address, orderdetail.items_id, orderdetail.items_num FROM orders, USER ordersdetail WHERE orders.user_id=user.id AND orderdetail.orders_id=orders.id |
在Orders.java中添加List<OrderDetail> orderDetails
接下的做法请参考:http://www.cnblogs.com/josephcnblog/articles/6442030.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义