MyBatis Map结果的Key转为驼峰式

MyBatis 配置文件中,支持下面这几种配置:

properties, settings, typeAliases, typeHandlers,
objectFactory, objectWrapperFactory, reflectorFactory,
plugins, environments, databaseIdProvider, mappers

我们使用objectWrapperFactory来解决这个问题。

配置这个属性时,必须遵守上面属性配置的顺序进行配置(在objectFactory后面,在reflectorFactory前面),否则就会出错。

objectWrapperFactory 接口如下:

public interface ObjectWrapperFactory {
 boolean hasWrapperFor(Object object);
 ObjectWrapper getWrapperFor(MetaObject metaObject, Object object);
}

通过实现这个接口,可以判断当objectMap类型时,返回true,然后在下面的getWrapperFor中返回一个可以处理 key 为驼峰的Wrapper 类即可。

首先,参考已有的MapWrapper实现自己的MyWrapper

package tk.mybatis;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.reflection.wrapper.MapWrapper;
import java.util.Map;
/**
 * 驼峰处理
 */
public class MyMapWrapper extends MapWrapper {
  public MyMapWrapper(MetaObject metaObject, Map<String, Object> map) {
    super(metaObject, map);
  }
  @Override
  public String findProperty(String name, boolean useCamelCaseMapping) {
    if (useCamelCaseMapping
        && ((name.charAt(0) >= 'A' && name.charAt(0) <= 'Z')
           || name.indexOf("_") >= 0)) {
      return underlineToCamelhump(name);
    }
    return name;
  }
  /**
   * 将下划线风格替换为驼峰风格
   * @param inputString
   * @return
   */
  public String underlineToCamelhump(String inputString) {
    StringBuilder sb = new StringBuilder();
    boolean nextUpperCase = false;
    for (int i = 0; i < inputString.length(); i++) {
      char c = inputString.charAt(i);
      if (c == '_') {
        if (sb.length() > 0) {
          nextUpperCase = true;
        }
      } else {
        if (nextUpperCase) {
          sb.append(Character.toUpperCase(c));
          nextUpperCase = false;
        } else {
          sb.append(Character.toLowerCase(c));
        }
      }
    }
    return sb.toString();
  }
}

这种方式实现起来很容易。然后提供ObjectWrapperFactory实现类:

package tk.mybatis;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.reflection.wrapper.ObjectWrapper;
import org.apache.ibatis.reflection.wrapper.ObjectWrapperFactory;
import java.util.Map;
/**
 * Map 类型结果转驼峰
 */
public class MapWrapperFactory implements ObjectWrapperFactory {
  @Override
  public boolean hasWrapperFor(Object object) {
    return object != null && object instanceof Map;
  }
  @Override
  public ObjectWrapper getWrapperFor(MetaObject metaObject, Object object) {
    return new MyMapWrapper(metaObject, (Map) object);
  }
}

仍然很简单,在 MyBatis 配置文件中配置上objectWrapperFactory

<objectWrapperFactory type="tk.mybatis.MapWrapperFactory"/>

因为代码中判断了useCamelCaseMapping,所以想要真正能够使用这个功能,还需要在settings中增加如下配置:

<settings>
  <setting name="mapUnderscoreToCamelCase" value="true"/>
  <!-- 其他配置 -->
</settings>

这种方式不需要使用拦截器,而且直接从源头对Map 的key 进行处理,不会产生任何额外的消耗,如果你经常设置返回值resultType为map,可以尝试该方法。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。如果你想了解更多相关内容请查看下面相关链接

(0)

