1、一对多:一个国家对应多个城市
01.实体类
package cn.pb.bean; import java.util.Set; /** * 国家的实体类 */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) { this.cId = cId; this.cName = cName; this.provincials = provincials; } public Country() { } @Override public String toString() { return "Country{" + "cId=" + cId + ", cName=‘" + cName + ‘\‘‘ + ", provincials=" + provincials + ‘}‘; }}
package cn.pb.bean; /** * 省会对应的实体类 */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 + "]"; }}
02.创建对应的dao和mapper文件
public interface CountryDao { /** * 根据国家的id查询出国家的信息 以及国家下面的省会信息 */ Country selectCountryById(Integer cId); }
03.mapper.xm文件=====单条SQL不能使用延迟加载
<?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>
04.mapper.xm文件=====多条SQL可以使用延迟加载
<?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="com.xdf.dao.CountryDao"> <!--必须是对应的dao接口的全类名--> <!--01 根据国家的编号 查询出 国家的信息 xxx就是用户输入的值--><select id="selectCountryById" resultMap="countryMap"> select cid,cname from country where cid=#{xxx}</select><!--02 根据国家的编号 查询出 国家对应的省会信息 xxx 谁给传值--><select id="selectProvincialByCid" resultType="Provincial"> select pid,pname from provincial where countryid=#{xxx}</select> <!--对应的countryMap 这种方式 推荐使用 因为使用使用延迟加载--><resultMap id="countryMap" type="Country"> <id property="cId" column="cid"/> <result property="cName" column="cname"/> <!-- select: 指的是关联sql语句的id ===》根据国家的编号 查询出 国家对应的省会信息的sql column:关联sql语句需要的参数 --> <collection property="provincials" ofType="Provincial" select="selectProvincialByCid" column="cid"/></resultMap> </mapper>
05.在MyBatis.xml文件中 管理Mapper文件
<!-- 加载映射文件信息 --> <mappers> <mapper resource="cn/bdqn/dao/CountryMapper.xml" /> </mappers>
06.测试类代码
public class CountryTest { CountryDao dao=null; SqlSession session=null; Logger log=Logger.getLogger(CountryTest.class);
/** * 在所有的test测试方法执行之前 都要执行的操作 */ @Before public void before(){ //获取session session= SessionFactoryUtil.getSession(); dao=session.getMapper(CountryDao.class); //获取执行的类对象 } @After public void after(){ if (session!=null){ session.close(); } } /** * 根据国家的编号 查询出 国家对应省会的信息 * 没有延迟加载 */ @Test public void selectCountry(){ Country country = dao.selectCountryById(1); log.debug(country); } /** * 根据国家的编号 查询出 国家对应省会的信息 * 设置延迟加载 *01.在mybati核心配置文件中 增加setting节点 *02.节点中增加 * <setting name="lazyLoadingEnabled" value="true"/> * <setting name="aggressiveLazyLoading" value="false"/> */ @Test public void selectCountryLazy(){ Country country = dao.selectCountryById(2); log.debug(country.getcName()); //只查询国家的名称 如果开启了延迟加载有1条sql log.debug(country.getcName()); //只查询国家的名称 如果没开启了延迟加载有2条sql log.debug(country.getProvincials()); //查询国家对应的省会 无论有没有开启了延迟加载都有2条sql } }
07.在MyBatis.xml中核心配置文件中的配置延迟加载
<settings><!--开启延迟加载 默认值是 false--><setting name="lazyLoadingEnabled" value="true"/><!-- 我们的一个实体类中可以有多个延迟加载属性不?? 肯定可以! 当启用后,一个有延迟加载属性的对象的任何一个延迟属性被加载时,该对象的所有的属性都会被加载。 否则,所有属性都是按需加载。默认值是true --><setting name="aggressiveLazyLoading" value="false"/></settings>
2、多对一:多个城市对应一个国家
01.实体类
package cn.pb.bean; /** * 国家的实体类 */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 ; } }
package cn.pb.bean; /** * 省会对应的实体类 */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 + "]"; } }
02.创建对应的dao和mapper文件
public interface CountryDao { /** * 根据省会的id 查询出 省会 以及对应的国家 */ Provincial selectProvincialById(Serializable id);}
03.mapper.xm文件=====单条SQL不能使用延迟加载
<?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.pb.dao.ProvincialDao"> <resultMap id="provincialMap" type="Provincial"> <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>
04.mapper.xm文件=====多条SQL可以使用延迟加载
<?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="com.xdf.dao.CountryDao"> <!--必须是对应的dao接口的全类名--><!-- 01. 根据省会的id 查询出 省会的信息--><select id="selectProvincialById" resultMap="provincialMap"> select pid,pname,countryid from provincial where pid=#{xxx}</select><!-- 02. 根据省会的id 查询出 对应国家的信息 xxx就是resultmap中传递来的 countryid--><select id="selectCountryById" resultType="Country"> select cid,cname from country where cid=#{xxx}</select> <!--对应的countryMap 这种方式 推荐使用 因为使用延迟加载--><resultMap id="provincialMap" type="Provincial"><id property="pId" column="pid"/><result property="pName" column="pname"/><!-- Provincial有一个属性的类型是 Country 域属性 javaType:域属性对应的类型 --><association property="country" javaType="Country" select="selectCountryById" column="countryid"/></resultMap> </mapper>
05.在MyBatis.xml文件中 管理Mapper文件
<!-- 加载映射文件信息 --> <mappers> <mapper resource="cn/bdqn/dao/ProvincialMapper.xml" /> </mappers>
06.测试类代码
public class CountryTest { CountryDao dao=null; SqlSession session=null; Logger log=Logger.getLogger(CountryTest.class); /** * 在所有的test测试方法执行之前 都要执行的操作 */ @Before public void before(){ //获取session session= SessionFactoryUtil.getSession(); dao=session.getMapper(CountryDao.class); //获取执行的类对象 } @After public void after(){ if (session!=null){ session.close(); } } /** * 根据国家的编号 查询出 国家对应省会的信息 * 设置延迟加载 *01.在mybati核心配置文件中 增加setting节点 *02.节点中增加 * <setting name="lazyLoadingEnabled" value="true"/> * <setting name="aggressiveLazyLoading" value="false"/> */ @Test public void selectCountryLazy(){ Provincial provincial = dao.selectProvincialById(1); //开启延迟加载的情况 直接输出省会的名称 执行1条sql log.debug(provincial.getpName()); log.debug(provincial.getCountry().getcName()); //执行2条 } }
时间: 2024-11-16 11:35:53