Mybatis使用自定义类型转换Postgresql
时间:2019-10-21
本文章向大家介绍Mybatis使用自定义类型转换Postgresql,主要包括Mybatis使用自定义类型转换Postgresql使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
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); } }
原文地址:https://www.cnblogs.com/ants_double/p/11713470.html
- NGS基础 - FASTQ格式解释和质量评估
- 数据结构之串
- 生信宝典之傻瓜式 (一) 如何提取指定位置的基因组序列
- 注意map<> 的[]
- 生信宝典之傻瓜式 (二) 如何快速查找指定基因的调控网络
- React Native组件只Image
- 数据结构之线性表
- 生信宝典之傻瓜式 (三) 我的基因在哪里发光 - 如何查找基因在发表研究中的表达
- 谈谈 char *num="123";和char num[4]="123";的区别
- 未越狱的iPhone/iPad也中招:走近强大的间谍软件XAgent与MadCap
- 【年末收藏】17个新手常见Python运行时错误
- C++ STL之priority_queue
- 链表的相关操作
- 《笨办法学Python》 第0课手记
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- ajax无刷新页面切换,历史记录后退前进解决方案
- 一起来学演化计算-SBX模拟二进制交叉算子和DE差分进化算子
- 通过与C++程序对比,彻底搞清楚JAVA的对象拷贝
- Spring - application.yml 数字读取错误、eg: 000001
- Swagger2 UI 提示"请确保swagger资源接口正确"解决办法
- Manytasking Jmetal 代码反向解析 2_MMDTLZ
- GitLab服务器搭建
- MATP1生成测试SolutionSet
- 以猜数字游戏引出的分治算法的理解与思考
- MATP ManyTask Multitask Problem 和 Solution 的变量范围
- Sinopia安装部署
- Nginx的405 not allowed错误解决
- Linux免密登陆
- 一起来学matlab-matlab学习笔记8 基本绘图命令_2基本绘图操作
- 用一个图书库实例搞懂二分搜索树的底层原理