Mybatis使用自定义类型转换Postgresql

主要目的

为了解决从数据库取出来之后再手动转换为javaBean的问题。
主要用mybatis提供的Handler来把处理前置
  • 添加转换类

    
    
    import com.fasterxml.jackson.core.JsonProcessingException;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import org.apache.ibatis.logging.Log;
    import org.apache.ibatis.logging.LogFactory;
    import org.apache.ibatis.type.BaseTypeHandler;
    import org.apache.ibatis.type.JdbcType; import java.io.IOException;
    import java.sql.CallableStatement;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException; /**
    * @author lyy
    * @description
    * @date 2019/5/28
    */
    public class MyStateTypeHandler<T> extends BaseTypeHandler<T> {
    private final static Log log = LogFactory.getLog(MyStateTypeHandler.class);
    private static ObjectMapper objectMapper;
    private Class<T> type;
    static {
    objectMapper = new ObjectMapper();
    }
    public MyStateTypeHandler(Class<T> type) {
    if(log.isTraceEnabled()) {
    log.trace("JsonTypeHandler(" + type + ")");
    }
    if (type == null) {
    throw new IllegalArgumentException("Type argument cannot be null");
    }
    this.type = type;
    } private T parse(String json) {
    try {
    if(json == null || json.length() == 0) {
    return null;
    }
    return objectMapper.readValue(json, type);
    } catch (IOException e) {
    throw new RuntimeException(e);
    }
    } private String toJsonString(Object obj) {
    try {
    return objectMapper.writeValueAsString(obj);
    } catch (JsonProcessingException e) {
    throw new RuntimeException(e);
    }
    }
    @Override
    public void setNonNullParameter(PreparedStatement preparedStatement, int i, T t, JdbcType jdbcType) throws SQLException {
    preparedStatement.setString(i, toJsonString(t));
    } @Override
    public T getNullableResult(ResultSet resultSet, String s) throws SQLException {
    return (T) parse(resultSet.getString(s));
    } @Override
    public T getNullableResult(ResultSet resultSet, int i) throws SQLException {
    return (T) parse(resultSet.getString(i)); } @Override
    public T getNullableResult(CallableStatement callableStatement, int i) throws SQLException { return (T) parse(callableStatement.getString(i));
    }
    }
  • 引用转换类

      <resultMap id="overlapsail" type="com.javaBean">
    <result column="id" property="id"/>
    <result column="site_code" property="siteCode" jdbcType="VARCHAR"/>
    <result column="car_code" property="carCode" jdbcType="VARCHAR"/>
    <result column="sail_time" property="sailTime"/>
    <result column="height" property="height"/> <result column="para_value" property="sailOverlapDto" jdbcType="OTHER"
    javaType="JavaBean"
    typeHandler="MyStateTypeHandler"/>
    </resultMap>
  • 其它的与正常的调用结果相同

  • 附一个Blob到Bean的转换

    
    
    import org.apache.ibatis.type.BaseTypeHandler;
    import org.apache.ibatis.type.JdbcType;
    import org.apache.ibatis.type.MappedJdbcTypes;
    import org.apache.ibatis.type.MappedTypes; import javax.sql.rowset.serial.SerialBlob;
    import java.io.UnsupportedEncodingException;
    import java.sql.*; /**
    * @author lyy
    * @description
    * @date 2019/6/11
    */
    @MappedJdbcTypes(JdbcType.OTHER) // 可有可无
    @MappedTypes(Blob.class)
    public class MyBlobTypeHander extends BaseTypeHandler<Object> {
    @Override
    public void setNonNullParameter(PreparedStatement preparedStatement, int i, Object o, JdbcType jdbcType) throws SQLException { } @Override
    public Object getNullableResult(ResultSet resultSet, String s) throws SQLException {
    return null;
    } @Override
    public Object getNullableResult(ResultSet resultSet, int i) throws SQLException {
    return null;
    } @Override
    public Object getNullableResult(CallableStatement callableStatement, int i) throws SQLException { try {
    return new SerialBlob( callableStatement.getString(i).getBytes("utf-8"));
    } catch (UnsupportedEncodingException e) {
    return null;
    } }
    }
  • 附一个特殊json到Bean的转换


    import java.sql.CallableStatement;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException; import com.alibaba.fastjson.JSON;
    import org.apache.ibatis.type.BaseTypeHandler;
    import org.apache.ibatis.type.JdbcType;
    import org.apache.ibatis.type.MappedJdbcTypes;
    import org.apache.ibatis.type.MappedTypes;
    import org.postgresql.util.PGobject; @MappedJdbcTypes(JdbcType.OTHER) // 可有可无
    @MappedTypes(Object.class)
    public class JsonTypeHandler extends BaseTypeHandler<Object> {
    private static final PGobject jsonObject = new PGobject(); @Override
    public void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {
    jsonObject.setType("jsonb");
    if (parameter instanceof String) {
    jsonObject.setValue((String) parameter);
    } else {
    jsonObject.setValue(JSON.toJSONString(parameter));
    }
    ps.setObject(i, jsonObject);
    } @Override
    public Object getNullableResult(ResultSet rs, int columnIndex) throws SQLException { return JSON.parseObject(rs.getString(columnIndex), Object.class);
    } @Override
    public Object getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
    return JSON.parseObject(cs.getString(columnIndex), Object.class);
    } @Override
    public Object getNullableResult(ResultSet rs, String columnName) throws SQLException {
    return JSON.parseObject(rs.getString(columnName), Object.class);
    }
    }

