Mybatis --- 自定义类型转换

本文介绍了在Mybatis中自定义类型转换的必要性,详细讲解了如何创建自定义转换器,包括接口实现、代码示例以及配置方法。通过在Mapper XML文件中配置或使用注解两种方式来应用自定义转换,同时强调了在使用过程中应注意的配置和声明类型,以避免查询结果为null或类型不匹配的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Mybatis — 自定义类型转换

前言

在进行数据库增删改查的时候,因为实体类类型数据库类型不兼容,或者说Mybatis自带的类型转换不够用了,这时候就要自己手动操作了,最常见的就是素组的的操作,根据原有的进行扩展,这样就不用定义一个数组属性,就写一次转换方法。

接口

原生接口org.apache.ibatis.type.TypeHandler<T>

public interface TypeHandler<T> {
   
   
  /**
  用来设置查询参数
  */
  void setParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException;
  /**
  用来将查询结果转换成指定实体类,依旧是返回结果的列名
  */
  T getResult(ResultSet rs, String columnName) throws SQLException;
  /**
  用来将查询结果转换成指定实体类,依旧是返回结果列的顺序号
  */
  T getResult(ResultSet rs, int columnIndex) throws SQLException;
  /**
  用来将查询结果转换成指定实体类,依旧是返回结果列的顺序号,
  只是使用了不同的返回接收接口,写过原生jdbc的应该有印象
  */
  T getResult(CallableStatement cs, int columnIndex) throws SQLException;

}

也可以使用继承的方式扩展,我这里是直接继承 org.apache.ibatis.type.TypeReference<T>,这个可以省很多事情

public abstract class BaseTypeHandler<T> extends TypeReference<T> implements TypeHandler<T> {
   
   

  protected Configuration configuration;

  public void setConfiguration(Configuration c) {
   
   
    this.configuration = c;
  }

  public void setParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException {
   
   
    if (parameter == null) {
   
   
      if (jdbcType == null) {
   
   
        throw new TypeException("JDBC requires that the JdbcType must be specified for all nullable parameters.");
      }
      try {
   
   
        ps.setNull(i, jdbcType.TYPE_CODE);
      } catch (SQLException e) {
   
   
        throw new TypeException("Error setting null for parameter #" + i + " with JdbcType " + jdbcType + " . " +
        		"Try setting a different JdbcType for this parameter or a different jdbcTypeForNull configuration property. " +
        		"Cause: " + e, e);
      }
    } else {
   
   
      setNonNullParameter(ps, i, parameter, jdbcType);
    }
  
### MyBatis-Plus 中实现自定义驼峰命名转换 MyBatis-Plus默认采用下划线命名策略来处理数据库字段名与实体类属性之间的映射关系。对于希望使用驼峰命名风格的应用程序来说,这可能不够理想。为了使MyBatis-Plus能够自动完成从下划线命名到驼峰命名的转换,可以配置全局设置或通过编程的方式调整命名规则。 #### 方法一:修改全局配置文件 可以在`application.yml` 或 `application.properties` 文件中指定全局的命名策略为驼峰命名: ```yaml mybatis-plus: global-config: db-config: column-under-score-to-camel-case: true # 开启列名下划线转驼峰命名的支持[^1] ``` 此选项会告诉MyBatis-Plus,在执行SQL查询时返回的结果集里所有的列名称都将按照驼峰命名法进行解析并映射至相应的Java对象属性上。 #### 方法二:编码方式设定 除了上述静态配置外,还可以动态地改变命名处理器的行为。可以通过创建一个新的类继承`AbstractMetaObjectHandler` 并重写其中的方法来自定义逻辑;或者直接在启动类或其他合适的地方注册一个实现了`IColumnNamingStrategy`接口的对象作为Spring Bean实例。 下面是一个简单的例子展示如何编写这样的Bean: ```java import com.baomidou.mybatisplus.core.handlers.ColumnNaming; import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Component; @Component public class CustomColumnNaming { @Bean public ColumnNaming customColumnNaming() { return new ColumnNaming() { @Override public String process(String columnName) { // 将传入的下划线分隔字符串转换成驼峰形式 StringBuilder result = new StringBuilder(); boolean nextUpperCase = false; for (int i=0; i<columnName.length(); ++i){ char ch = columnName.charAt(i); if ('_' == ch && i+1 < columnName.length()){ nextUpperCase=true; }else{ if(nextUpperCase){ result.append(Character.toUpperCase(ch)); nextUpperCase=false; }else{ result.append(ch); } } } return result.toString(); } }; } } ``` 这段代码展示了如何构建一个名为`CustomColumnNaming` 的组件,并在其内部定义了一个bean——即实现了`process()`函数的新版`ColumnNaming` 。每当遇到需要将表头转化为实体成员变量的情况时,就会调用这个方法来进行转换[^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Grey Sun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值