一、什么是 MyBatis 自动映射?
MyBatis 自动映射是指 MyBatis 根据数据库表结构和 Java 对象的属性,自动将数据库中的列值映射到对应的 Java 对象属性上。这意味着你无需手动编写繁琐的映射语句,MyBatis 会帮你完成大部分的映射工作。
二、自动映射的工作原理
当 MyBatis 执行 SQL 查询并获取结果集时,它会根据以下规则进行自动映射:
- 列名与属性名匹配:如果数据库表的列名与 Java 对象的属性名完全匹配,MyBatis 会将列值直接映射到对应的属性上。
- 驼峰式映射:MyBatis 支持将下划线分隔的列名转换为驼峰式命名的属性名。例如,数据库列名 user_id 可以映射到 Java 属性名 userId。
- 忽略不匹配的列:如果结果集中存在与 Java 对象属性不匹配的列,MyBatis 会忽略这些列,不会进行映射。
三、如何使用 MyBatis 自动映射?
使用 MyBatis 自动映射非常简单。只需在 MyBatis 的配置文件中进行相应的设置,并确保数据库表结构和 Java 对象的属性定义保持一致。
以下是一个基本的示例:
- 在 MyBatis 的配置文件(如 mybatis-config.xml)中,设置 autoMappingBehavior 属性为合适的值(如 PARTIAL 或 FULL)。
- 创建对应的 Java 对象,定义与数据库表列相对应的属性。
- 在 MyBatis 的映射文件(如 UserMapper.xml)中,使用 <resultMap> 元素来定义映射关系(通常可以省略,让 MyBatis 自动处理)。
- 执行 SQL 查询,并将结果集映射到 Java 对象。
四、源码分析
DefaultResultSetHandler类的shouldApplyAutomaticMappings方法
// 判断 ResultMap 当前场景是否使用自动映射
private boolean shouldApplyAutomaticMappings(ResultMap resultMap, boolean isNested) {
// 如果 ResultMap 配置了自己的自动映射属性,则使用 resultMap 自己的
if (resultMap.getAutoMapping() != null) {
return resultMap.getAutoMapping();
}
// 如果 ResultMap 没有配置了自己的自动映射属性
// 如果当前是嵌套场景下,只有 autoMappingBehavior == FULL 时候,返回 true
// 如果当前不是嵌套场景下,只有 autoMappingBehavior == NONE 时候,返回 false
if (isNested) {
return AutoMappingBehavior.FULL == configuration.getAutoMappingBehavior();
} else {
return AutoMappingBehavior.NONE != configuration.getAutoMappingBehavior();
}
}
该方法用于判定一个结果集在对应场景下,是否使用自动映射功能。如果结果集本身配置了自动映射属性,那直接使用结果集自己的;否则,如果当前是嵌套场景下,只有 autoMappingBehavior == FULL 时候,使用自动映射功能,如果当前不是嵌套场景下,只有 autoMappingBehavior == NONE 时候,不使用自动映射功能。
private Object getRowValue(ResultSetWrapper rsw, ResultMap resultMap, String columnPrefix) throws SQLException {
// 省略部分代码.........
if (shouldApplyAutomaticMappings(resultMap, false)) {
foundValues = applyAutomaticMappings(rsw, resultMap, metaObject, columnPrefix) || foundValues;
}
// 省略部分代码.........
}
在为每行创建返回结果的时候,如果是自动映射,则会调用applyAutomaticMappings进行自动映射。