數據庫表以下:java
拿到表的第一時間要學會分析陌生表的數據模型:sql
一、學習單表記錄了什麼東西(去學習理解需求)數據庫
二、學習單表重要字段的意義(優先學習不能爲空的字段)mybatis
三、學習表與表之間的關係(一對1、一對多、多對多)經過表的外鍵分析表之間的關係app
注意:分析表與表之間的關係時是要創建在具體 的業務意義基礎之上學習
用戶表user:記錄了購買商品的用戶ui
訂單表orders:記錄了用戶所建立的訂單信息spa
訂單明細表orderdetail:記錄了用戶建立訂單的詳細信息debug
商品信息表items:記錄了商家提供的商品信息代理
分析表與表之間的關係:
用戶user和訂單orders:
user---->orders:一個用戶能夠建立多個訂單 一對多
orders-->user:一個訂單隻能由一個用戶建立 一對一
訂單orders和訂單明細orderdetail:
orders-->orderdetail:一個訂單能夠包括多個訂單明細 一對多
orderdetail-->orders:一個訂單明細只屬於一個訂單 一對一
訂單明細orderdetail和商品信息items:
orderdetail-->items:一個訂單明細對應一個商品信息 一對一
items--> orderdetail:一個商品對應多個訂單明細 一對多
需求:查詢全部用戶信息,關聯查詢訂單及訂單明細信息及商品信息
分析sql語句如何寫:
主查詢表:用戶信息
關聯查詢:訂單、訂單明細,商品信息
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
運行------>
主查詢的表單出現重複數據,使用mybatis以下:
pojo定義:
User.java
Orders.java
Orderdetail.java
Items.java
mapper.xml(注意sql語句查詢時是否使用別名,有的話必定要同步)
1 <!-- 一對多查詢,查詢用戶及訂單明細和商品信息 --> 2 <resultMap id="userOrdersAndItemsResultMap" type="user"> 3 <!-- 用戶信息映射 --> 4 <id column="id" property="id"/> 5 <result column="username" property="username"/> 6 <result column="sex" property="sex"/> 7 <!-- 訂單信息映射 --> 8 <!-- 下邊完成關聯信息的映射 9 collection:用於對關聯信息映射到集合 10 property:要將關聯信息映射到User的哪一個屬性中 11 ofType:關聯信息映射到User的屬性的類型,能夠使用別名,不過全稱方便確認 12 --> 13 <collection property="orderlist" ofType="com.emuii.mybatis.pojo.Orders"> 14 <!-- id:訂單關聯用戶查詢的惟一標識 --> 15 <id column="id" property="id"/> 16 <result column="user_id" property="userId"/> 17 <result column="number" property="number"/> 18 <result column="createtime" property="createtime"/> 19 <result column="note" property="note"/> 20 <!-- 訂單詳細信息映射 --> 21 <collection property="orderdetails" ofType="com.emuii.mybatis.pojo.Orderdetail"> 22 <!-- id:關聯信息訂單明細的惟一標識 23 property:Orderdetail的屬性名 24 --> 25 <id column="orderdetail_id" property="id"/> 26 <result column="items_num" property="itemsNum"/> 27 <result column="items_id" property="itemsId"/> 28 <association property="items" javaType="com.emuii.mybatis.pojo.Items"> 29 <id column="id" property="id"/> 30 <result column="items_name" property="name"/> 31 <result column="items_detail" property="detail"/> 32 </association> 33 </collection> 34 </collection> 35 </resultMap> 36 37 <!-- 一對多查詢使用reusltMap完成 38 查詢用戶及訂單和訂單明細,關聯商品,的信息 39 --> 40 <select id="findUserOrdersAndItems" resultMap="userOrdersAndItemsResultMap"> 41 SELECT 42 orders.*, 43 user.username, 44 user.sex , 45 orderdetail.id orderdetail_id, 46 orderdetail.items_num, 47 orderdetail.items_id, 48 items.name items_name, 49 items.detail items_detail 50 FROM 51 orders, 52 USER, 53 orderdetail, 54 items 55 WHERE orders.user_id = user.id AND orders.id = orderdetail.orders_id AND items.id = orderdetail.items_id 56 </select>
mapper.java(代理接口)
Test:
1 public class OrdersMapperTest { 2 3 // 會話工廠 4 private SqlSessionFactory sqlSessionFactory; 5 // 建立工廠 6 @Before 7 public void init() throws IOException { 8 9 // 配置文件(SqlMapConfig.xml) 10 String resource = "SqlMapConfig.xml"; 11 12 // 加載配置文件到輸入流 13 InputStream inputStream = Resources.getResourceAsStream(resource); 14 15 // 建立會話工廠 16 sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 17 } 18 19 @Test 20 public void testFindUserOrdersAndItems() throws Exception { 21 22 // 獲取statement 23 SqlSession sqlSession = sqlSessionFactory.openSession(); 24 25 // 建立mapper代理接口(Dao接口) 26 OrdersMapper ordersMapper = sqlSession.getMapper(OrdersMapper.class); 27 // 調用方法 28 List<User> list = ordersMapper.findUserOrdersAndItems(); 29 30 sqlSession.close(); 31 System.out.println(list); 32 } 33 }
debug模式查看:
出現兩行數據,可是總共有四條數據~