mybatis07--关联查询一对多
Posted @想太多先森
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 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>
以上是关于mybatis07--关联查询一对多的主要内容,如果未能解决你的问题,请参考以下文章
mybatis 一对一关联 association 返回空值
SpringBoot与Mybatis整合(包含generate自动生成代码工具,数据库表一对一,一对多,关联关系中间表的查询)