mybatis文件映射之利用延迟加载解决collection分布查询(六)

Employee.java

public class Employee {
    private Integer id;
    private String lastName;
    private String gender;
    private String email;
    Department dept;
}

Department.java

public class Department {
    private Integer id;
    private String deptName;
    private List<Employee> employee;
}

EmployeeMapperPlus.java

public interface EmployeeMapperPlus {
    public List<Employee> getEmpsByDeptId(Integer id);
}

EmployeeMapperPlus.xml

    <select id="getEmpsByDeptId" resultType="com.gong.mybatis.bean.Employee">
        select * from tbl_employee where d_id=#{deptId}
    </select>

DepartmentMapper.java

public interface DepartmentMapper {
    public Department getDeptByIdStep(Integer id);
}

DepartmentMapper.xml

    <resultMap type="com.gong.mybatis.bean.Department" id="MyDeptStep">
        <id column="id" property="id"/>
        <result column="dept_name" property="deptName"/>
        <collection property="employee" select="com.gong.mybatis.dao.EmployeeMapperPlus.getEmpsByDeptId"
        column="id">
        </collection>
    </resultMap>
    <select id="getDeptByIdStep" resultMap="MyDeptStep">
        select id,dept_name from tbl_department where id=#{id}
    </select>

同样的在mybatis配置文件中:

    <settings>
        <setting name="lazyLoadingEnabled" value="true"/>
        <setting name="aggressiveLazyLoading" value="false"/>
    </settings>

最后进行测试:

package com.gong.mybatis.test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import com.gong.mybatis.bean.Department;
import com.gong.mybatis.bean.Employee;
import com.gong.mybatis.dao.DepartmentMapper;
import com.gong.mybatis.dao.EmployeeMapperPlus;

public class TestMybatis2 {

    public SqlSessionFactory getSqlSessionFactory() throws IOException {
        String resource = "mybatis-config.xml";
        InputStream is = Resources.getResourceAsStream(resource);
        return new SqlSessionFactoryBuilder().build(is);
    }

    @Test
    public void test2() throws IOException {
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
        SqlSession openSession = sqlSessionFactory.openSession();
        try {
            DepartmentMapper mapper = openSession.getMapper(DepartmentMapper.class);
            Department department = mapper.getDeptByIdStep(1);
            System.out.println(department.getDeptName());
            openSession.commit();
        } finally {
            openSession.close();
        }

    }

}

首先我们只需要部门的名字:

结果:

DEBUG 01-20 19:35:58,093 ==> Preparing: select id,dept_name from tbl_department where id=? (BaseJdbcLogger.java:145)
DEBUG 01-20 19:35:58,167 ==> Parameters: 1(Integer) (BaseJdbcLogger.java:145)
DEBUG 01-20 19:35:58,299 <== Total: 1 (BaseJdbcLogger.java:145)
开发部

sql语句只发送了一次。

接下来我们需要部门里面员工信息:

添加:

System.out.println(department.getEmployee());

结果:

DEBUG 01-20 19:50:48,861 ==> Preparing: select id,dept_name from tbl_department where id=? (BaseJdbcLogger.java:145)
DEBUG 01-20 19:50:48,948 ==> Parameters: 1(Integer) (BaseJdbcLogger.java:145)
DEBUG 01-20 19:50:49,123 <== Total: 1 (BaseJdbcLogger.java:145)
开发部
DEBUG 01-20 19:50:49,125 ==> Preparing: select * from tbl_employee where d_id=? (BaseJdbcLogger.java:145)
DEBUG 01-20 19:50:49,126 ==> Parameters: 1(Integer) (BaseJdbcLogger.java:145)
DEBUG 01-20 19:50:49,129 <== Total: 2 (BaseJdbcLogger.java:145)
[Employee [id=1, lastName=xiximayou, gender=1, [email protected], dept=null], Employee [id=3, lastName=小红, gender=0, [email protected], dept=null]]

发送了两条sql语句。

原文地址:https://www.cnblogs.com/xiximayou/p/12219217.html

时间: 2024-07-29 02:17:55

mybatis文件映射之利用延迟加载解决collection分布查询(六)的相关文章

mybatis文件映射之利用collection定义关联集合(五)

