浅谈collection标签的oftype属性能否为java.util.Map

collection标签的oftype属性能否为java.util.Map

基于mybatis-3.4.5.jar版本,结论是可以的。


    
    
    
    
        
        
    

其中,ofType写成map或java.util.HashMap都是可以的,当然写成pojo的完整名也是可以的,例如ofType="a.b.c.MultiLanguageVO" 

 
package *.*.*;  
import java.util.HashMap;
import java.util.List;
import java.util.Map; 
 
public class TestShowVO{ 
	private String id; 
	private String name; 
	private Integer priority; 
//	private List multiLanguageList; 
//	private List multiLanguageList;
	private List multiLanguageList; 
	public String getId() {
		return id;
	}
 
	public void setId(String id) {
		this.id = id;
	}
 
	public String getName() {
		return name;
	}
 
	public void setName(String name) {
		this.name = name;
	}
 
	public Integer getPriority() {
		return priority;
	}
 
	public void setPriority(Integer priority) {
		this.priority = priority;
	}
 
 
	public List getMultiLanguageList() {
		return multiLanguageList;
	}
 
	public void setMultiLanguageList(List multiLanguageList) {
		this.multiLanguageList = multiLanguageList;
	} 
}

collection聚集

聚集元素用来处理“一对多”的关系。需要指定映射的Java实体类的属性,属性的javaType(一般为ArrayList);列表中对象的类型ofType(Java实体类);对应的数据库表的列名称; 

不同情况需要告诉MyBatis 如何加载一个聚集。MyBatis 可以用两种方式加载: 

1. select: 执行一个其它映射的SQL 语句返回一个Java实体类型。较灵活; 

2. resultsMap: 使用一个嵌套的结果映射来处理通过join查询结果集,映射成Java实体类型。

例如,一个班级有多个学生。 

首先定义班级中的学生列表属性:private List studentList;

使用select实现聚集 

用法和联合很类似,区别在于,这是一对多,所以一般映射过来的都是列表。所以这里需要定义javaType为ArrayList,还需要定义列表中对象的类型ofType,以及必须设置的select的语句名称(需要注意的是,这里的查询student的select语句条件必须是外键classID)。

ClassMapper.xml文件部分内容:

  
      
      
      
      
      
  
 
  

StudentMapper.xml文件部分内容:

  
  
      
      
      
      
  
 
  
 

使用resultMap实现聚集 

使用resultMap,就需要重写一个sql,left join学生表。 

  
      
      
      
      
      
  
 
  

其中的teacherResultMap请见上面TeacherMapper.xml文件部分内容中。studentResultMap请见上面StudentMapper.xml文件部分内容中。

collection中的ofType="String"时

DTO:

package com.example.mybatis.entity;
import java.util.List;
/**
 * 统计部门下的员工名称(只查询出员工名称)
 */
public class ListString {
    // 部门id
    private int deptId;
    // 员工名称集合
    private List empNames;
    public ListString() {
    }
    public ListString(int deptId, List empNames) {
        this.deptId = deptId;
        this.empNames = empNames;
    }
    // getter
    ....
    // setter
    ....
}

mapper:

    
        
        
            
        
    
    

dao:

@Mapper
public interface EmployeeMapper {
    /**
     * 统计部门下的员工名称(只查询出员工名称)
     */
    ListString listStringTest(Integer deptId);
}

表中数据:

浅谈collection标签的oftype属性能否为java.util.Map_第1张图片

测试:

 /**
    * 统计部门下的员工名称(只查询出员工名称)
    */
    @Test
    public void deptWithEmpNameTest(){
        ListString listString = employeeMapper.listStringTest(1);
        System.out.println(listString);
    }

输出结果:

ListString{deptId=1, empNames=[小红1, 小红2, 小红3, 小红4, 小红5, 小红6, 小红7, 小红8, 小红9, 小红10]}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

你可能感兴趣的:(浅谈collection标签的oftype属性能否为java.util.Map)