zoukankan      html  css  js  c++  java
  • 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>
  • 相关阅读:
    java strtus2 拦截器(Interceptors)
    java ssm框架入门(三)正式项目的web.xml配置
    java Web监听器导图详解
    java web hello world(二)基于Servlet理解监听
    java ssm框架入门(二)添加语言滤器
    java web 自定义filter
    Java内存分配全面浅析
    Velocity !$ 和$!区别
    spring ioc原理(看完后大家可以自己写一个spring)
    Spring的AOP简单理解
  • 原文地址:https://www.cnblogs.com/HHR-SUN/p/7201503.html
Copyright © 2011-2022 走看看