`

Mybatis字段映射Map

阅读更多

Mybatis3的资源优先,官方除了用户指南之外,没有别的资料。源码中的单元测试也没有完整的覆盖业务。

遇到这样的问题,在一个JavaBean中,有一个Map属性,希望这个属性可以映射到Table中的一列。

 

 

public class TaskEntity implements Task, Serializable, PersistentObject {
    protected Map<String, String> properties = new HashMap<String, String>();
   
    public String getProperty(String key) {
        return properties.get(key);
    }
    
    public void setProperty(String key, String value) {
        properties.put(key, value);
    }
}

 

 希望properties可以映射 column="EXECUTION_ID_"。

很明显,需要实现一个TypeHandler,将这个实现命名为 MapTypeHandler

 

public class MapTypeHandler implements TypeHandler<Map<String, String>> {

    private static JsonBinder binder = JsonBinder.buildNonDefaultBinder();

    @Override
    public Map<String, String> getResult(ResultSet rs, String columnName) throws SQLException {
        String value = rs.getString(columnName);
        return binder.fromJson(value, Map.class);
    }

    @Override
    public Map<String, String> getResult(CallableStatement cs, int columnIndex) throws SQLException {
        String value = cs.getString(columnIndex);
        return binder.fromJson(value, Map.class);
    }

    @Override
    public void setParameter(PreparedStatement ps, int i, Map<String, String> parameter, JdbcType jdbcType) throws SQLException {
        if (parameter == null) {
            ps.setNull(i, Types.VARCHAR);
        } else {
            ps.setString(i, binder.toJson(parameter));
        }

    }

}

 

 setParameter是在Jdbc insert,update会调用到的方法。getResult是在Jdbc select会调用到的方法。

MapTypeHandler中的逻辑很简单,就是用json将Map进行序列化和反序列化,将json格式的内容存储在 column="EXECUTION_ID_"中。

 

我们有了MapTypeHandler之后,怎么让他在转换类型时生效呢?

答案就是配置类型映射。配置javaType="java.util.Map"与jdbcType="VARCHAR"之间的转换,使用MapTypeHandler。这个配置要写入mappings.xml中。

 

<configuration>
	<settings>
	  <setting name="lazyLoadingEnabled" value="false" />
	</settings>
	
	<typeHandlers>
	  <typeHandler handler="com.apusic.bpm.engine.persistence.MapTypeHandler" javaType="java.util.Map" jdbcType="VARCHAR" />
  	</typeHandlers>  
	
	<mappers>
    <mapper resource="com/apusic/bpm/db/mapping/entity/Task.xml" />
	</mappers>
	
</configuration>

 

 最后一步就是配置Entity具体的信息,Task.xml中Insert,Update,resultMap中,只要指定property="properties" column="EXECUTION_ID_" javaType="java.util.Map" jdbcType="VARCHAR",系统就会调用MapTypeHandler进行类型映射。

 

<mapper namespace="com.apusic.bpm.engine.task.impl.TaskEntity">

  <!-- TASK INSERT -->
  
  <insert id="insertTask" parameterType="com.apusic.bpm.engine.task.impl.TaskEntity">
    insert into ACT_RU_TASK (EXECUTION_ID_)
    values (
            #{properties, jdbcType=VARCHAR, javaType=java.util.Map}
           )
  </insert>

 <update id="updateTask" parameterType="com.apusic.bpm.engine.task.impl.TaskEntity">
    update ACT_RU_TASK
    <set>
      EXECUTION_ID_ = #{properties, jdbcType=VARCHAR, javaType=java.util.Map}
    </set>
  </update>
  
  <resultMap id="taskResultMap" type="com.apusic.bpm.engine.task.impl.TaskEntity">
    <result property="properties" column="EXECUTION_ID_" javaType="java.util.Map" jdbcType="VARCHAR"/>
  </resultMap></mapper>
 

 

 

分享到:
评论

相关推荐

    SpringBoot+Mybatis,返回Map的时候,将Map内的Key转换为驼峰的命名

    在SpringBoot和Mybatis的集成应用中,我们经常需要处理数据映射,特别是从数据库查询结果转换成Java对象。在Java编程中,驼峰命名法(Camel Case)是常用的变量和方法命名规则,它使得代码更易读、更符合编程规范。...

    Springboot中mybatis表关联映射关系(一对一)

    Springboot 中 MyBatis 表关联映射关系(一对一) 在 Springboot 中,MyBatis 提供了强大的表关联映射关系机制,可以实现一对一、多对一、多对多等各种关联关系。在本文中,我们将详细介绍 Springboot 中 MyBatis ...

    Mybatis-03 SQL映射文件

    MyBatis是一个优秀的Java持久层框架,它支持定制化SQL、存储过程以及高级映射。在MyBatis中,SQL映射文件起着至关重要的作用,它是连接数据库和Java代码的桥梁,允许开发者灵活地控制SQL语句的编写。本文将深入探讨...

    Map接收Mybatis的结果,字段1为Key,字段2为Val

    传统的MyBatis默认会将每一行数据的字段名作为Key,字段值作为Value存入Map,但这并不适用于多条数据的情况,因为相同字段名的Key可能会覆盖之前的值。在这种情况下,我们可以利用MyBatis提供的ResultHandler接口来...

    MyBatis查询返回Map示例代码

    这个map当中的property的定义,是我们在定义ResultHandler的时候,需要用到的.column是我们做sql查询的时候mysql中字段的名称,注意这里不支持驼峰自动映射,例如这里写了commodityCode,后面需要用AS来处理一下。...

    Mybatis中注解@MapKey的使用详解

    注解只有一个属性,即`value`,用来指定映射到Map的键所对应的字段名。 例如,假设我们有一个需求,批量查询数据库中的记录,每个记录包含`id`和`name`两个字段。如果我们直接返回`Map, Object&gt;`,那么Mybatis会将...

    详解Java的MyBatis框架中SQL语句映射部分的编写

    下面是一个简单的`resultMap`示例,展示了如何将数据库的`STUDENT_ID`、`STUDENT_NAME`和`STUDENT_SEX`字段映射到`StudentEntity`类的相应属性: ```xml ``` 接下来,我们讨论在MyBatis中实现CRUD操作: ...

    Mybatis动态调用表名和字段名的解决方法

    一个示例的Mybatis映射文件片段如下: ```xml &lt;select id="getUser" resultType="java.util.Map" parameterType="java.lang.String" statementType="STATEMENT"&gt; SELECT ${columns} FROM ${tableName} WHERE ...

    mybatis创建一个或多个新用户 insert 字段和表名不确定时动态添加问题

    在循环中,我们通过遍历`dataMap`的key来构造动态的字段名,这将在MyBatis的映射文件中使用。 ```java // 构建动态字段 for (String key : dataMap.keySet()) { lineColumn += key + ","; } // 添加id字段,假设id...

    Mybatis高级映射、动态SQL及获得自增主键的解析

    在这个映射中,`resultMap`定义了一个`Blog`对象,包含了`authorID`和`authorName`字段,并通过`collection`标签映射了一对多关系,即每个作者有多篇博客,每篇博客由`Post`对象表示。 ### 三、获取自增主键 ...

    mybatis中文离线文档

    MyBatis支持自动映射(基于字段名称相似性)和手动映射(通过resultMap元素定义)。 8. **缓存机制**:MyBatis提供了本地缓存和二级缓存,可以提高数据访问效率。本地缓存作用于单个SqlSession,而二级缓存则可以在...

    mybatis-3.0.4源码

    3. 自动映射:MyBatis可以自动将数据库字段名与Java对象的驼峰命名属性进行映射。 三、动态SQL MyBatis的动态SQL功能非常强大,可以在XML映射文件中使用条件语句、foreach循环等,灵活构建SQL语句。例如,`&lt;if&gt;`,`...

    Mybatis讲义.pdf

    - 利用反射、内省等底层技术,自动将实体与表进行属性与字段的映射。 ### 3. Mybatis框架设计 #### 3.1 核心组件 Mybatis框架的核心组件包含以下几个部分: - `SqlSessionFactoryBuilder`:用来构建`...

    MyBatis-Plus 查询返回实体对象还是map

    在MyBatis-Plus框架中,查询结果可以返回实体对象或Map,选择哪种方式取决于具体的应用场景和需求。MyBatis-Plus是一个基于MyBatis的扩展工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。它...

    Mybatis结果集自动映射的实例代码

    在Mybatis中,结果集映射是用于将数据库查询的结果转换为Java对象的过程。自动映射功能使得这一过程更为便捷,无需显式地编写复杂的resultMap配置。在某些情况下,我们只需要简单地指定`resultType`属性,Mybatis就...

    mybatis 多层级collection嵌套.docx

    -- 这里添加Light对象的字段映射 --&gt; &lt;!-- 其他Light对象的属性映射... --&gt; &lt;select id="selectH5ListByDeployId" resultMap="jxhJSZBH5ListMap"&gt; &lt;!-- SQL查询语句,获取与Car关联的所有Light对象 --&gt; ``...

    MyBatis基本使用总结

    结果集映射则通过`&lt;result&gt;`标签定义字段与Java属性的对应关系,确保查询结果能够正确地转化为实体对象。 六、动态SQL MyBatis的强大力量之一是其动态SQL功能。通过`&lt;if&gt;`, `&lt;choose&gt;`, `&lt;when&gt;`, `&lt;otherwise&gt;`, `...

    mybatis中文教程

    MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解进行配置和原始映射,将接口和Java的POJOs...

    java+mybatis+mysql查询结果集的映射问题.pdf

    这是因为MyBatis已经根据`&lt;result&gt;`标签进行了字段映射,再次在查询语句中指定相同的别名会导致混乱。 为了避免这类问题,我们应该遵循以下最佳实践: 1. 当使用Map接收查询结果时,考虑处理null值的情况,或者在...

Global site tag (gtag.js) - Google Analytics