MyBatis 字段映射
引言
在使用 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(column="delete_flag",property="deleteFlag"),@Result(column="create_time",property="createTime"),@Result(column="update_time",property="updateTime")})@Select("select * from user_info")List<UserInfo>selectAll();// 另一个查询方法,需要重复写一遍 @Results@Results({@Result(column="delete_flag",property="deleteFlag"),@Result(column="create_time",property="createTime"),@Result(column="update_time",property="updateTime")})@Select("select * from user_info where id = #{id}")UserInfoselectById(Integerid);}可复用的 @Results(id) 映射
为了解决重复代码问题,MyBatis 允许为@Results注解指定一个id,其他方法可以通过@ResultMap引用该映射。
@MapperpublicinterfaceUserInfoMapper{@Results(id="BaseMap",value={@Result(column="delete_flag",property="deleteFlag"),@Result(column="create_time",property="createTime"),@Result(column="update_time",property="updateTime")})@Select("select * from user_info")List<UserInfo>selectAll();// 直接引用上面定义的 BaseMap,无需重复写 @Results@ResultMap(value="BaseMap")@Select("select * from user_info where id = #{id}")UserInfoselectById(Integerid);// 再多一个方法也能复用@ResultMap(value="BaseMap")@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")List<UserInfo>selectAll();@Select("select * from user_info where id = #{id}")UserInfoselectById(Integerid);@Select("select * from user_info where username = #{username}")UserInfoselectByUsername(Stringusername);}MyBatis 会自动将delete_flag映射为deleteFlag,create_time映射为createTime,
建议在项目初期就统一数据库命名规范,并开启map-underscore-to-camel-case配置,这样可以最大程度减少冗余的映射代码。