Mybatis使用自定义类型转换Postgresql的更多相关文章

  1. mybatis generator 生成javabean自定义类型转换

    因为默认mybatis generator自动生成的,带小数的都转成了bigdecimal了,而且长度不同的整数转成了不同的类型. 但是我想要带小数的转成double,整数转成integer. 所有自 ...

  2. 学习Spring Boot:(十二)Mybatis 中自定义枚举转换器

    前言 在 Spring Boot 中使用 Mybatis 中遇到了字段为枚举类型,数据库存储的是枚举的值,发现它不能自动装载. 解决 内置枚举转换器 MyBatis内置了两个枚举转换器分别是:org. ...

  3. 【.NET深呼吸】基础:自定义类型转换

    照例,老周在开始吹牛之前,先讲讲小故事,这是朋友提出的建议,老TMD写技术有什么了不起的,人人都会写.后来老周想想,也确实,代码谁不会写,能写到有品位有感悟,就不容易做到.于是,老周接受了该朋友的建议 ...

  4. AutoMapper搬运工之自定义类型转换

    前言 最近还挺忙,还有点累,一直都没更新了,实在是懒呀.正题之前先说点别的,最近公司要扩张了,需要大量开发,领导说推荐有钱可以拿,如此好机会,我就趁机做个广告.ShippingRen.com招募.NE ...

  5. 不可或缺 Windows Native (24) - C++: 运算符重载, 自定义类型转换

    [源码下载] 不可或缺 Windows Native (24) - C++: 运算符重载, 自定义类型转换 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 运算符重载 自 ...

  6. Struts2自定义类型转换,和处理类型转换错误

    Struts2自定义类型转换: 从前台接受到的类型全部是字符串,Struts2自带的一些基本类型转换有时不能满足我们的特别需要,如:日期字符串输入格式,还有一些自定义的类,直接传到后台,我们需要一些自 ...

  7. [Struts2学习笔记] -- 自定义类型转换

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...

  8. C#构造函数、操作符重载以及自定义类型转换

    构造器 构造器(构造函数)是将类型的实例初始化的特殊方法.构造器可分为实例构造器和类型构造器,本节将详细介绍有关内容. 实例构造器 顾名思义,实例构造器的作用就是对类型的实例进行初始化.如果类没有显示 ...

  9. MyBatis Generator 自定义生成注释

    注释生成器 为了生成db里面的注释,必须自定义注释生成器 EmptyCommentGenerator: import org.mybatis.generator.api.CommentGenerato ...

随机推荐

  1. 远古框架-SSH maven配置 (包含gson)

    Spring3.2.17+Struts2.3.15+Hibernate3.6.10 <?xml version="1.0" encoding="UTF-8" ...

  2. (七十八)c#Winform自定义控件-倒影组件

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:ht ...

  3. [phyton]文件的简单读写练习

    f.open() 用于打开一个文件. f=open("record.txt","w",encoding="utf-8")#打开文件,设置文件 ...

  4. 轻松部署calico

    一.资源 官方文档 https://docs.projectcalico.org/v3.8/getting-started/kubernetes/installation/integration 二. ...

  5. 小记redis持久化的机制

    刚学redis,就经常看到两种持久化机制在眼头晃,RDB和AOF,然而当时学的还知道这两东西是啥玩意,过段时间又忘了,中文记忆这两种概念总感觉有些别扭.今心血来潮翻看redis的配置文件,豁然开朗,仿 ...

  6. 12.Django基础十之Form和ModelForm组件

    一 Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户 ...

  7. Flask基础(07)-->正则自定义转换器

    正则自定义转换器 为什么要自定义正则转换器? 因为默认转换器太过于笨重,往往不能满足我们实际业务的需求,这时候我们就需要自定义正则转换器了. 那么我们怎么自定义正则转换器呢? from flask i ...

  8. LINUX系统学习以及初学者系统下载

    Linux系统常用命令大全 来源:服务器之家 [博客中所有文章如有不对的地方希望看官们指出,有问题也可以提出来相互交流,相互学习,感谢大家!] 初学者建议安装:sentOS Ubuntu系统下载连接h ...

  9. 3DEarth PPT :一款专为GIS系统研发的三维汇报演示系统

    3DEarth PPT(三维地球汇报演示系统)又称 3DGis PPT,是专为GIS系统研发的三维汇报演示系统.对有3DGis系统的客户它可以作为一个组件(dll)嵌入原系统,对没有3DGis系统的客 ...

  10. android设置透明状态栏

    先是半透明效果(两种方法): 第一种(简单): //直接将下面的代码放在activity中的setContentView(R.layout.activity_main);中之前就行了 if (Buil ...