版权说明: 本文由博主keep丶原创,转载请注明出处。
原文地址:https://blog.csdn.net/qq_38688267/article/details/112624561
在开发过程中我们可能会遇到一个字段在数据库中以字符串或JSON类型的形式存储,但是在实体类中需要以集合或对象的方式使用。如果是用的mybatis (和 mybatis-plus),则可以用以下方式实现:
如果使用了Mybatis-Plus(后文简称MP),则在实体类上增加注解:@TableName(autoResultMap = true)
,并在对应字段上增加注解:@TableField(typeHandler = JacksonTypeHandler.class)
即可。
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import com.copm.ifm.base.basic.pojo.MenuContentList;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
/**
* 系统菜单表
*
* @author zzf
* @since 2020-12-14
*/
@Getter
@Setter
@ToString
@TableName(value = "sys_menu", autoResultMap = true)
@ApiModel("系统菜单表")
public class SysMenu {
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@ApiModelProperty("名称")
private String name;
@ApiModelProperty("操作权限")
@TableField(typeHandler = JacksonTypeHandler.class)
private MenuContentList operations;
}
上述解决方案只适用于MP提供的基础CRUD方法,当我们自己在.xml文件中自己写SQL时就不适用了,此时我们需要自定义resultMap,并在对应字段的<result>
标签中增加typeHandler
属性。
只用了Mybatis的也是使用这种方式:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.copm.ifm.servers.sys.mapper.SysMenuMapper">
<resultMap id="BaseResultMap" type="com.copm.ifm.servers.sys.vo.SysMenuPageVO">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="operations" property="operations"
typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/>
</resultMap>
<select id="selectForPage" resultMap="BaseResultMap">
SELECT
id,
name,
operations
FROM
sys_menu
</select>
</mapper>
细心的同学可能发现,我这里的List不是普通的List,是我自定义的list,这主要是为了解决使用JacksonTypeHandler
后出现的泛型擦除问题
。具体的这里就不详细解释了,请看我另外两篇博客:
@ApiModelProperty("操作权限")
@TableField(typeHandler = JacksonTypeHandler.class)
private MenuContentList operations;