内容简介:mybatis教程--一对多查询
一、 一对多查询
1.1 需求
查询所有订单信息及订单下的订单明细信息。
1.2 sql 语句
这里我们需要查询的表有订单表和订单详情表
主查询表:订单表
关联查询表:订单明细
SELECT orders.*, user.username, user.sex , orderdetail.id orderdetail_id, orderdetail.items_num, orderdetail.items_id FROM orders, USER, orderdetail WHERE orders.user_id = user.id AND orders.id = orderdetail.orders_id
1.3 resultMap 进行一对多映射思路
resultMap 提供 collection 完成关联信息映射到集合对象中。
在 orders 类中创建集合属性:
package com.sihai.mybatis.po;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
public class Orders implements Serializable {
private Integer id;
private Integer userId;
private String number;
private Date createtime;
private String note;
//关联用户信息
private User user;
//订单明细
private List<Orderdetail> orderdetails;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number == null ? null : number.trim();
}
public Date getCreatetime() {
return createtime;
}
public void setCreatetime(Date createtime) {
this.createtime = createtime;
}
public String getNote() {
return note;
}
public void setNote(String note) {
this.note = note == null ? null : note.trim();
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public List<Orderdetail> getOrderdetails() {
return orderdetails;
}
public void setOrderdetails(List<Orderdetail> orderdetails) {
this.orderdetails = orderdetails;
}
}
1.4mapper.xml
我们在mapper.xml文件中创建select语句,其中需要用到resultMap,在下面我们将会介绍。
<!-- 一对多查询使用reusltMap完成 查询订单关联查询订单明细 --> <select id="findOrderAndOrderDetails" resultMap="orderAndOrderDetails" > SELECT orders.*, user.username, user.sex , orderdetail.id orderdetail_id, orderdetail.items_num, orderdetail.items_id FROM orders, USER, orderdetail WHERE orders.user_id = user.id AND orders.id = orderdetail.orders_id </select>
1.5 resultMap 定义
这里我们建立查询订单和订单详情的resultMap,其中我们先继承order和user的resultMap,这样我们就只需要写关联关系就可以了。
<!-- 一对多,查询订单及订单明细 -->
<resultMap type="orders" id="orderAndOrderDetails" extends="ordersUserResultMap">
<!-- 映射订单信息,和用户信息,这里使用继承ordersUserResultMap -->
<!-- 映射订单明细信息
property:要将关联信息映射到orders的哪个属性中
ofType:集合中pojo的类型
-->
<collection property="orderdetails" ofType="com.sihai.mybatis.po.Orderdetail">
<!-- id:关联信息订单明细的唯 一标识
property:Orderdetail的属性名
-->
<id column="orderdetail_id" property="id"/>
<result column="items_num" property="itemsNum"/>
<result column="items_id" property="itemsId"/>
</collection>
</resultMap>
<!-- 一对一查询resultMap -->
<resultMap type="orders" id="ordersUserResultMap">
<!-- 完成了订单信息的映射配置 -->
<!-- id:订单关联用户查询的唯 一 标识 -->
<id column="id" property="id"/>
<result column="user_id" property="userId"/>
<result column="number" property="number"/>
<result column="createtime" property="createtime"/>
<result column="note" property="note"/>
<!-- 下边完成关联信息的映射
association:用于对关联信息映射到单个pojo
property:要将关联信息映射到orders的哪个属性中
javaType:关联信息映射到orders的属性的类型,是user的类型
-->
<association property="user" javaType="user">
<!-- id:关联信息的唯 一标识 -->
<!-- property: 要映射到user的哪个属性中-->
<id column="user_id" property="id"/>
<!-- result就是普通列的映射 -->
<result column="username" property="username"/>
<result column="sex" property="sex"/>
</association>
</resultMap>
1.6mapper.java
记得用mapper代理的方式生成dao的时候,需要符合mybatis的dao的编码规范。
// 一对多查询,使用resultMap public List<Orders> findOrderAndOrderDetails() throws Exception;
二、 一对多查询 ( 复杂 )
2.1 需求
查询所有用户信息,关联查询订单及订单明细信息及商品信息,订单明细信息中关联查询商品信息
2.2sql
主查询表:用户信息
关联查询:订单、订单明细,商品信息
SELECT orders.*, user.username, user.sex , orderdetail.id orderdetail_id, orderdetail.items_num, orderdetail.items_id, items.name items_name, items.detail items_detail FROM orders, USER, orderdetail, items WHERE orders.user_id = user.id AND orders.id = orderdetail.orders_id AND items.id = orderdetail.items_id
2.3 pojo 定义
在 user.java 中创建映射的属性:集合 List<Orders> orderlist
在 Orders 中创建映射的属性:集合 List<Orderdetail> orderdetails
在 Orderdetail 中创建商品属性: pojo Items items
user.java
package com.sihai.mybatis.po;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
/**
* @author sihai
*/
public class User implements Serializable {
private int id;
private String username;// 用户姓名
private String sex;// 性别
private Date birthday;// 生日
private String address;// 地址
//多个订单
private List<Orders> orderlist;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public List<Orders> getOrderlist() {
return orderlist;
}
public void setOrderlist(List<Orders> orderlist) {
this.orderlist = orderlist;
}
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", sex=" + sex
+ ", birthday=" + birthday + ", address=" + address + "]";
}
}
orders.java
package com.sihai.mybatis.po;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
public class Orders implements Serializable {
private Integer id;
private Integer userId;
private String number;
private Date createtime;
private String note;
//关联用户信息
private User user;
//订单明细
private List<Orderdetail> orderdetails;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number == null ? null : number.trim();
}
public Date getCreatetime() {
return createtime;
}
public void setCreatetime(Date createtime) {
this.createtime = createtime;
}
public String getNote() {
return note;
}
public void setNote(String note) {
this.note = note == null ? null : note.trim();
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public List<Orderdetail> getOrderdetails() {
return orderdetails;
}
public void setOrderdetails(List<Orderdetail> orderdetails) {
this.orderdetails = orderdetails;
}
}
orderDetails.java
package com.sihai.mybatis.po;
import java.io.Serializable;
public class Orderdetail implements Serializable {
private Integer id;
private Integer ordersId;
private Integer itemsId;
private Integer itemsNum;
//商品信息
private Items items;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getOrdersId() {
return ordersId;
}
public void setOrdersId(Integer ordersId) {
this.ordersId = ordersId;
}
public Integer getItemsId() {
return itemsId;
}
public void setItemsId(Integer itemsId) {
this.itemsId = itemsId;
}
public Integer getItemsNum() {
return itemsNum;
}
public void setItemsNum(Integer itemsNum) {
this.itemsNum = itemsNum;
}
public Items getItems() {
return items;
}
public void setItems(Items items) {
this.items = items;
}
@Override
public String toString() {
return "Orderdetail [id=" + id + ", ordersId=" + ordersId
+ ", itemsId=" + itemsId + ", itemsNum=" + itemsNum + "]";
}
}
2.4mapper.xml
创建 查询所有用户信息,关联查询订单及订单明细信息及商品信息,订单明细信息中关联查询商品信息的mapper
<!-- 一对多查询使用reusltMap完成 查询用户及订单和订单明细,关联商品,的信息 --> <select id="findUserOrderDetail" resultMap="userOrderDetailResultMap" > SELECT orders.*, user.username, user.sex , orderdetail.id orderdetail_id, orderdetail.items_num, orderdetail.items_id, items.name items_name, items.detail items_detail FROM orders, USER, orderdetail, items WHERE orders.user_id = user.id AND orders.id = orderdetail.orders_id AND items.id = orderdetail.items_id </select>
2.5resultMap
这里我们需要继承上面的resultMap,然后需要注意这里的关联关系比较的复杂,所以在编写的时候要把关系理清楚来。
<!-- 一对多查询,查询用户及订单明细和商品信息 --> <resultMap type="user" id="userOrderDetailResultMap"> <!-- 用户信息映射 --> <id column="user_id" property="id"/> <result column="username" property="username"/> <result column="sex" property="sex"/> <!-- 订单信息 --> <collection property="orderlist" ofType="com.sihai.mybatis.po.Orders"> <id column="id" property="id"/> <result column="user_id" property="userId"/> <result column="number" property="number"/> <result column="createtime" property="createtime"/> <result column="note" property="note"/> <!-- 订单明细映射 --> <collection property="orderdetails" ofType="com.sihai.mybatis.po.Orderdetail"> <!-- id:关联信息订单明细的唯 一标识 property:Orderdetail的属性名 --> <id column="orderdetail_id" property="id"/> <result column="items_num" property="itemsNum"/> <result column="items_id" property="itemsId"/> <!-- 商品信息 --> <association property="items" javaType="com.sihai.mybatis.po.Items"> <id column="item_id" property="id"/> <result column="items_name" property="name"/> <result column="items_detail" property="detail"/> </association> </collection> </collection> </resultMap>
2.6mapper.java
// 一对多查询,使用resultMap public List<User> findUserOrderDetail() throws Exception;
三、总结
在进行一对多查询的时候,我认为我们只要把一下几点做好了,其实就没有什么问题了。
1、理清楚各个实体之间的关系,这样可以比较准确的写出 sql 语句。
2、理清了关联关系之后,当然就是sql的编写了,在mybatis中sql语句编写的能力就显现出来了,不是和hibernate一样,弱化了sql的能力。
3、mapper类的编写,这里需要注意的就是resultMap的编写,这里也是需要注意其中的关联关系,只要这个清楚,基本上就没什么问题了。
哈哈,今天就写到这里吧,写的好累啊,继续加油,坚持。。。
以上所述就是小编给大家介绍的《mybatis教程--一对多查询》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- mybatis教程--一对多查询
- laravel 基础教程 —— 查询生成器
- 介绍性SQL教程:如何编写简单查询
- Lucene教程--维护索引、查询对象和相关度排序
- 200115-SpringBoot系列教程Solr之查询使用姿势小结
- mybatis教程--查询缓存(一级缓存二级缓存和整合ehcache)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Open Data Structures
Pat Morin / AU Press / 2013-6 / USD 29.66
Offered as an introduction to the field of data structures and algorithms, Open Data Structures covers the implementation and analysis of data structures for sequences (lists), queues, priority queues......一起来看看 《Open Data Structures》 这本书的介绍吧!