Mybatis框架关联查询详解

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


发布了87 篇原创文章 · 获赞 381 · 访问量 10万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章