关联查询中的一对一查询。通过第一种方式也就是自动映射的方式查询所有订单信息,关联查询下单用户信息。(由于需要创建中间类,这种方法在实际开发中已经不再使用)

商品订单数据模型:

一对一查询:查询所有订单信息,关联查询下单用户信息。

注意:因为一个订单信息只会是一个人去下的订单,所以从查询订单出发关联查询用户信息为一对一查询。如果从用户信息出发查询用户下的订单信息则为一对多查询,因为一个用户可以下多个订单。

1.在UserMapper接口中创建方法:

  public List<UserOrders> findOrderAndUser();

2.定义中间类UserOrders,因为查询的结果中既包含User中的信息也包括Orders中的信息,所以我们创建一个UserOrders类来包含这两个表中的所有属性。

  由于两个表中的属性太多,所以我们定义两个类,定义类Orders来存储Orders中的属性信息:

package com.huida.po;

import java.util.Date;


public class Orders {

    private Integer id;
    private Integer userId;
    private String number;
    private Date createtime;
    private String note;
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public Integer getUserId() {
        return userId;
    }
    public void setUserId(Integer userId) {
        this.userId = userId;
    }
    public String getNumber() {
        return number;
    }
    public void setNumber(String number) {
        this.number = number;
    }
    public Date getCreatetime() {
        return createtime;
    }
    public void setCreatetime(Date createtime) {
        this.createtime = createtime;
    }
    public String getNote() {
        return note;
    }
    public void setNote(String note) {
        this.note = note;
    }
    
}

  定义UserOrders类来继承Orders类,同时在这个类中定义User表中的属性:

package com.huida.po;

import java.util.Date;

public class UserOrders extends Orders{

    private int uid;
    private String username;
    private String sex;
    private Date birthday;
    private String address;
    public int getUid() {
        return uid;
    }
    public void setUid(int uid) {
        this.uid = uid;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public Date getBirthday() {
        return birthday;
    }
    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    
}

3.在UserMapper.xml中进行配置:

<select id="findOrderAndUser" resultType="com.huida.po.UserOrders">
        <!-- select后面的属性名必须和UserOrders中定义的属性名相同 -->
        select a.*,b.id uid,username,birthday,sex,address
        from orders a,user b 
        where a.user_id=b.id
    </select>

  这里应该注意的是:

  1.返回类型应该为UserOrders类型

  2.select后面的属性应该与UserOrders中定义的属性名相同,否则查找不到。

  3.b.id uid的意思是:b.id的别名为uid。

4.测试代码:

@Test
    public void testfindOrdersAndUsers(){
        //创建SqlSession
        SqlSession openSession=factory.openSession();
        //通过会话的getMapper方法来实例化接口(实现类的对象)
        UserMapper userMapper=openSession.getMapper(UserMapper.class);//参数放接口的字节码文件
        List<UserOrders> list=userMapper.findOrderAndUser();
        for(UserOrders userOrders:list){
            System.out.println(userOrders.getUsername()+"...."+userOrders.getNumber());
        }
    }

 5.小结:

  定义专门的po类作为输出类型,其中定义了sql查询结果集所有的字段。此方法较为简单,企业中使用普遍。

  

原文地址:https://www.cnblogs.com/wyhluckdog/p/10156805.html