MyBatis 一对多关系映射

刚才演示了MyBatis一对一映射,接着我们看看用户对订单的一对多映射如何完成。

1 设计Pojo,建立关系

在User类添加List<Order>订单集合属性,用于关联用户的所有订单

package com.yiidian.domain;

import java.util.List;

/**
 * 用户实体
 * 一点教程网 - www.yiidian.com
 */
public class User {
    private Integer id;
    private String username;
    private String password;

    private List<Order> orders;

    public List<Order> getOrders() {
        return orders;
    }

    public void setOrders(List<Order> orders) {
        this.orders = orders;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

2 编写Dao接口方法

在UserDao添加查询所有用户的方法

package com.yiidian.dao;

import com.yiidian.domain.User;

import java.util.List;

/**
 * 用户Dao接口
 * 一点教程网 - www.yiidian.com
 */
public interface UserDao {
    /**
     * 查询所有用户
     */
    public List<User> findAllUsers();
}

3 编写Dao映射配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--
   namespace: 用于指定该映射文件需要映射的Dao接口
-->
<mapper namespace="com.yiidian.dao.UserDao">

    <!--一对多映射-->
    <resultMap id="UserResultMap" type="com.yiidian.domain.User">
        <id property="id" column="id"/>
        <result property="username" column="username"/>
        <result property="password" column="password"/>
        <!--关联查询用户的所有订单-->
        <collection property="orders" column="id" ofType="com.yiidian.domain.Order">
            <id property="id" column="oid"/>
            <result property="orderno" column="orderno"/>
            <result property="amount" column="amount"/>
        </collection>
    </resultMap>

    <select id="findAllUsers" resultMap="UserResultMap">
        SELECT
          u.*,
          o.id oid,
          o.orderno orderno,
          o.amount amount
        FROM t_user u
          LEFT JOIN t_order o
            ON o.user_id = u.id
    </select>
</mapper>

collection:一对多映射属性

  • property:User类的orders集合属性名称
  • column:外键字段名称
  • ofType:orders集合里面的元素类型,就是Order类的全限定名

4 编写测试类

package com.yiidian.mybatis;

import com.yiidian.dao.OrderDao;
import com.yiidian.dao.UserDao;
import com.yiidian.domain.Order;
import com.yiidian.domain.User;
import com.yiidian.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.ArrayList;
import java.util.List;

/**
 * MyBatis测试类 - 一对多映射
 * 一点教程网 - www.yiidian.com
 */
public class TestOne2Many {

    /**
     * 测试一对多映射
     */
    @Test
    public void testOrderDao(){
        //1.获取SqlSession对象
        SqlSession sqlSession = MyBatisUtils.getSession();

        //2.创建Mapper代理对象
        UserDao userDao = sqlSession.getMapper(UserDao.class);

        //3.调用方法
        List<User> list = userDao.findAllUsers();
        System.out.println(list);

        //4.关闭连接
        sqlSession.close();
    }

}

5 运行测试类

使用dubug启动,查看User类的orders属性,成功封装了所有订单数据

 

源码下载:https://pan.baidu.com/s/1jWgai3idBh7Vy-9WJSxILw