引言在使用 MyBatis 进行数据库操作时数据库字段名如下划线命名delete_flag与 Java 实体类属性名驼峰命名deleteFlag之间的映射是一个常见问题。本文将介绍三种解决方案手动Results映射、可复用的Results(id)映射以及全局驼峰命名配置。首先我们定义一个实体类UserInfo后续所有示例都基于这个类publicclassUserInfo{privateIntegerid;privateStringusername;privateStringpassword;privateIntegerage;privateStringgender;privateStringphone;privateIntegerdeleteFlag;// 数据库字段 delete_flagprivateDatecreateTime;// 数据库字段 create_timeprivateDateupdateTime;// 数据库字段 update_time// getter / setter 省略}手动 Results 映射最直接的方式是在每个查询方法上使用Results注解手动指定字段映射关系。MapperpublicinterfaceUserInfoMapper{Results({Result(columndelete_flag,propertydeleteFlag),Result(columncreate_time,propertycreateTime),Result(columnupdate_time,propertyupdateTime)})Select(select * from user_info)ListUserInfoselectAll();// 另一个查询方法需要重复写一遍 ResultsResults({Result(columndelete_flag,propertydeleteFlag),Result(columncreate_time,propertycreateTime),Result(columnupdate_time,propertyupdateTime)})Select(select * from user_info where id #{id})UserInfoselectById(Integerid);}可复用的 Results(id) 映射为了解决重复代码问题MyBatis 允许为Results注解指定一个id其他方法可以通过ResultMap引用该映射。MapperpublicinterfaceUserInfoMapper{Results(idBaseMap,value{Result(columndelete_flag,propertydeleteFlag),Result(columncreate_time,propertycreateTime),Result(columnupdate_time,propertyupdateTime)})Select(select * from user_info)ListUserInfoselectAll();// 直接引用上面定义的 BaseMap无需重复写 ResultsResultMap(valueBaseMap)Select(select * from user_info where id #{id})UserInfoselectById(Integerid);// 再多一个方法也能复用ResultMap(valueBaseMap)Select(select * from user_info where username #{username})UserInfoselectByUsername(Stringusername);}全局驼峰命名自动转换如果数据库字段命名规范统一如下划线命名最优雅的方式是开启 MyBatis 的全局驼峰命名自动转换功能。# application.ymlmybatis:configuration:map-underscore-to-camel-case:true# 配置驼峰自动转换开启后Mapper 接口变得极其简洁无需任何Results注解MapperpublicinterfaceUserInfoMapper{Select(select * from user_info)ListUserInfoselectAll();Select(select * from user_info where id #{id})UserInfoselectById(Integerid);Select(select * from user_info where username #{username})UserInfoselectByUsername(Stringusername);}MyBatis 会自动将delete_flag映射为deleteFlagcreate_time映射为createTime建议在项目初期就统一数据库命名规范并开启map-underscore-to-camel-case配置这样可以最大程度减少冗余的映射代码。
MyBatis 字段映射
发布时间:2026/5/26 21:25:01
引言在使用 MyBatis 进行数据库操作时数据库字段名如下划线命名delete_flag与 Java 实体类属性名驼峰命名deleteFlag之间的映射是一个常见问题。本文将介绍三种解决方案手动Results映射、可复用的Results(id)映射以及全局驼峰命名配置。首先我们定义一个实体类UserInfo后续所有示例都基于这个类publicclassUserInfo{privateIntegerid;privateStringusername;privateStringpassword;privateIntegerage;privateStringgender;privateStringphone;privateIntegerdeleteFlag;// 数据库字段 delete_flagprivateDatecreateTime;// 数据库字段 create_timeprivateDateupdateTime;// 数据库字段 update_time// getter / setter 省略}手动 Results 映射最直接的方式是在每个查询方法上使用Results注解手动指定字段映射关系。MapperpublicinterfaceUserInfoMapper{Results({Result(columndelete_flag,propertydeleteFlag),Result(columncreate_time,propertycreateTime),Result(columnupdate_time,propertyupdateTime)})Select(select * from user_info)ListUserInfoselectAll();// 另一个查询方法需要重复写一遍 ResultsResults({Result(columndelete_flag,propertydeleteFlag),Result(columncreate_time,propertycreateTime),Result(columnupdate_time,propertyupdateTime)})Select(select * from user_info where id #{id})UserInfoselectById(Integerid);}可复用的 Results(id) 映射为了解决重复代码问题MyBatis 允许为Results注解指定一个id其他方法可以通过ResultMap引用该映射。MapperpublicinterfaceUserInfoMapper{Results(idBaseMap,value{Result(columndelete_flag,propertydeleteFlag),Result(columncreate_time,propertycreateTime),Result(columnupdate_time,propertyupdateTime)})Select(select * from user_info)ListUserInfoselectAll();// 直接引用上面定义的 BaseMap无需重复写 ResultsResultMap(valueBaseMap)Select(select * from user_info where id #{id})UserInfoselectById(Integerid);// 再多一个方法也能复用ResultMap(valueBaseMap)Select(select * from user_info where username #{username})UserInfoselectByUsername(Stringusername);}全局驼峰命名自动转换如果数据库字段命名规范统一如下划线命名最优雅的方式是开启 MyBatis 的全局驼峰命名自动转换功能。# application.ymlmybatis:configuration:map-underscore-to-camel-case:true# 配置驼峰自动转换开启后Mapper 接口变得极其简洁无需任何Results注解MapperpublicinterfaceUserInfoMapper{Select(select * from user_info)ListUserInfoselectAll();Select(select * from user_info where id #{id})UserInfoselectById(Integerid);Select(select * from user_info where username #{username})UserInfoselectByUsername(Stringusername);}MyBatis 会自动将delete_flag映射为deleteFlagcreate_time映射为createTime建议在项目初期就统一数据库命名规范并开启map-underscore-to-camel-case配置这样可以最大程度减少冗余的映射代码。