Employee.java public class Employee { private Integer id; private String lastName; private String gender; private String email; Department dept; } Department.java public class Department { private Integer id; private String deptName; private List<Emp

Python与数据库[2] -&gt; 关系对象映射/ORM -&gt; 利用 sqlalchemy 实现关系表查询功能

利用 sqlalchemy 实现关系表查询功能 下面的例子将完成一个通过关系表进行查询的功能,示例中的数据表均在MySQL中建立,建立过程可以使用 SQL 命令或编写 Python 适配器完成. 示例中用到的表主要有3张,一张personInfo个人信息表,一张account_store账号信息表,以及一张person_account_rel的个人信息与账号关系表. 示例中将会通过已知的人物年龄和id通过个人信息表查出个人姓名(仅为参考示例,请忽略怪异的查找逻辑 :) ),随后根据关系表得到的人

mybatis文件映射之select操作返回Map

1.返回的Map键为列所对应的名称,值就是具体的值 EmployeeMapper.java public Map<String,Object> getEmpByIdReturnMap(Integer id); EmployeeMapper.xml <select id="getEmpByIdReturnMap" resultType="map"> select id,last_name lastName,gender,email from t

【MyBatis】映射文件示例

本文以实例说明Mapper文件的标签的使用. 配置文件在[MyBatis]配置文件示例 DAO文件 DepartmentMapper.java package com.atguigu.mybatis.dao; import com.atguigu.mybatis.bean.Department; public interface DepartmentMapper { public Department getDeptById(Integer id); public Department getD

mybatis中映射文件和实体类的关联性

mybatis的映射文件写法多种多样,不同的写法和用法,在实际开发过程中所消耗的开发时间.维护时间有很大差别,今天我就把我认为比较简单的一种映射文件写法记录下来,供大家修改建议,争取找到一个最优写法~~: 以User对象和UserMap.xml为例讲解,代码如下: User为用户实体类(仅作为讲解,可以只关注引用类型变量,get/set方法省略): import com.google.common.collect.Lists; import com.gukeer.common.persisten

利用MyEclipse自动创建PO类、hbm文件(映射文件)、DAO

前提条件:表sjzdfl  表sjzdxx (使用数据库MySQL) 表sjzdfl (两个字段sjzdflId 和 sjzdflmc) 表sjzdfl 建表语句: [sql] view plaincopy DROP TABLE IF EXISTS `sjzdfl`; CREATE TABLE `sjzdfl` ( `sjzdflId` int(11) NOT NULL auto_increment, `sjzdflmc` varchar(255) default NULL, PRIMARY K

springboot整合mybatis(映射文件方式和注解方式)

springboot作为一个微服务框架,给我们开发人员提供极大的便利,秉着约定大于配置的原则,通过starter包的形式为我们做了许多默认的配置,在进行数据持久化到关系型数据库时,我们一般都会首选spring data jpa,springboot为我们提供了starter包,只需配置很少的参数,就能满足我们的需求,非常方便.但是当我们遇到一些比较复杂的查询.多表关联查询及动态sql时,mybatis则在这方面更出色,并且在使用mybatis时我们可以通过sql优化来提高查询效率,springb

MyBatis XML 映射配置文件

MyBatis 的配置文件包含了影响 MyBatis 行为甚深的设置(settings)和属性(properties)信息.文档的顶层结构如下: configuration 配置 properties 属性 settings 设置 typeAliases 类型命名 typeHandlers 类型处理器 objectFactory 对象工厂 plugins 插件 environments 环境 environment 环境变量 transactionManager 事务管理器 dataSource

MyBatis之Mapper XML 文件详解(四)-JDBC 类型和嵌套查询

支持的 JDBC 类型为了未来的参考,MyBatis 通过包含的 jdbcType 枚举型,支持下面的 JDBC 类型. BITFLOATCHARTIMESTAMPOTHERUNDEFINEDTINYINTREALVARCHARBINARYBLOBNVARCHARSMALLINTDOUBLELONGVARCHARVARBINARYCLOBNCHARINTEGERNUMERICDATELONGVARBINARYBOOLEANNCLOBBIGINTDECIMALTIMENULLCURSORARRAY