Mybatis學習筆記(七) —— 關聯查詢
阿新 • • 發佈:2018-12-30
一、一對多查詢
需求:查詢所有訂單資訊,關聯查詢下單使用者資訊。
注意:因為一個訂單資訊只會是一個人下的訂單,所以從查詢訂單資訊出發關聯查詢使用者資訊為一對一查詢。如果從使用者資訊出發查詢使用者下的訂單資訊則為一對多查詢,因為一個使用者可以下多個訂單。
sql語句:
SELECT o.id, o.user_id userId, o.number, o.createtime, o.note, u.username, u.address FROM `order` o LEFT JOIN`user` u ON o.user_id = u.id
1.1 方法一:使用resultType
使用resultType,改造訂單pojo類,此pojo類中包括了訂單資訊和使用者資訊,這樣返回物件的時候,mybatis自動把使用者資訊也注入進來了。
1.1.1 改造pojo類
OrderUser類繼承Order類後OrderUser類包括了Order類的所有欄位,只需要定義使用者的資訊欄位即可:
public class OrderUser extends Order { private String username; private String address; get/set... }
1.1.2 Mapper.xml
在UserMapper.xml中新增sql:
<!-- 查詢訂單,同時包含使用者資料 --> <select id="queryOrderUser" resultType="orderUser"> SELECT o.id, o.user_id, o.number, o.createtime, o.note, u.username, u.address FROM `order` o LEFT JOIN `user` u ON o.user_id = u.id</select>
1.1.3 Mapper介面
在UserMapper介面新增方法:
/** * 一對一關聯,查詢訂單同時包含使用者 * @return */ List<OrderUser> queryOrderUser();
1.1.4 測試方法
@Test public void testQueryOrderUser() throws Exception { // mybatis和spring整合,整合之後,交給spring管理 SqlSession sqlSession = sqlSessionFactory.openSession(); // 建立Mapper介面的動態代理物件,整合之後,交給spring管理 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); // 使用userMapper執行根據條件查詢使用者 List<OrderUser> list = userMapper.queryOrderUser(); for (OrderUser orderUser : list) { System.out.println(orderUser); } // mybatis和spring整合,整合之後,交給spring管理 sqlSession.close(); }
1.1.5 小結
定義專門的pojo類作為輸出型別,其中定義了sql查詢結果集所有的欄位。此方法較為簡單,企業中使用普遍。
1.2 方法二:使用resultMap
使用resultMap,定義專門的resultMap用於對映一對一查詢結果。
1.2.1 改造pojo類
在Order類中加入User屬性,user屬性中用於儲存關聯查詢的使用者資訊,因為訂單關聯查詢使用者是一對一關係,所以這裡使用單個User物件儲存關聯查詢的使用者資訊。
public class Order { // 訂單id private int id; // 使用者id private Integer userId; // 訂單號 private String number; // 訂單建立時間 private Date createtime; // 備註 private String note; private User user; get/set... }
1.2.2 Mapper.xml
這裡resultMap指定orderUserResultMap:
<resultMap type="order" id="orderUserResultMap"> <id property="id" column="id"/> <result property="userId" column="user_id"/> <result property="number" column="number"/> <result property="createtime" column="createtime"/> <result property="note" column="note"/> <!-- association :配置一對一屬性 --> <!-- property:order裡面的User屬性名 --> <!-- javaType:屬性型別 --> <association property="user" javaType="user"> <!-- id:宣告主鍵,表示user_id是關聯查詢物件的唯一標識--> <id property="id" column="user_id"/> <result property="username" column="username" /> <result property="address" column="address" /> </association> </resultMap> <!-- 一對一關聯,查詢訂單,訂單內部包含使用者屬性 --> <select id="queryOrderUserResultMap" resultMap="orderUserResultMap"> SELECT o.id, o.user_id, o.number, o.createtime, o.note, u.username, u.address FROM `order` o LEFT JOIN `user` u ON o.user_id = u.id </select>
1.2.3 Mapper介面
在UserMapper.xml中新增方法:
/** * 一對一關聯,查詢訂單,訂單內部包含使用者屬性 * @return */ List<Order> queryOrderUserResultMap();
1.2.4 測試方法
@Test public void testQueryOrderUserResultMap() throws Exception { // mybatis和spring整合,整合之後,交給spring管理 SqlSession sqlSession = sqlSessionFactory.openSession(); // 建立Mapper介面的動態代理物件,整合之後,交給spring管理 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); List<Order> list = userMapper.queryOrderUserResultMap(); for (Order order : list) { System.out.println(order); } // mybatis和spring整合,整合之後,交給spring管理 sqlSession.close(); }
二、一對多查詢
需求:查詢所有使用者資訊及使用者關聯的訂單資訊
使用者資訊和訂單資訊為一對多關係。
sql語句:
SELECT u.id, u.username, u.birthday, u.sex, u.address, o.number, o.createtime, o.note FROM `user` u LEFT JOIN `order` o ON u.id = o.user_id
2.1 修改pojo類
在User類中加入List<Order> orders屬性:
public class User { private int id; private String username;// 使用者姓名 private String sex;// 性別 private Date birthday;// 生日 private String address;// 地址 private List<Order> orders; get/set... }
2.2 Mapper.xml
在UserMapper.xml新增sql:
<resultMap type="user" id="userOrderResultMap"> <id property="id" column="id"/> <result property="username" column="username"/> <result property="sex" column="sex"/> <result property="birthday" column="birthday"/> <result property="address" column="address"/> <!-- 配置一對多關係 --> <collection property="orders" javaType="list" ofType="order"> <!-- 配置主鍵,是關聯Order的唯一標識 --> <id property="id" column="oid"/> <result property="number" column="number" /> <result property="createtime" column="createtime" /> <result property="note" column="note" /> </collection> </resultMap> <!-- 一對多關聯,查詢使用者的同時查詢該使用者下的訂單 --> <select id="queryUserOrder" resultMap="userOrderResultMap"> SELECT u.id, u.username, u.birthday, u.sex, u.address, o.number, o.createtime, o.note FROM `user` u LEFT JOIN `order` o ON u.id = o.user_id </select>
2.3 Mapper介面
在UserMapper.java中新增方法:
/** * 一對多關聯,查詢使用者,使用者內部包含該使用者的訂單 * @return */ List<User> queryUserOrder();
2.4 測試方法
@Test public void testQueryUserOrder() throws Exception { // mybatis和spring整合,整合之後,交給spring管理 SqlSession sqlSession = sqlSessionFactory.openSession(); // 建立Mapper介面的動態代理物件,整合之後,交給spring管理 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); List<User> list = userMapper.queryUserOrder(); for (User user : list) { System.out.println(user); } // mybatis和spring整合,整合之後,交給spring管理 sqlSession.close(); }