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查询一致。