关联查询中的一对一查询。通过第二种方式也就是手动映射的方式查询所有订单信息,关联查询下单用户信息。(这是以后我们进行一对一开发中的常用方法)

使用resultMap,定义专门的resultMap用于映射一对一查询结果。

1.一对一映射的自动映射方式可以参考我的上一篇博文:https://www.cnblogs.com/wyhluckdog/p/10156805.html

2.手动映射的情况时,我们不需要将所有的属性都整合到UserOrders中了,我们只需要将用户信息表的User类对象定义在保存orders表属性信息的类Orders中。User中的内容为:

package com.huida.po;

import java.util.Date;

public class User {

    private int id;
    private String username;// 用户姓名
    private String sex;// 性别
    private Date birthday;// 生日
    private String address;// 地址
    public void setId(int id) {
        this.id = id;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    public int getId() {
        return id;
    }
    public String getUsername() {
        return username;
    }
    public String getSex() {
        return sex;
    }
    public Date getBirthday() {
        return birthday;
    }
    public String getAddress() {
        return address;
    }
    @Override
    public String toString() {
        return "User [id=" + id + ", username=" + username + "]";
    }
    
    
    
}

  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;
    private User user;
    
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }
    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;
    }
    
}

3.在UserMapper接口中定义方法:

  public List<Orders> findOrdersAndUser2();

4.在UserMapper.xml进行配置:

<resultMap type="com.huida.po.Orders" id="orderAndUserResultMap">
        <!-- id标签指定主键字段的对应关系 -->
        <id column="id" property="id"></id>
        <!-- result标签指定非主键字段的对应关系 -->
        <result column="user_id" property="userId"/>
        <result column="number" property="number"/>
        <result column="createtime" property="createtime"/>
        <result column="note" property="note"/>
        <!-- association指定单个对象的对应关系
            property:指定将数据放入Orders中的user属性中
            javaType:user属性到的类型
         -->
        <association property="user" javaType="com.huida.po.User">
            <id column="uid" property="id"/>
            <result column="username" property="username"/>
            <result column="sex" property="sex"/>
            <result column="birthday" property="birthday"/>
            <result column="address" property="address"/>
        </association>
        
    </resultMap>
    <select id="findOrdersAndUser2" resultMap="orderAndUserResultMap">
        <!-- select后面的属性名必须和resultMap中定义的属性名相同 -->
        select a.*,b.id uid,username,birthday,sex,address
        from orders a,user b 
        where a.user_id=b.id
    </select>

  这里进行手动配置以建立po类与配置文件的关联关系。

  resultMap标签中的type属性指定返回值的类型,id用来进行唯一标识。

  association:表示进行关联查询单条记录

    property:表示关联查询的结果存储在cn.huida.po.Ordersuser属性中

    javaType:表示关联查询的结果类型

  id标签指定主键字段的对应关系

    <id column="user_id" property="userId"/>:查询结果的user_id列对应关联对象的id属性,这里是<id />表示user_id是关联查询对象的唯一标识。

  result标签指定非主键字段的对应关系

    <result property="username" column="username"/>:查询结果的username列对应关联对象的username属性。

5.测试代码为:

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

 6.小结:

  使用association完成关联查询,将关联查询信息映射到po对象中。

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