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>
原文地址:https://www.cnblogs.com/kaisadadi/p/7612289.html