多對多查詢
1、需求
查詢用戶及用戶所購買的商品信息
2、sql語句
需要查詢的主表是:用戶表User
需要查詢的關聯表:由於用戶和商品沒有直接關聯,通過訂單和訂單明細進行關聯,所以關聯變:訂單表order,訂單明細表orderdetail,商品表items
SELECT
orders.*,
user.`username`,
user.`sex`,user.`address` ,
orderdetail.`id` orderdetail_id,
orderdetail.`items_id`,
orderdetail.`items_num`,
orderdetail.`orders_id` ,
items.`name` items_name,
items.`detail` items_detail,
items.`price` items_price
FROM
orders,
USER,
orderdetail,
items
WHERE orders.`user_id` = user.`id` AND orderdetail.`orders_id` = orders.`id` AND orderdetail.`items_id` = items.`id`
3、映射思路
將用戶信息映射到User類中
在User類中,添加訂單列表屬性List<Order> orderList,將用戶創建的訂單映射到orderList
在Order類中,添加訂單明細列表屬性List<OrderDetail> orderDetails,將訂單明細映射到orderDetails
在OrderDetail類中,添加Items屬性List<Items> itemsDetails,將所對應的商品映射到itemsDetails
User類:
//屬性名和數據庫表的字段一一對應
private Integer id;
private String username;// 用戶姓名
private String sex;// 性別
private Date birthday;// 生日
private String address;// 地址
//用戶創建的訂單列表
private List<Order> orderList;
Order類:
private Integer id;
private Integer userId;
private String number;
private Date createtime;
private String note;
//用戶信息
private User user;
//訂單詳情List
private List<OrderDetail> OrderDetails;
OrderDetail類:
private Integer id;
private Integer ordersId;
private Integer itemsId;
private Integer itemsNum;
//商品信息
private Items items;
4、mapper.xml
4.1resultMap
注意此處:嵌套式映射,根據業務關係,一級一級判斷,
<!-- 查詢用戶 及 購買的商品 resultMap -->
<resultMap id="UserAndItemsResultMap" type="pojo.User">
<!-- 用戶信息 -->
<id column="user_id" property="id" />
<result column="username" property="username" />
<result column="sex" property="sex" />
<result column="address" property="address" />
<!--
訂單信息
一個用戶對應多張訂單
-->
<collection property="orderList" ofType="pojo.Order" >
<id column="id" property="id" />
<result column="number" property="number" />
<result column="createtime" property="createtime" />
<result column="note" property="note"/>
<!--
訂單明細信息
一個訂單對應多個明細
-->
<collection property="OrderDetails" ofType="pojo.OrderDetail">
<!-- 訂單明細的唯一標識 -->
<id column="orderdetail_id" property="id"/>
<result column="items_id" property="itemsId"/>
<result column="items_num" property="itemsNum"/>
<result column="orders_id" property="ordersId"/>
<!--
商品信息
一個訂單明細對應一個商品
-->
<association property="items" javaType="pojo.Items">
<id column="items_id" property="id"/>
<result column="items_name" property="name"/>
<result column="items_detail" property="detail"/>
<result column="items_price" property="price"/>
</association>
</collection>
</collection>
</resultMap>
4.2 statement
<!-- 查詢用戶 及 購買的商品信息 使用resultMap -->
<select id="findUserAndItemsResultMap" resultMap="UserAndItemsResultMap">
SELECT
orders.*,
user.`username`,
user.`sex`,user.`address` ,
orderdetail.`id` orderdetail_id,
orderdetail.`items_id`,
orderdetail.`items_num`,
orderdetail.`orders_id` ,
items.`name` items_name,
items.`detail` items_detail,
items.`price` items_price
FROM
orders,
USER,
orderdetail,
items
WHERE orders.`user_id` = user.`id` AND orderdetail.`orders_id` = orders.`id` AND orderdetail.`items_id` = items.`id`
</select>
5、mapper.java
//查詢用戶以及購買的商品信息
public List<User> findUserAndItemsResultMap() throws Exception;
6、測試代碼
@Test
public void testFindUserAndItemsResultMap() throws Exception{
SqlSession sqlSession = sqlSessionFactory.openSession();
OrderMapperCustom orderMapperCustom = sqlSession.getMapper(OrderMapperCustom.class);
List<User> list = orderMapperCustom.findUserAndItemsResultMap();
System.out.println(list);
}
7、輸出結果
DEBUG [main] - Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4jImpl' adapter.
DEBUG [main] - Class not found: org.jboss.vfs.VFS
DEBUG [main] - JBoss 6 VFS API is not available in this environment.
DEBUG [main] - Class not found: org.jboss.vfs.VirtualFile
DEBUG [main] - VFS implementation org.apache.ibatis.io.JBoss6VFS is not valid in this environment.
DEBUG [main] - Using VFS adapter org.apache.ibatis.io.DefaultVFS
DEBUG [main] - Find JAR URL: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo
DEBUG [main] - Not a JAR: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo
DEBUG [main] - Reader entry: Items.class
DEBUG [main] - Reader entry: Order.class
DEBUG [main] - Reader entry: OrderCustom.class
DEBUG [main] - Reader entry: OrderDetail.class
DEBUG [main] - Reader entry: User.class
DEBUG [main] - Reader entry: UserCustom.class
DEBUG [main] - Reader entry: UserQueryVo.class
DEBUG [main] - Listing file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo
DEBUG [main] - Find JAR URL: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo/Items.class
DEBUG [main] - Not a JAR: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo/Items.class
DEBUG [main] - Reader entry: ���� 4 W
DEBUG [main] - Find JAR URL: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo/Order.class
DEBUG [main] - Not a JAR: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo/Order.class
DEBUG [main] - Reader entry: ���� 4 f
DEBUG [main] - Find JAR URL: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo/OrderCustom.class
DEBUG [main] - Not a JAR: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo/OrderCustom.class
DEBUG [main] - Reader entry: ���� 4 "
DEBUG [main] - Find JAR URL: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo/OrderDetail.class
DEBUG [main] - Not a JAR: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo/OrderDetail.class
DEBUG [main] - Reader entry: ���� 4 J
DEBUG [main] - Find JAR URL: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo/User.class
DEBUG [main] - Not a JAR: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo/User.class
DEBUG [main] - Reader entry: ���� 4 [
DEBUG [main] - Find JAR URL: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo/UserCustom.class
DEBUG [main] - Not a JAR: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo/UserCustom.class
DEBUG [main] - Reader entry: ���� 4
DEBUG [main] - Find JAR URL: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo/UserQueryVo.class
DEBUG [main] - Not a JAR: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo/UserQueryVo.class
DEBUG [main] - Reader entry: ���� 4 %
DEBUG [main] - Checking to see if class pojo.Items matches criteria [is assignable to Object]
DEBUG [main] - Checking to see if class pojo.Order matches criteria [is assignable to Object]
DEBUG [main] - Checking to see if class pojo.OrderCustom matches criteria [is assignable to Object]
DEBUG [main] - Checking to see if class pojo.OrderDetail matches criteria [is assignable to Object]
DEBUG [main] - Checking to see if class pojo.User matches criteria [is assignable to Object]
DEBUG [main] - Checking to see if class pojo.UserCustom matches criteria [is assignable to Object]
DEBUG [main] - Checking to see if class pojo.UserQueryVo matches criteria [is assignable to Object]
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - Find JAR URL: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/mapper
DEBUG [main] - Not a JAR: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/mapper
DEBUG [main] - Reader entry: OrderMapperCustom.class
DEBUG [main] - Reader entry: OrderMapperCustom.xml
DEBUG [main] - Reader entry: UserMapper.class
DEBUG [main] - Reader entry: UserMapper.xml
DEBUG [main] - Listing file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/mapper
DEBUG [main] - Find JAR URL: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/mapper/OrderMapperCustom.class
DEBUG [main] - Not a JAR: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/mapper/OrderMapperCustom.class
DEBUG [main] - Reader entry: ���� 4
DEBUG [main] - Find JAR URL: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/mapper/OrderMapperCustom.xml
DEBUG [main] - Not a JAR: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/mapper/OrderMapperCustom.xml
DEBUG [main] - Reader entry: <?xml version="1.0" encoding="UTF-8" ?>
DEBUG [main] - Find JAR URL: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/mapper/UserMapper.class
DEBUG [main] - Not a JAR: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/mapper/UserMapper.class
DEBUG [main] - Reader entry: ���� 4 findUserByIdResultMap (I)Lpojo/User;
DEBUG [main] - Find JAR URL: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/mapper/UserMapper.xml
DEBUG [main] - Not a JAR: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/mapper/UserMapper.xml
DEBUG [main] - Reader entry: <?xml version="1.0" encoding="UTF-8" ?>
DEBUG [main] - Checking to see if class mapper.OrderMapperCustom matches criteria [is assignable to Object]
DEBUG [main] - Checking to see if class mapper.UserMapper matches criteria [is assignable to Object]
DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Created connection 2070529722.
DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@7b69c6ba]
DEBUG [main] - ==> Preparing: SELECT orders.*, user.`username`, user.`sex`,user.`address` , orderdetail.`id` orderdetail_id, orderdetail.`items_id`, orderdetail.`items_num`, orderdetail.`orders_id` , items.`name` items_name, items.`detail` items_detail, items.`price` items_price FROM orders, USER, orderdetail, items WHERE orders.`user_id` = user.`id` AND orderdetail.`orders_id` = orders.`id` AND orderdetail.`items_id` = items.`id`
DEBUG [main] - ==> Parameters:
DEBUG [main] - <== Total: 4
[User{id=28, username='fjnmbb124', sex='1', birthday=null, address='湖南長沙', orderList=[Order{id=6, userId=null, number='3', createtime=Thu Jun 22 21:30:02 CST 2017, note='null', user=null, OrderDetails=[OrderDetail{id=5, ordersId=6, itemsId=4, itemsNum=1, items=Items{id=4, name='a', price=123.0, detail='null', Pic='null', craetetime=null}}, OrderDetail{id=8, ordersId=6, itemsId=5, itemsNum=2017, items=Items{id=5, name='b', price=123123.0, detail='123123', Pic='null', craetetime=null}}]}]}, User{id=29, username='測試測試1', sex='1', birthday=null, address='湖南益陽', orderList=[Order{id=7, userId=null, number='6', createtime=Thu Jun 22 21:30:12 CST 2017, note='null', user=null, OrderDetails=[OrderDetail{id=9, ordersId=7, itemsId=4, itemsNum=2, items=Items{id=4, name='a', price=123.0, detail='null', Pic='null', craetetime=null}}, OrderDetail{id=7, ordersId=7, itemsId=5, itemsNum=2, items=Items{id=5, name='b', price=123123.0, detail='123123', Pic='null', craetetime=null}}]}]}]
Process finished with exit code 0
8、總結
將查詢用戶購買的商品的信息明細清單(用戶名,用戶地址,購買商品名稱,購買商品時間,購買商品數量)
針對上面的需求,使用resultType,將查詢到的記錄映射到一個擴展的pojo中,很簡單的實現該功能。
使用resultMap,是針對於對查詢結果有特殊要求的功能而使用的。