目录
6、使用collection定义关联的集合类型元素的封装规则
一、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();
}
}
}
结果:
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();
}
}
}
结果:
二、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"/>
<