mybatis 一对多

person

package com.kerwin.mybatis.pojo;

import java.util.List;

public class Person {

    private int id;
    private String name;
    private List<Orders> orderList;

    public int getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<Orders> getOrderList() {
        return orderList;
    }

    public void setOrderList(List<Orders> orderList) {
        this.orderList = orderList;
    }

    @Override
    public String toString() {
        return "Person [id=" + id + ", name=" + name + "]";
    }

    public Person() {
        super();
        // TODO Auto-generated constructor stub
    }

    public Person(int id, String name, List<Orders> orderList) {
        super();
        this.id = id;
        this.name = name;
        this.orderList = orderList;
    }

}
order

package com.kerwin.mybatis.pojo;

public class Orders {
    private int id;
    private double price;
    private Person person;
    
    
    
    public Person getPerson() {
        return person;
    }

    public void setPerson(Person person) {
        this.person = person;
    }

    public int getId() {
        return id;
    }

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



    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }


    

    @Override
    public String toString() {
        return "Orders [id=" + id + ", price=" + price + "]";
    }

    public Orders() {
        super();
        // TODO Auto-generated constructor stub
    }

}
PersonMapper.xml

<?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">
    
<mapper namespace="com.kerwin.mybatis.pojo.Person">
    <resultMap type="com.kerwin.mybatis.pojo.Person" id="personreSultMap">
        <id column="p_id" property="id"/>
        <result column="name" property="name"/>
        <collection property="orderList" ofType="com.kerwin.mybatis.pojo.Orders" column="pid">
            <id column="o_id" property="id"/>
            <result column="price" property="price"/>
        </collection>
        
    </resultMap>
    
    <select id="selectPersonFetchOrder" parameterType="int" resultMap="personreSultMap" >
        select p.*,o.* from person p,orders o where o.pid=p.p_id and p.p_id=#{id}
    </select>
    
    
</mapper>

OrdersMapper.xml

<?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">

<mapper namespace="com.kerwin.mybatis.pojo.Orders">
    <resultMap type="com.kerwin.mybatis.pojo.Orders" id="OrdersResultMap">
        <id column="o_id" property="id"/>
        <result column="price" property="price"/>
        <association property="person" javaType="com.kerwin.mybatis.pojo.Person">
            <id column="p_id" property="id"/>
            <result column="name" property="name"/>
        </association>
    </resultMap>
    
    <select id="selectOrdersFetchPerson" resultMap="OrdersResultMap">
        select p.*,o.* from person p,orders o where o.pid=p.p_id and o.o_id=#{id}
    </select>

</mapper>

测试类:

/**
 *
 */
package com.kerwin.mybatis.test;

import java.io.InputStream;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.BeforeClass;
import org.junit.Test;

import com.kerwin.mybatis.pojo.Orders;
import com.kerwin.mybatis.pojo.Person;

/**
 * @author Administrator
 *
 */
public class PersonAndOrderTest {

    private static SqlSessionFactory sessionFactory;
    
    /**
     * @throws java.lang.Exception
     */
    @BeforeClass
    public static void setUpBeforeClass() throws Exception {
        SqlSessionFactoryBuilder factoryBuilder = new SqlSessionFactoryBuilder();
        InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        sessionFactory = factoryBuilder.build(inputStream);

    }
    
    //一对多,查询person(一)级联查询订单order(多)
    @Test
    public void testSelectPersonFetchOrder() throws Exception {
        SqlSession session = sessionFactory.openSession();
        Person person = session.selectOne("com.kerwin.mybatis.pojo.Person.selectPersonFetchOrder", 1);
        System.out.println(person);
        System.out.println(person.getOrderList().size());
        for(Orders orders : person.getOrderList()){
            System.out.println(orders);
        }
        session.close();
    }
    
    //多对一,查询订单order(多)级联查询person(一)
    @Test
    public void testSelectOrdersFetchPerson() throws Exception{
        SqlSession session = sessionFactory.openSession();
        Orders orders = session.selectOne("com.kerwin.mybatis.pojo.Orders.selectOrdersFetchPerson", 1);
        System.out.println(orders);
        System.out.println(orders.getPerson());
        session.close();
    }
    
}

五、测试结果

1.一对多,查询person(一)级联查询订单order(多)


2.多对一,查询订单order(多)级联查询person(一)


注意:两张表中的主键id字段名要唯一,例如不能都写id,不然的话,在一对多查询的时候就会出现:级联出来的订单项只有一条记录。我之前就是将两张表的主键id字段名都写为id,导致测试结果级联出来的多一直只有一条数据,具体如下:

原文地址:https://www.cnblogs.com/austinspark-jessylu/p/6591209.html