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>
核心配置文件中的配置
<settings> <!-- 全局性地启用或禁用延迟加载。当禁用时,所有关联的配置都会立即加载。 --> <setting name="lazyLoadingEnabled" value="true"/> <!--当启用后,一个有延迟加载属性的对象的任何一个延迟属性被加载时,该对象 的所有的属性都会被加载。否则,所有属性都是按需加载。 --> <setting name="aggressiveLazyLoading" value="false"/> </settings>