相关推荐

  • Spring Boot集成MyBatis的方法

    Spring Boot 集成MyBatis 在集成MyBatis前,我们先配置一个druid数据源. Spring Boot 集成druid druid有很多个配置选项,使用Spring Boot 的配置文件可以方便的配置druid. 在application.yml配置文件中写上: spring: datasource: name: test url: jdbc:mysql://192.168.16.137:3306/test username: root password: # 使用drui

  • Mybatis示例之SelectKey的应用

    SelectKey在Mybatis中是为了解决Insert数据时不支持主键自动生成的问题,他可以很随意的设置生成主键的方式. 不管SelectKey有多好,尽量不要遇到这种情况吧,毕竟很麻烦. SelectKey需要注意order属性,像Mysql一类支持自动增长类型的数据库中,order需要设置为after才会取到正确的值. 像Oracle这样取序列的情况,需要设置为before,否则会报错. 下面是一个xml和注解的例子,SelectKey很简单,两个例子就够了: <insert id=&quo

  • MyBatis-Spring配置的讲解

    MyBatis-Spring配置简单了解 SqlSessionFactoryBean配置 在基本的 MyBatis 中,session 工厂可以使用 SqlSessionFactoryBuilder 来创建.而在 MyBatis-Spring 中,则使用 SqlSessionFactoryBean 来替代. 示例 <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean&qu

  • MyBatis通过BATCH批量提交的方法

    很多人在用 MyBatis 或者 通用 Mapper 时,经常会问有没有批量插入和批量更新的方法. 实际上许多时候没必要用<foreach> 去实现特别复杂的批量操作.直接通过 MyBatis 的 BATCH 方式执行增删改方法即可. 下面是一个批量用法的例子: @Autowired private SqlSessionFactory sqlSessionFactory; @Transactional(rollbackFor = Exception.class) @Override publi

  • MyBatis通用Mapper实现原理及相关内容

    MyBatis通用Mapper实现原理 本文会先介绍通用 Mapper 的简单原理,然后使用最简单的代码来实现这个过程. 基本原理 通用 Mapper 提供了一些通用的方法,这些通用方法是以接口的形式提供的,例如. public interface SelectMapper<T> { /** * 根据实体中的属性值进行查询,查询条件使用等号 */ @SelectProvider(type = BaseSelectProvider.class, method = "dynamicSQL

  • 深入了解MyBatis二级缓存

    一.创建Cache的完整过程 我们从SqlSessionFactoryBuilder解析mybatis-config.xml配置文件开始: Reader reader = Resources.getResourceAsReader("mybatis-config.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); 然后是: XMLConfigBuilder

  • 深入了解MyBatis参数

    深入了解MyBatis参数 相信很多人可能都遇到过下面这些异常: "Parameter 'xxx' not found. Available parameters are [...]" "Could not get property 'xxx' from xxxClass. Cause: "The expression 'xxx' evaluated to a null value." "Error evaluating expression '

  • MyBatis常用的jdbcType数据类型

    MyBatis 通过包含的jdbcType类型 BIT FLOAT CHAR TIMESTAMP OTHER UNDEFINED TINYINT REAL VARCHAR BINARY BLOB NVARCHAR SMALLINT DOUBLE LONGVARCHAR VARBINARY CLOB NCHAR INTEGER NUMERIC DATE LONGVARBINARY BOOLEAN NCLOB BIGINT DECIMAL TIME NULL CURSOR Mybatis中javaT

  • Mybatis工具类JdbcTypeInterceptor运行时自动添加jdbcType属性

    JdbcTypeInterceptor 运行时自动添加 jdbcType 属性 拦截器签名 @Intercepts({ @Signature( type = ParameterHandler.class, method = "setParameters", args = {PreparedStatement.class}) }) 这类拦截器很少见,所以和其他拦截器(如分页插件)等搭配使用时不需要考虑顺序. 这个插件最适合的场景可能就是 Oracle 数据库,可以自动给所有方法添加 jd

  • MyBatis直接执行SQL的工具SqlMapper

    可能有些人也有过类似需求,一般都会选择使用其他的方式如Spring-JDBC等方式解决. 能否通过MyBatis实现这样的功能呢? 为了让通用Mapper更彻底的支持多表操作以及更灵活的操作,在2.2.0版本增加了一个可以直接执行SQL的新类SqlMapper. 我们来了解一下SqlMapper. SqlMapper提供的方法 SqlMapper提供了以下这些公共方法: Map<String,Object> selectOne(String sql) Map<String,Object&

随机推荐