第四个MyBatis程序——一对多查询 参考动力节点

类定义

首相类

package rodisland;

import java.util.Set;

public class Country 
{
	private int cid;
	private String cname;
	private Set<Minister> ministers;
	public int getCid() {
		return cid;
	}
	public void setCid(int cid) {
		this.cid = cid;
	}
	public String getCname() {
		return cname;
	}
	public void setCname(String cname) {
		this.cname = cname;
	}
	public Set<Minister> getMinister() {
		return ministers;
	}
	public void setMinister(Set<Minister> ministers) {
		this.ministers = ministers;
	}
	@Override
	public String toString() {
		return "Country [cid=" + cid + ", cname=" + cname + ", minister=" + ministers + "]";
	}
	

}

内阁成员类

package rodisland;

public class Minister 
{
	private int mid;
	private String mname;
	public int getMid() {
		return mid;
	}
	public void setMid(int mid) {
		this.mid = mid;
	}
	public String getMname() {
		return mname;
	}
	public void setMname(String mname) {
		this.mname = mname;
	}
	@Override
	public String toString() {
		return "Minister [mid=" + mid + ", mname=" + mname + "]";
	}

}

由以上类的定义可知,一个首相可以对应多个内阁成员,通过查询首相id,获得该首相的所有内阁成员集合即为一对多查询

表定义

country


minister

Dao接口

package rodisland;
public interface Dao 
{	
	Country selectCountryById(int cid);
	//Country selectMinisterByCountry(int cid);
}

测试方法

public class Mytest 
{
	private Dao dao;
	private SqlSession session;
	@Before
	public void before()
	{
		session=MyBatisUtil.getSqlSession();
		dao=session.getMapper(Dao.class);
	}
	@After
	public void after()
	{
		if(session !=null)
			session.close();
	}
	
	@Test
	public void Test01()
	{
		Country country =dao.selectCountryById(1);
		System.out.println(country);
	}
	
	
}

映射文件

(1)多表连接查询

<?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="rodisland.Dao">
<resultMap type="Country" id="countryMapper">
<id column="cid" property="cid"/>
<result column="cname" property="cname"/>
<collection property="ministers" ofType="Minister">
<id column="mid" property="mid"/>
<result column="mname" property="mname"/>
</collection>
</resultMap>

<!--多表连接查询-->
<select id="selectCountryById" resultMap="countryMapper">
select cid,cname,mid,mname
from country,minister
where cid=#{xxx} and cid=countryid
</select>
</mapper>

解析:此方法相当于SQL中的内连接

 执行的语句为:select cid,cname,mid,mname from country,minister where cid=? and cid=countryid 

即使字段名和属性名相同,此处也要写好resultMap的映射关系,因为要根据resultMap进行对象的封装

property:指定Country的关联属性,也就是Country类里的集合名

ofType:集合属性的泛型类型

 

 

(2)多表单独查询

<select id="selectMinisterByCountry" resultType="Minister">
	select mid,mname from minister where countryId=#{xxx}
</select>

<resultMap type="Country" id="countryMapper">
<id column="cid" property="cid"/>
<result column="cname" property="cname"/>
<collection property="ministers" ofType="Minister"
			select="selectMinisterByCountry"
			column="cid"/>
</resultMap>
<select id="selectCountryById" resultMap="countryMapper">
select cid,cname from country where cid=#{cid}
</select>

解析:

执行的语句为:

select cid,cname from country where cid=?

 

select mid,mname from minister where countryId=?

 

执行步骤

先执行select标签中设定的,id为selectCountryById的方法

设该方法参数为1,则查询结果为:

cid=1,cname=USA

<collection property="ministers" ofType="Minister"
			select="selectMinisterByCountry"
			column="cid"/>

在该设定中,Country类的ministers集合,要通过select中设定的selectMinisterByCountry方法获得,其中selectMinisterByCountry的参数由column指定。

则ministers=select mid,mname from minister where countryId=1

获取对应的ministers集合。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值