【mybatis】各种查询方式 。技能 get
mybatis:一对一实现【扩展类】----》
复杂查询时,单表对应的po类已不能满足输出结果集的映射。所以要根据需求建立一个扩展类来作为resultType的类型。
------
上xml代码:
<select id="findOrderById" parameterType="int" resultType="ordersExt"> SELECT o.*,u.username,u.address FROM orders o,user u WHERE o.user_id = u.id AND o.id = #{id} </select>
mybatis:一对一实现【模型里有模型】---》使用association和javaType
需求:要查订单信息里的用户信息。
在order模型里加入一个user模型,再给他get、set方法。
在写orderMapper的时候,只需要返回Orders模型即可~
上xml代码:
注意:association标签下的column字段是对应mysql表的字段,而property字段是对应模型类的属性。模型里有模型,使用association标签,javaType表示对应哪个模型,而property表示在orders表里的user属性字段。
<!-- =============== 一对一 =================--> <!--如果模型里有模型,使用resultMap--> <resultMap id="orderRslMap" type="orders"> <!-- 往orders的模型匹配数据--> <id column="id" property="id"></id> <id column="note" property="note"></id> <id column="number" property="number"></id> <id column="createtime" property="createtime"></id> <!-- 往orders的user匹配数据 模型里有模型,使用association来配置--> <association property="user" javaType="user"> <id column="user_id" property="id"></id> <id column="username" property="username"></id> <id column="address" property="address"></id> </association> </resultMap>
mybatis:一对多实现【模型里有集合】---》使用collection和ofType
需求:根据订单Id查找订单信息、用户信息和订单明细信息。
上模型代码:在orders模型里增加 orderDetails 字段,它是一个集合。一个订单里面包含多个订单详情。
public class Orders { private Integer id; private Integer user_id; private String note;//备注 private String number; private Date createtime;//写意的创建时间 private User user;//定单所属的用户 /* 一对多数据封装*/ private List<OrderDetail> orderDetails; public List<OrderDetail> getOrderDetails() { return orderDetails; } public void setOrderDetails(List<OrderDetail> orderDetails) { this.orderDetails = orderDetails; }
上xml代码:
<!-- ================一对多==================--> <resultMap id="orderRslMap3" type="orders"> <!-- 往orders的模型匹配数据--> <id column="id" property="id"></id> <id column="note" property="note"></id> <id column="number" property="number"></id> <id column="createtime" property="createtime"></id> <!-- 往orders的user匹配数据 模型里有模型,使用association来配置--> <association property="user" javaType="user"> <id column="user_id" property="id"></id> <id column="username" property="username"></id> <id column="address" property="address"></id> </association> <!-- 一对多匹配: 往orders的orderdetails 匹配数据 注意:集合里类型使用ofType,而不javaType --> <collection property="orderDetails" ofType="orderDetail"> <id column="detail_id" property="id"></id> <id column="items_id" property="itemsId"></id> <id column="items_num" property="itemsNum"></id> </collection> </resultMap> <select id="findOrderById3" parameterType="int" resultMap="orderRslMap3"> SELECT o.*, u.username, u.address, od.id detail_id, od.items_id, od.items_num FROM orders o, user u, orderdetail od WHERE o.user_id = u.id AND o.id = od.orders_id AND o.id = #{id} </select>
mybatis:多对多实现【模型里有集合,集合里面有模型等等情况都可能】---》使用collection和ofType
需求:查询用户信息和用户购买的商品信息,要求将关联信息映射到主pojo的pojo属性中
sql查询结果:
sql查询结果:建一等式,查四张表就有三个等式。(user,orders,orderdetail,item四张表)
分析:
上xml代码:
<!-- ==============查询用户信息及用户购买的商品信息============--> <resultMap id="userRslMap" type="user"> <!-- 1.匹配user属性 --> <id column="id" property="id"></id> <result column="username" property="username"/> <result column="password" property="password"/> <!--2.匹配user的orderList--> <collection property="orderList" ofType="orders"> <id column="order_id" property="id"></id> <result column="number" property="number"/> <result column="createtime" property="createtime"/> <result column="note" property="note"/> <!-- 3.匹配Orders里有orderDetails--> <collection property="orderDetails" ofType="orderDetail"> <id column="detail_id" property="id"></id> <result column="items_id" property="itemsId"/> <result column="items_num" property="itemsNum"/> <!-- 4.配置定单详情的商品信息--> <association property="items" javaType="items"> <id column="items_id" property="id"/> <result column="name" property="name"/> <result column="price" property="price"/> <result column="detail" property="detail"/> </association> </collection> </collection> </resultMap> <select id="findUserAndOrderInfo" resultMap="userRslMap"> SELECT u.id, u.username, u.address, o.id order_id, o.number, o.createtime, o.note, od.id detail_id, od.items_id, od.items_num, it.name, it.price, it.detail FROM user u, orders o, orderdetail od, items it WHERE o.user_id = u.id AND o.id = od.orders_id AND od.items_id = it.id </select>
建测试类模拟查询:
/** * 多对多 * @throws IOException */ @Test public void test9() throws IOException { UserMapper mapper = session.getMapper(UserMapper.class); List<User> users = mapper.findUserAndOrderInfo(); for (User user : users){ System.out.println("用户信息:" + user); for (Orders order : user.getOrderList()){ System.out.println("定单信息:" + order); System.out.println("订单详情:"); for (OrderDetail od : order.getOrderDetails()){ System.out.println(od + ":" + od.getItems()); } System.out.println("------------------------------"); } } }
查询结果:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?