mybatis延迟加载一对多

1、实体类

package cn.bdqn.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 Country(Integer cId, String cName) {
        super();
        this.cId = cId;
        this.cName = cName;
    }

    public Country() {
        super();
    }

    public Set<Provincial> getProvincials() {
        return provincials;
    }

    public void setProvincials(Set<Provincial> provincials) {
        this.provincials = provincials;
    }

    @Override
    public String toString() {
        return "Country [cId=" + cId + ", cName=" + cName;
    }

}

2、dao层
package cn.bdqn.dao;

import cn.bdqn.bean.Country;

public interface CountryDao {
    /**
     * 根据国家的id查询出国家的信息  以及国家下面的省会信息
     */
    Country selectCountryById(Integer cId);
}

3、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.CountryDao">

    <select id="selectProvincialByCountryId" resultType="Provincial">
        select pid,pname from provincial
         where countryid=#{cid}
    </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=#{cid}
    </select> 

</mapper>

4、测试类

package cn.bdqn.test;

import org.apache.ibatis.session.SqlSession;
import org.apache.log4j.Logger;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import cn.bdqn.bean.Country;
import cn.bdqn.bean.Provincial;
import cn.bdqn.dao.CountryDao;
import cn.bdqn.dao.ProvincialDao;
import cn.bdqn.util.MybatisUtil;

public class Test1 {
    private Logger logger = Logger.getLogger(Test1.class);
    SqlSession session;
    ProvincialDao dao;
    CountryDao dao2;

    @Before
    public void before() {
        // 因为需要关闭session 需要把session提取出去
        session = MybatisUtil.getSqlSession();
        dao = session.getMapper(ProvincialDao.class);
        dao2 = session.getMapper(CountryDao.class);
    }

    @After
    public void after() {
        if (session != null) {
            session.close();
        }
    }

    @Test
    public void test1() {
        Provincial provincial = dao.selectProvincialById(1);
        /*logger.debug("provincialId=1======>provincial:" + provincial);*/
        /*logger.debug("provincialId=1======>country:" + provincial.getCountry());*/
    }

    @Test
    public void test2() {
        Country country = dao2.selectCountryById(1);
        /*Set<Provincial> provincials = country.getProvincials();
        for (Provincial provincial : provincials) {
            logger.debug(provincial);
        }*/
        /*logger.debug("provincialId=1======>provincial:" + provincial);*/
        /*logger.debug("provincialId=1======>country:" + provincial.getCountry());*/
    }
}
 
时间: 2024-11-03 21:27:44

mybatis延迟加载一对多的相关文章

mybatis延迟加载——(十二)

1.     什么是延迟加载 resultMap可以实现高级映射(使用association.collection实现一对一及一对多映射),association.collection具备延迟加载功能. 需求: 如果查询订单并且关联查询用户信息.如果先查询订单信息即可满足要求,当我们需要查询用户信息时再查询用户信息.把对用户信息的按需去查询就是延迟加载. 延迟加载:先从单表查询.需要时再从关联表去关联查询,大大提高 数据库性能,因为查询单表要比关联查询多张表速度要快. 2.    打开延迟加载开

mybatis的一对多,多对一,以及多对对的配置和使用

1.本文章是无意中看见易百教程的Mybatis教程才注意到这个问题,平时都仅仅是在用CRUD,忽略了这方面的问题,真实十分羞愧 2.首先我们开始对mybatis的一对多的探究 根据这个应用场景,我们需要获取在查询一个用户信息的时候还要去读取这个用户发布的帖子 现在我们来看一看用户级联文章在JavaBean中的编写方式,这就是一对多在JavaBean中的配置 现在我们再来看一看Mybatis的Mapper该如何编写一对多?很简单,就是在resultMap标签中配置<collection>标签,用

mybatis的一对多

1.配置文件 db.properties db.driver=com.mysql.jdbc.Driver db.url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf8 db.username=root db.password=123456 SqlMapConfig.xml 1 <?xml version="1.0" encoding="UTF-8" ?

MyBatis延迟加载和缓存

一.延迟加载 1.主对象的加载: 根本没有延迟的概念,都是直接加载. 2.关联对象的加载时机: 01.直接加载: 访问主对象,关联对象也要加载 02.侵入式延迟: 访问主对象,并不加载关联对象 访问主对象属性的属性的时候,关联对象会被加载 03.深度延迟 访问主对象,并不加载关联对象 访问主对象的属性的时候,关联对象也不会被加载 访问关联对象或关联对象的属性的时候,才会加载关联对象. 3.一对多延迟加载代码: 01.实体类代码: package cn.pb.bean; import java.u

Mybatis延迟加载、缓存、逆向工程

一.Mybatis中的延迟加载 1.延迟加载背景:Mybatis中Mapper配置文件中的resultMap可以实现高级映射(使用association.collection实现一对一及一对多(多对多)映射),同样的association.collection具备延迟加载功能.所谓延迟加载,就是先单表查询,需要时再从关联表去关联查询(同样也可能只是是单表查询),大大单表查询速度更快,所以可以间接的提高数据库性能 2.在mybatis核心配置文件中配置,其中lazyLoadingEnabled表示

Mybatis延迟加载的实现以及使用场景

首先我们先思考一个问题,假设:在一对多中,我们有一个用户,他有100个账户. 问题1:在查询用户的时候,要不要把关联的账户查出来? 问题2:在查询账户的时候,要不要把关联的用户查出来? 解答:在查询用户的时候,用户下的账户信息应该是我们什么时候使用,什么时候去查询. 在查询账户的时候,账户的所属用户信息应该是随着账户查询时一起查询出来. 搞清楚这两个简单的问题后,我们就可以引出延迟加载和立即加载的特性. 延迟加载:在真正使用数据的时候才发起查询,不用的时候不查询关联的数据,延迟加载又叫按需查询(

Mybatis学习——一对多关联表查询

1.实体类 1 public class Student { 2 private int id; 3 private String name; 4 } 5 public class Classes { 6 private int id; 7 private String name; 8 private Teacher teacher; 9 private List<Student> students; 10 } 2.映射文件 1 <?xml version="1.0"

测试mybatis延迟加载错误与解决方法

什么是延迟加载? 延迟加载又叫懒加载,也叫按需加载,也就是说先加载主信息,需要的时候,再去加载从信息. 需求: 查询订单信息,需要时再去查询用户信息 实现方式: 编写两个statement,其中一个statement是查询订单信息,一个是查询用户信息,但是查询订单信息的statement要使用resultMap标签进行结果映射. Mapper接口: /**  * 延迟加载  查询订单 需要时在查询用户信息  * */  public List<OrderExt> lazyLoading();

Mybatis延迟加载

现在有这么一个需求,要查询所有的订单,并且获得该订单的详细信息. 如果一次性把所有需要的数据都请求到,那么对服务器和数据库的开销会很大,所以可以先加载订单信息,需要用到订单详情的时候再请求详情数据. 那么就要用到mybatis的延迟加载 开启延迟加载 在mybaits配置文件中添加设置 <!--延迟加载--> <setting name="lazyLoadingEnabled" value="true"/> <setting name=