MyBatis一对多和多对一

     在学习MyBatis3的过程中,文档上面一直在强调一个id的东西!在做这个实验的时候,也因为没有理解清楚id含义而导致 一对多的“多”中也只有一条数据。id和result的唯一不同是id表示的结果将是当比较对象实例时用到的标识属性。这帮助来改进整体表现,特别是缓存和嵌入结果映射。 所以不同数据的id应该唯一区别,不然导致数据 结果集只有一条数据。

一、表


二、实体

1.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;
	}

}

2.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
	}

}

三、映射mapper文件

1. 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>

2.     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>

3.sqlMapConfig.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

<typeAliases>
	<typeAlias type="com.kerwin.mybatis.pojo.Author" alias="Author"/>
</typeAliases>
  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <property name="driver" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
        <property name="username" value="root"/>
        <property name="password" value="root"/>
      </dataSource>
    </environment>
  </environments>
  <mappers>
	<mapper resource="com/kerwin/mybatis/pojo/AuthorMapper.xml"/>
	<mapper resource="com/kerwin/mybatis/pojo/PostMapper.xml"/>
	<mapper resource="com/kerwin/mybatis/pojo/PersonMapper.xml"/>
	<mapper resource="com/kerwin/mybatis/pojo/OrdersMapper.xml"/>
  </mappers>
</configuration>

四。测试类

/**
 * 
 */
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,导致测试结果级联出来的多一直只有一条数据,具体如下:



评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

君醉酒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值