在数据库字段命名格式和实体类属性命名格式不一致的情况下,通过配置 MyBatis 的通用 Mapper 并结合 Example 模式,高效地管理字段映射关系并完成数据库操作(一)

MyBatis 的通用 Mapper 支持使用 @Column 注解进行字段映射,但需要满足以下条件:

  1. 项目中已集成 MyBatis 的通用 Mapper(例如 Mapper 插件)。
  2. 在通用 Mapper 的配置中启用了 @Column 注解支持。

通用 Mapper 会根据实体类中字段的 @Column 注解值来映射数据库表的列名。


使用 @Column 注解进行字段映射的配置和示例

1. 通用 Mapper 配置支持 @Column 注解

确保通用 Mapper 的依赖已经正确引入,并在项目的配置文件中启用 @Column 注解解析。

  • 添加 Maven 依赖(以 tk.mybatis 的通用 Mapper 为例):

    <dependency>
        <groupId>tk.mybatis</groupId>
        <artifactId>mapper-spring-boot-starter</artifactId>
        <version>最新版本号</version>
    </dependency>
    
  • 配置文件中开启 @Column 支持
    通用 Mapper 默认支持 @Column 注解,无需额外配置,但确保项目的 Mapper 接口已经继承了通用 Mapper 提供的基础接口(如 Mapper<T>MyMapper<T>)。


2. 实体类中使用 @Column 注解

在实体类中,使用 @Column 注解指定字段与数据库列的映射关系:

  • 示例代码
    假设数据库表 user 的字段为 id_nouser_name,实体类的字段命名为驼峰格式:
    import jakarta.persistence.Column; // 或 javax.persistence.Column
    import jakarta.persistence.Table;
    
    @Table(name = "user") // 指定表名
    public class User {
        
        @Column(name = "id_no") // 指定映射到数据库的列名
        private String idNo;
    
        @Column(name = "user_name")
        private String userName;
    
        // Getter 和 Setter
        public String getIdNo() {
            return idNo;
        }
    
        public void setIdNo(String idNo) {
            this.idNo = idNo;
        }
    
        public String getUserName() {
            return userName;
        }
    
        public void setUserName(String userName) {
            this.userName = userName;
        }
    }
    

3. 使用 Example 动态查询

在通用 Mapper 中,结合 Example 模式,查询时会自动使用 @Column 注解定义的字段映射。

  • 示例

    Example example = new Example(User.class);
    Example.Criteria criteria = example.createCriteria();
    criteria.andEqualTo("idNo", "12345");
    
    List<User> users = userMapper.selectByExample(example);
    
  • 生成的 SQL

    SELECT id_no, user_name FROM user WHERE id_no = '12345';
    

4. 结合其他通用 Mapper 方法

使用通用 Mapper 的其他方法(如 select, update, delete 等)时,也会自动解析 @Column 注解。

  • 示例
    // 根据主键查询
    User user = userMapper.selectByPrimaryKey(1);
    
    // 插入数据
    User newUser = new User();
    newUser.setIdNo("67890");
    newUser.setUserName("John Doe");
    userMapper.insert(newUser);
    
    // 更新数据
    User updateUser = new User();
    updateUser.setIdNo("12345");
    updateUser.setUserName("Updated Name");
    userMapper.updateByPrimaryKey(updateUser);
    

注意事项

  1. 依赖 JPA 注解

    • @Column@Table 是 JPA 规范中的注解(通常来自 javax.persistencejakarta.persistence 包),在通用 Mapper 中被支持。
    • 如果项目中没有 JPA 依赖,需要手动引入对应的 JPA 注解库(例如 jakarta.persistence)。
  2. 优先级

    • 如果实体类中同时使用了 @Column 和 MyBatis 的 resultMap/@Results 注解,MyBatis 通常优先解析 resultMap@Results 的映射规则。
    • 如果字段命名规则明确,优先考虑全局驼峰映射(mapUnderscoreToCamelCase)。
  3. 与通用 Mapper 结合

    • @Column 注解适用于使用通用 Mapper 提供的方法(如 selectByExampleselectByPrimaryKey 等),手写 SQL 则需要手动处理映射。
  4. 通用 Mapper 版本兼容性

    • 确保使用的通用 Mapper 版本支持 @Column 注解(目前绝大多数版本都已支持)。

总结

在 MyBatis 的通用 Mapper 中,可以使用 @Column 注解来实现字段与数据库列的映射。这种方式非常适合以下场景:

  1. 数据库列名和实体类字段名不一致。
  2. 希望在实体类中清晰定义映射规则。
  3. 项目中不使用 JPA 持久化框架,但想利用其注解特性。

通过配置通用 Mapper 并结合 Example 模式,可以高效地管理字段映射关系并完成数据库操作。

posted on 2024-11-29 16:17  九七年的菠萝啤  阅读(126)  评论(0)    收藏  举报