MyBatis3 的 resultMap 是一个配置元素(configuration element),用来声明一个自定义查询结果映射。在 MyBatis3 中,有三种类型的 resultMap:resultMap、association 和 collection。每个 resultMap 有一个唯一的标识 ID,通过 SQL Mapper 中的 select 映射元素(select element)引用它。
resultMap 的定义包含以下元素:
- id:用于唯一标识该 resultMap。
- type:结果集所映射成的 Java 对象类型。
- extends:可以引用另外一个 resultMap,继承其属性,以避免代码冗余。
- discriminator:可以根据查询结果返回不同的结果类型,类似于 Java 中的 switch 语句。
- constructor:定义构造函数,用于生成映射类的实例。
- id、result、association、collection:用来声明 resultMap 中的映射关系。
总的来说,resultMap 是 MyBatis3 中一个非常重要的配置元素,它可以帮助开发者完成更灵活、更复杂的数据映射任务。
1. 区分 ResultType 与ResultMap
2. 会使用ResultMap 做数据映射 , 主要体现在 一对一,一对多方面
本次内容, 我们来操作 grade 表,?
目前该表中 有2 列 分别为 gid 与gname
如果 我们设计的Grade.java 中的 属性 为 gid , gname 肯定数据会自动映射
但 如果 属性为 id 和name? 怎么办?
当 属性与数据库的列名 不一致 如何处理?? 可以配置resultMap
?当使用resultType做SQL语句返回结果类型处理时,对于SQL语句查询出的字段在相应的pojo中必须有和它相同的字段对应,
1. 编写Grade.java
package entity; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.ToString; @Data // 为属性生成get/set 方法 @AllArgsConstructor // 全参构造器 @NoArgsConstructor // 无参构造器 @ToString // 生成toString() public class Grade { private Integer id; private String name; }
2. 编写 GradeMapper.java ,增加 查询全部年级信息的方法
package mapper; import entity.Grade; import java.util.List; public interface GradeMapper { /** * 查询全部年级信息 * @return */ List<Grade> findAll(); }
3.编写GradeMapper.xml 增加 select 标签
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="mapper.GradeMapper"> <!-- 查询全部--> <select id="findAll" resultType="grade"> select * from grade </select> </mapper>
4. 编写测试类
import entity.Grade; import mapper.GradeMapper; 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.Before; import org.junit.Test; import java.io.IOException; import java.io.InputStream; import java.util.List; public class TestGrade { private SqlSessionFactory sqlSessionFactory; @Before public void init() throws IOException { // mybatis 配置文件的文件名 String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } @Test public void testFindAll() throws IOException { //获得SqlSession SqlSession session = sqlSessionFactory.openSession(); GradeMapper mapper = session.getMapper(GradeMapper.class); List<Grade> list = mapper.findAll(); list.forEach((e)->System.out.println(e)); } }
说明:
? ? ?grade表 有 gid,gname两列
? ? ?Grade.java 有 id 和name 两个属性
? ?目前表与实体类 的属性对应不上,
? 在 GradeMapper.xml 中查询时 ,先采用resultType 来 看下结果,发现 null.
?
resultMap 的配置 , 只需要修改 xxxMapper.xml 即可
打开 GradeMapper.xml 增加 resultMap
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="mapper.GradeMapper"> <resultMap id="gradeMap" type="grade"> <id column="gid" property="id"/> <result column="gname" property="name"/> </resultMap> <!-- 查询全部--> <select id="findAll" resultMap="gradeMap"> select * from grade </select> </mapper>
运行测试类