mybatis08--关联查询多对一
根据省会的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>