Mybatais 07 关联查询一对多
案例 查询国家的同时,查询出国家下的省会信息!
01.使用单表的连接查询
创建对应的实体类 和数据库表
/**
*
*国家的实体类
*/
public class Country {
private Integer cId; //国家的编号
private String cName; //国家的名称
//关联省会的属性
private Set<Provincial> provincials;
public Integer getcId() {
return cId;
}
public void setcId(Integer cId) {
this.cId = cId;
}
public String getcName() {
return cName;
}
public void setcName(String cName) {
this.cName = cName;
}
public Set<Provincial> getProvincials() {
return provincials;
}
public void setProvincials(Set<Provincial> provincials) {
this.provincials = provincials;
}
public Country(Integer cId, String cName, Set<Provincial> provincials) {
super();
this.cId = cId;
this.cName = cName;
this.provincials = provincials;
}
public Country() {
super();
}
@Override
public String toString() {
return "Country [cId=" + cId + ", cName=" + cName + ", provincials="
+ provincials + "]";
}
}
/**
*
*省会对应的实体类
*/
public class Provincial {
private Integer pId; //省会的编号
private String pName; //省会名称
public Integer getpId() {
return pId;
}
public void setpId(Integer pId) {
this.pId = pId;
}
public String getpName() {
return pName;
}
public void setpName(String pName) {
this.pName = pName;
}
public Provincial(Integer pId, String pName) {
super();
this.pId = pId;
this.pName = pName;
}
public Provincial() {
super();
}
@Override
public String toString() {
return "Provincial [pId=" + pId + ", pName=" + pName + "]";
}
}




创建对应的dao和mapper文件
public interface CountryDao {
/**
* 根据国家的id查询出国家的信息 以及国家下面的省会信息
*/
Country selectCountryById(Integer cId);
}
<?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="cn.bdqn.dao.CountryDao">
<!-- 这里的resultMap和之前使用的不一样,哪怕属性和字段一致 也要书写
因为mybatis在底层封装的时候,是根据我们resultMap中写的属性来的 -->
<resultMap type="Country" id="countryMap">
<id property="cId" column="cid"/>
<result property="cName" column="cname"/>
<!-- 设置关联的集合属性 -->
<collection property="provincials" ofType="Provincial">
<id property="pId" column="pid"/>
<result property="pName" column="pname"/>
</collection>
</resultMap>
<!-- 这是单表的关联查询 不经常使用 因为 不能使用延迟加载 -->
<select id="selectCountryById" resultMap="countryMap">
select cid,cname,pid,pname from country,provincial
where cid=countryid and cid=#{xxx} <!--#{xxx} 参数的占位符 -->
</select>
</mapper>
在MyBatis.xml文件中 管理Mapper文件
<!-- 加载映射文件信息 -->
<mappers>
<mapper resource="cn/bdqn/dao/CountryMapper.xml" />
</mappers>
测试类代码
public class CountryTest {
CountryDao dao;
SqlSession session;
@Before
public void before() {
// 因为需要关闭session 需要把session提取出去
session = SessionUtil.getSession();
dao = session.getMapper(CountryDao.class);
}
@After
public void after() {
if (session != null) {
session.close();
}
}
/**
* 根据国家的id查询出国家的信息 以及国家下面的省会信息
*/
@Test
public void test1() {
Country country = dao.selectCountryById(1);
System.out.println(country);
}
}
02.使用多表的查询
修改mapper.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="cn.bdqn.dao.CountryDao">
<select id="selectProvincialByCountryId" resultType="Provincial">
select pid,pname from provincial
where countryid=#{xxx}
<!--#{xxx} 对应的就是resultMap中 collection节点下面的column -->
</select>
<resultMap type="Country" id="countryMap">
<id property="cId" column="cid"/>
<result property="cName" column="cname"/>
<!--设置关联的集合属性
select:需要关联的查询语句
column: select关联语句中需要的参数 -->
<collection property="provincials" ofType="Provincial"
select="selectProvincialByCountryId"
column="cid"/>
</resultMap>
<!-- 多表的查询 经常使用 可以使用延迟加载策略 -->
<select id="selectCountryById" resultMap="countryMap">
select cid,cname from country where cid=#{xxx}
<!--#{xxx} 用户传递过来的ID -->
</select>
</mapper>
核心配置文件中的配置
<settings>
<!-- 全局性地启用或禁用延迟加载。当禁用时,所有关联的配置都会立即加载。 -->
<setting name="lazyLoadingEnabled" value="true"/>
<!--当启用后,一个有延迟加载属性的对象的任何一个延迟属性被加载时,该对象
的所有的属性都会被加载。否则,所有属性都是按需加载。 -->
<setting name="aggressiveLazyLoading" value="false"/>
</settings>

浙公网安备 33010602011771号