MyBatis关联关系

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

MyBatis关联关系的相关文章

Mybatis关联关系配置(一对一、多对一)

BlogMapper.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="com.cj.dao.Blo

mybatis 关联关系查询 java

<mapper namespace="com.rrz.modules.awardrecord.dao.CheckAwardsDao"> <resultMap type="com.rrz.modules.awardrecord.entity.CheckAwards" id="checkAwardsMap"> <id property="id" column="id"/> &

JavaEE MyBatis

1.  简介 MyBatis本是apache的一个开源项目iBatis的升级版,2013年11月迁移到Github,是三层架构中持久层框架. 目前提供了Java..NET.以及Ruby三种语言实现的版本. 2.  提供一种“半自动化”的ORM实现.这种半自动化是相对Hibernate等提供了全面的数据库封装机制的“全自动化”ORM实现而言,“全自动”ORM实现了POJO和数据库表之间的映射,以及SQL的自动生成和执行:而MyBaits的着力点,则在于POJO与SQL之间的映射关系. 3.  Ja

mybatis学习笔记三(关联关系)

学习mybatis的关联关系,主要注解在代码上,这里不做解释.配置文件一样的就不贴了 1.关联关系表创建(学生对应老师 多对一) 学生老师表 2.表对应的实体类 package com.home.entity; /** * 此类是:学生 * @author hpc * @2017年1月14日下午7:06:33 */ public class Student { private Integer student_id;//学生id private String student_name;//学生名字

MyBatis学习笔记(二) 关联关系

今天主要学习的关联关系是一对一关系与一对多关系. 一.一对一关系 还是通过例子来解释说明.(一个妻子对应一个丈夫). 1)数据库信息 1 create table t_wife( 2 id int primary key auto_increment, 3 wife_name varchar(20), 4 fk_husband_id int 5 ); 6 7 create table t_husband( 8 id int primary key auto_increment, 9 husban

-------------------------------用MyBatis处理表与表之间的关联关系----------------------------------

1. 表与表的关联关系分为"一对多","多对一","自联查","多对多","一对一". 2.(1)第一种"一对多"的实例,就是一个国家有多个城市 先看下数据库一个country(国家) 和provincial(城市) --------------------------- (2)建好表之后,我们都知道一个国家有多个城市,所以在country实体类里加一个泛型集合list<provi

MyBatis对象关联关系---- association与collection

Mybatis处理“一对多”的关系时,需要用到associasion元素.处理”多对一“用collection元素来实现(这两个元素在之前mapper文件中提到过). 本例子中,假设一名User可以有多个Orders,用associasion来实现关联关系 首先数据库表结构 CREATE TABLE `user` ( `id` int(8) NOT NULL AUTO_INCREMENT, `username` varchar(20) COLLATE utf8_bin NOT NULL, `us

MyBatis(四)关于多表联查 关联关系之一--------一对多(单条sql语句查询)

在MyBatis中,进行多表联查时关联关系主要有这几种:一对多,多对一,多对多,还有一种自关联 1.一对多:有两种方式 (1)用一条sql语句进行查询    (以查询部门和员工为案例) 首先创建实体类 package entity; import java.util.List; /** * Created by mycom on 2018/2/26. */ public class Dept {//部门 private Integer deptNo; private String deptNam

mybatis一对一关联关系映射

mybatis一对一关联关系映射 在关联关系中,有一对一,一对多,多对多三种关联关系. 一对一关系:在操作上,任意一方引入对方的主键作为外键. 一对多关系:在"多"的一方添加"一"的一方的主键作为外键. 多对多关系:产生中间表引入两张表的主键作为外键,将两个主键作为联合主键或者引入新的字段作为这个中间表的主键. 一对一关联关系 例如person和IDcard,一个人只有一个身份证号,而一个身份证号只对应一个人. 以上是person表和IDcard表. public