使用mybatis plus和hutool实现实体类和库表字段的映射

步骤1:添加依赖

首先,确保你的项目中已经添加了 MyBatis Plus 和 Hutool 的依赖。如果你使用的是 Maven,可以在 pom.xml 文件中添加如下依赖:

<dependencies>
    <!-- MyBatis Plus -->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.4.3</version>
    </dependency>

    <!-- Hutool -->
    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-all</artifactId>
        <version>5.8.11</version>
    </dependency>
</dependencies>

步骤 2: 创建自定义 TypeHandler
接下来,创建一个自定义的 TypeHandler,用于处理 JSONObject 和 String 之间的转换。

import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * 实现实体类和数据库表字段的映射(JSONObject to String)
 */
public class JSONOjectTypeHandler extends BaseTypeHandler<JSONObject> {

    @Override
    public void setNonNullParameter(PreparedStatement preparedStatement, int i, JSONObject parameter, JdbcType jdbcType) throws SQLException {
        preparedStatement.setString(i, parameter.toString());
    }

    @Override
    public JSONObject getNullableResult(ResultSet resultSet, String columnName) throws SQLException {
        String jsonString = resultSet.getString(columnName);
        return jsonString == null ? null : JSONUtil.parseObj(jsonString);
    }

    @Override
    public JSONObject getNullableResult(ResultSet resultSet, int columnIndex) throws SQLException {
        String jsonString = resultSet.getString(columnIndex);
        return jsonString == null ? null : JSONUtil.parseObj(jsonString);
    }

    @Override
    public JSONObject getNullableResult(CallableStatement callableStatement, int columnIndex) throws SQLException {
        String jsonString = callableStatement.getString(columnIndex);
        return jsonString == null ? null : JSONUtil.parseObj(jsonString);
    }
}

步骤 3: 在实体类中使用 TypeHandler
在实体类中使用自定义的 TypeHandler,将其应用到相应的字段上。

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import cn.hutool.json.JSONObject;

@TableName("user")
public class User {

    private String id;
    private String name;

    @TableField(typeHandler = JSONObjectTypeHandler.class)
    private JSONObject attributes;

    // getters and setters
}

步骤 4: 配置 MyBatis Plus(选做)

如果需要全局注册这个 TypeHandler,可以在 MyBatis Plus 的配置类中进行配置。

import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;

@Configuration
@MapperScan("com.example.mapper") // 替换为你的 Mapper 所在的包路径
public class MyBatisPlusConfig {

    @Bean
    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
        MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);

        // 注册自定义的 TypeHandler
        sessionFactory.setTypeHandlers(new JSONObjectTypeHandler());

        return sessionFactory.getObject();
    }
}
### 禁用 MyBatis-Plus 实体类字段自动映射MyBatis-Plus 中,默认情况下会基于实体类的字段名数据表字段名之间的映射规则进行操作。如果希望禁用这种默认行为,可以通过调整全局配置或者修改实体类的设计方式实现。 #### 方法一:通过全局配置取消默认字段映射 MyBatis-Plus 的 `global-config` 配置项允许开发者自定义字段映射的行为。具体来说,可以在配置文件中设置 `field-strategy` 参数为 `NONE` 来关闭字段策略[^2]: ```yaml mybatis-plus: global-config: db-config: field-strategy: NONE ``` 上述配置的作用是告诉框架不对未标记注解的字段执行任何插入或更新操作,从而达到禁用默认字段映射的效果。 #### 方法二:使用注解显式指定字段映射 对于某些特定场景下的字段映射需求,可以选择不依赖于默认命名规则,而是通过手动添加注解的方式来完成映射。例如,在实体类使用 `@TableField(exist = false)` 注解声明某个字段不存在于数据表中[^4]: ```java import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; @TableName("example_table") public class ExampleEntity { private Long id; @TableField(exist = false) private String nonExistentColumn; // 数据中无此列 } ``` 这样做的好处是可以灵活控制哪些字段参 SQL 查询过程,而无需完全遵循框架设定好的规则。 #### 方法三:重写 BaseMapper 接口方法 另一种更彻底的方法是从源头上改变 Mapper 层逻辑。即继承官方提供的 `BaseMapper<T>` 并覆盖其中涉及字段处理的部分函数,比如 `insert`, `updateById` 等核心 CRUD 功能。不过这种方式较为复杂且容易引入维护成本,仅推荐给有特殊业务诉求的应用开发人员尝试。 --- ### 注意事项 当决定要禁用自动映射机制之后,请务必确认项目内的其他部分不会因此受到影响。特别是那些高度依赖原有约定俗成做法的地方可能需要额外适配工作才能正常运转下去。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值