Mybatais 08 关联查询多对一

 根据省会的id查询出省会和对应国家的信息 

01.多表的连接查询

修改对应的实体类信息

复制代码
/**
 *国家的实体类
 */
public class Country {
    
    private  Integer cId;    //国家的编号
    private  String cName;   //国家的名称
    
    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 Country(Integer cId, String cName) {
        super();
        this.cId = cId;
        this.cName = cName;
    }
    public Country() {
        super();
    }
    @Override
    public String toString() {
        return "Country [cId=" + cId + ", cName=" + cName ;
    }

}
复制代码
复制代码
/**
 * 
 *省会对应的实体类
 */
public class Provincial {
    private Integer pId;    //省会的编号
    private String pName;  //省会名称
    //关联的国家属性
    private  Country country;
    
    public Country getCountry() {
        return country;
    }
    public void setCountry(Country country) {
        this.country = country;
    }
    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 + ", country="
                + country + "]";
    }

    
    

}
复制代码

修改对应的dao和mapper

public interface ProvincialDao {
    /**
     * 根据省会的id查询出省会和对应国家的信息  
     */
    Provincial selectProvincialById(Integer pId);
}
复制代码
<?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.ProvincialDao">

<!-- 这里的resultMap和之前使用的不一样,哪怕属性和字段一致 也要书写
   因为mybatis在底层封装的时候,是根据我们resultMap中写的属性来的 -->
  <resultMap type="Provincial" id="provincialMap">
    <id property="pId" column="pid"/>
    <result property="pName" column="pname"/>
   <!--  设置关联的属性 -->
    <association property="country" javaType="Country">
         <id property="cId" column="cid"/>
        <result property="cName" column="cname"/>
    </association>
  </resultMap>
 <!-- 这是单表的关联查询   不经常使用  因为 不能使用延迟加载 -->
    <select id="selectProvincialById" resultMap="provincialMap">
      select  cid,cname,pid,pname from country,provincial
      where cid=countryid and pid=#{xxx}   <!--  #{xxx} 参数的占位符  -->
    </select>  
    
</mapper>
复制代码

mybatis.xml文件管理mapper文件

    <!-- 加载映射文件信息 -->
    <mappers>
        <mapper resource="cn/bdqn/dao/ProvincialMapper.xml" />
    </mappers>

测试类代码

复制代码
public class ProvincialTest {
    ProvincialDao dao;
    SqlSession session;

    @Before
    public void before() {
        // 因为需要关闭session 需要把session提取出去
        session = SessionUtil.getSession();
        dao = session.getMapper(ProvincialDao.class);
    }

    @After
    public void after() {
        if (session != null) {
            session.close();
        }
    }

    /**
     * 根据省会的id查询出省会和对应国家的信息  
     */
    @Test
    public void test1() {
         Provincial provincial = dao.selectProvincialById(1);
         System.out.println(provincial);
    }
    
}
复制代码

02.使用单表的单独查询

只需要修改mapper文件内容 其他代码不变

复制代码
<?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.ProvincialDao">
    
   <select id="selectCountryByProvincialId" resultType="Country">
    select cid,cname from country where cid=#{xxx}
    <!--#{xxx}就是resultMap 中 association节点中的column属性 -->
   </select>
    
    
    <resultMap type="Provincial" id="provincialMap">
    <id property="pId" column="pid"/>
    <result property="pName" column="pname"/>
    <!-- 设置关联的属性     select:关联的查询结果 -->
    <association property="country" javaType="Country"
     select="selectCountryByProvincialId" 
      column="countryid" />
  </resultMap>
    
    <!-- 多表的单独查询   常用的方式 可以使用延迟加载策略 -->
     <select id="selectProvincialById" resultMap="provincialMap">
      select  pid,pname,countryid from  provincial
      where  pid=#{xxx}   <!--  #{xxx} 用户传递参数的占位符  -->
    </select>
    
</mapper>
原文地址:https://www.cnblogs.com/kaisadadi/p/7612291.html