java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > mybatis 字段映射

MyBatis 字段映射的解决方案

作者:Sprintz4r

本文介绍了三种MyBatis数据库字段与Java实体属性映射解决方案:手动@Results映射、可复用的@Results(id)映射及全局驼峰命名自动转换配置,通过这些方法,可以有效减少冗余代码,简化Mapper接口设计,感兴趣的朋友跟随小编一起看看吧

引言

在使用 MyBatis 进行数据库操作时,数据库字段名(如下划线命名 delete_flag)与 Java 实体类属性名(驼峰命名 deleteFlag)之间的映射是一个常见问题。本文将介绍三种解决方案:手动 @Results 映射、可复用的 @Results(id) 映射以及全局驼峰命名配置。

首先,我们定义一个实体类UserInfo,后续所有示例都基于这个类:

public class UserInfo {
    private Integer id;
    private String username;
    private String password;
    private Integer age;
    private String gender;
    private String phone;
    private Integer deleteFlag;   // 数据库字段 delete_flag
    private Date createTime;      // 数据库字段 create_time
    private Date updateTime;      // 数据库字段 update_time
    // getter / setter 省略
}

手动 @Results 映射

最直接的方式是在每个查询方法上使用 @Results 注解,手动指定字段映射关系。

@Mapper
public interface UserInfoMapper {
    @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}")
    UserInfo selectById(Integer id);
}

可复用的 @Results(id) 映射

为了解决重复代码问题,MyBatis 允许为@Results 注解指定一个 id,其他方法可以通过 @ResultMap 引用该映射。

@Mapper
public interface UserInfoMapper {
    @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}")
    UserInfo selectById(Integer id);
    // 再多一个方法也能复用
    @ResultMap(value = "BaseMap")
    @Select("select * from user_info where username = #{username}")
    UserInfo selectByUsername(String username);
}

全局驼峰命名自动转换

如果数据库字段命名规范统一(如下划线命名),最优雅的方式是开启 MyBatis 的全局驼峰命名自动转换功能。

# application.yml
mybatis:
  configuration:
    map-underscore-to-camel-case: true # 配置驼峰自动转换

开启后,Mapper 接口变得极其简洁,无需任何 @Results 注解:

@Mapper
public interface UserInfoMapper {
    @Select("select * from user_info")
    List<UserInfo> selectAll();
    @Select("select * from user_info where id = #{id}")
    UserInfo selectById(Integer id);
    @Select("select * from user_info where username = #{username}")
    UserInfo selectByUsername(String username);
}

MyBatis 会自动将 delete_flag 映射为 deleteFlagcreate_time 映射为 createTime

建议在项目初期就统一数据库命名规范,并开启 map-underscore-to-camel-case 配置,这样可以最大程度减少冗余的映射代码。

到此这篇关于MyBatis 字段映射的解决方案的文章就介绍到这了,更多相关mybatis 字段映射内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文