首页 > 代码库 > mybatis07--关联查询一对多

mybatis07--关联查询一对多

 案例   查询国家的同时,查询出国家下的省会信息!

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 mapperPUBLIC "-//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 mapperPUBLIC "-//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>

 

mybatis07--关联查询一对多