1、1對1關聯查詢
一種業務需要,需要顯示訂單表的信息,同時還需要下訂單的人的信息。這就是多表查詢,由於一條訂單隻會對應一個用戶,1對1關聯查詢。
兩種方式:
1. 將原來的實體類中增加一個新的屬性
(1)、在實體類中增加對應另一張表的實體類的屬性。get/set toString
(2)、輸出映射改爲resultMap,手動去映射對應的屬性
(3)、association (1對1關聯) property原來orders中的user屬性
JavaType User 剩下的還是要手動映射
UserMapper.xml
<resultMap id="ordersView"type="cn.hd.query.Orders">
<idproperty="id" column="id"></id>
<resultproperty="eatTime" column="eatTime"></result>
<resultproperty="orderTime" column="orderTime"></result>
<association property="user"javaType="cn.hd.pojo.User">
<id property="id"column="orderId"></id>
<resultproperty="name" column="name"></result>
<resultproperty="address" column="address"></result>
</association>
</resultMap>
<select id="findOrdersView" resultMap="ordersView">
SELECT * FROM orders o LEFT JOINt_user u ON o.orderId = u.id
</select>
接口
List<Orders>findOrdersView();
Orders
public class Orders {
private Integer id;
private Integer ordersId;
private String orderTime;
private String eatTime;
private User user;
測試類
List<Orders> users = mapper.findOrdersView();
System.out.println(users);
注意:
(1).只要不手動書寫映射,他都不會幫你獲得數據庫中的值,即使名字一樣。
(2).如果名字重複了,它會自動幫你增加一個1,但是你如果不起別名,他是不會幫你映射的。
SELECT * FROM orders oLEFT JOIN t_user u ON o.orderId = u.id
2.新建一個實體類(resultType)
業務的需要往往不需要訂單人的全部信息,只需要部分信息,也可能不需要訂單的全部信息。根據業務邏輯建立一個新的實體類。在這個實體類中包含要顯示的所有字段,並且要和數據庫查出來的字段保持一致。
新建一個實體類
public class OrdersView extends Orders{
private String name;
private String address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(Stringaddress) {
this.address = address;
}
@Override
public String toString() {
return "OrdersView{" +
"name='" + name+ '\'' +
", address='" +address + '\'' +
'}';
}
}
接口
List<OrdersView>findOrdersView();
UserMapper.xml
<select id="findOrdersView"resultType="cn.hd.query.OrdersView">
SELECT * FROM orders o LEFT JOIN t_user uON o.orderId = u.id
</select>
測試類
List<OrdersView> users =mapper.findOrdersView();
System.out.println(users);
2、1對多關聯查詢
結果映射中的resultType就不能用了,建議使用resultMap。
接口
List<User>findUserAndOrders();
UserMapper.xml
<resultMap id="user_orders" type="cn.hd.pojo.User">
<id property="id" column="id"></id>
<result property="name" column="name"></result>
<result property="address"column="address"></result>
<collection property="orders"javaType="list" ofType="cn.hd.query.Orders">
<id property="id" column="ordersId"></id>
<result property="orderTime"column="orderTime"></result>
</collection>
</resultMap>
<select id="findUserAndOrders" resultMap="user_orders">
SELECT u.*,o.id ASordersId,o.orderTime,o.eatTime FROM orders o RIGHT JOIN t_user u ON o.orderId =u.id
</select>
User類
public class User {
private Integer id;
private String name;
private String sex;
private String address;
private Integer balance;
/*1對多*/
List<Orders> orders;
測試類
@Test
public void fun4(){
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> userAndOrders =mapper.findUserAndOrders();
System.out.println(userAndOrders);
}
Collection對應的是一對多的關係,property要和user中的集合名字保持一致,JavaType對應的集合的類型.ofType集合中的元素。
注意事項和1對1查詢一致。