MyBatis笔记 | 详解resultType和resultMap

目录

一、resultType

1、select返回List

2、select记录封装Map

3、返回单个实体类的Map

4、返回多个实体类的Map

二、resultMap

1、通过resultMap实现高级结果映射集

2、使用resultMap进行关联查询

3、使用级联属性封装结果来进行关联查询

4、使用association定义关联对象封装规则

5、使用association进行分步查询

6、使用collection定义关联的集合类型元素的封装规则

7、使用collection定义关联的集合元素分步查询

8、使用discriminator鉴别器


一、resultType

从这条语句中返回的期望类型的类的完全限定名或别名,注意如果是集合,那应该是集合可以包含的类型,而不能是集合本身。
下面我们来讨论其返回List和Map的情况:

1、select返回List

在select元素中,如果返回的是一个集合,要在sql映射中写集合中元素的类型。

我们想实现通过名字来进行模糊查询,返回Employee类型的List集合。

public List<Employee> getEmpsByLastNameLike(String lastName);

然后我们在sql映射文件中配置如下:

<select id="getEmpsByLastNameLike" resultType="com.cerr.mybatis.Employee">
        select * from tb1_employee where last_name like #{lastName}
</select>

注意resultType填入的是Employee的类型而不是List类型。

测试方法,查询名字带有e的:

package com.cerr.mybatis;
import com.cerr.mybatis.dao.EmployeeMapper;
import com.cerr.mybatis.dao.EmployeeMapperAnnotation;
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 java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static org.junit.Assert.*;
public class MyBatisTest {

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

    @Test
    public void test9() throws IOException {
        //获取SqlSessionFactory
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
        //获取SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        try {
            //获取接口的实现类对象:会为接口自动的创建一个代理对象,代理对象去执行增删改查
            EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);

            //调用方法
            List<Employee> list = employeeMapper.getEmpsByLastNameLike("%e%");
            for (Employee employee : list){
                System.out.println(employee);
            }

        }finally {
            //关闭
            sqlSession.close();
        }
    }
}

结果:

 

 
13424350-328f8e186678575c.png
 

 

2、select记录封装Map

有两种情况,一种是返回单个实体类的Map;另一种是返回多个实体类的Map。

3、返回单个实体类的Map

如果返回的是单个实体类的Map,那么在select元素中的resultType的值就是map

我们想返回的Map是key为记录的列名,值为记录的值。我们首先在接口中定义一个方法:

public Map<String,Object> getEmpByIdReturnMap(Integer id);

然后在sql映射文件中给予配置,注意resultType的值是map

package com.cerr.mybatis;

import com.cerr.mybatis.dao.EmployeeMapper;
import com.cerr.mybatis.dao.EmployeeMapperAnnotation;
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 java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static org.junit.Assert.*;

public class MyBatisTest {

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

    @Test
    public void test8() throws IOException {
        //获取SqlSessionFactory
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
        //获取SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        try {
            //获取接口的实现类对象:会为接口自动的创建一个代理对象,代理对象去执行增删改查
            EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);
            Map<String,Object> map = employeeMapper.getEmpByIdReturnMap(1);
            System.out.println(map);
        }finally {
            //关闭
            sqlSession.close();
        }
    }
}

4、返回多个实体类的Map

我们想返回多个实体类的Map的话,那么resultType的值应该是实体类,而不是map本身。

我们想返回多个Employee组成的Map,key为Employee中的id顺序,在这里我们需要使用到@MapKey注解来指明我们要封装哪个属性为Map的key,值是Employee对象,我们先在接口中定义方法:

    //告诉MyBatis封装这个Map的时候使用哪个属性作为Map的key
    @MapKey("id")
    public Map<Integer,Employee> getEmpByLastNameReturnMap(String lastName);

SQL 映射文件:

    <select id="getEmpByLastNameReturnMap" resultType="com.cerr.mybatis.Employee">
        select * from tb1_employee where last_name like #{lastName}
    </select>

测试方法:

public class MyBatisTest {

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

    @Test
    public void test9() throws IOException {
        //获取SqlSessionFactory
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
        //获取SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        try {
            //获取接口的实现类对象:会为接口自动的创建一个代理对象,代理对象去执行增删改查
            EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);

            Map<Integer,Employee> map = employeeMapper.getEmpByLastNameReturnMap("%e%");
            System.out.println(map);
        }finally {
            //关闭
            sqlSession.close();
        }
    }
}

结果:

 

 
13424350-8450543c4d9ec890.png
 

 


二、resultMap

1、通过resultMap实现高级结果映射集

其属性如下:

  • type:自定义规则的Java类型
  • id:唯一id方便引用
<mapper namespace="com.cerr.mybatis.dao.EmployeeMapperPlus">
    <!-- 定义封装规则 -->
    <resultMap id="myEmp" type="com.cerr.mybatis.Employee">
        <id column="id" property="id"/>
        <result column="last_name" property="lastName"/>
        <
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值