Skip to content

Instantly share code, notes, and snippets.

@JoopAue
Created September 28, 2023 08:04
Show Gist options
  • Save JoopAue/7035cfa80653ff20023d903a8580e043 to your computer and use it in GitHub Desktop.
Save JoopAue/7035cfa80653ff20023d903a8580e043 to your computer and use it in GitHub Desktop.
GsonTypeHandler in Kotlin for MyBatis and PostgreSQL JSONB
package com.joopaue
import com.google.gson.JsonElement
import java.time.Instant
data class Data(
val time: Instant,
val data: JsonElement,
)
package com.joopaue.repositories.mapper
import com.joopaue.Data
import org.springframework.stereotype.Repository
@Repository
interface DataMapper {
fun insertData(dataPoint: Data)
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.joopaue.repositories.mapper.DataMapper">
<insert id="insertData" parameterType="com.joopaue.Data">
insert into data (time, data)
values (
#{time},
#{data, jdbcType=OTHER, typeHandler=com.joopaue.repositories.mapper.GsonTypeHandler}
)
;
</insert>
</mapper>
package com.joopaue.repositories.mapper
import com.google.gson.JsonElement
import com.google.gson.JsonParser
import org.apache.ibatis.type.BaseTypeHandler
import org.apache.ibatis.type.JdbcType
import org.postgresql.util.PGobject
import java.sql.CallableStatement
import java.sql.PreparedStatement
import java.sql.ResultSet
import java.sql.SQLException
class GsonTypeHandler : BaseTypeHandler<JsonElement>() {
@Throws(SQLException::class)
override fun setNonNullParameter(ps: PreparedStatement, i: Int, parameter: JsonElement?, jdbcType: JdbcType) {
try {
val pgObject = PGobject()
pgObject.type = "jsonb"
pgObject.value = parameter?.toString()
ps.setObject(i, pgObject)
} catch (e: Exception) {
throw SQLException("Error converting JSON to String: " + e.message, e)
}
}
@Throws(SQLException::class)
override fun getNullableResult(rs: ResultSet, columnName: String): JsonElement? {
try {
val jsonString = rs.getString(columnName)
return parseJson(jsonString)
} catch (e: Exception) {
throw SQLException("Error converting String to JSON: " + e.message, e)
}
}
@Throws(SQLException::class)
override fun getNullableResult(rs: ResultSet, columnIndex: Int): JsonElement? {
try {
val jsonString = rs.getString(columnIndex)
return parseJson(jsonString)
} catch (e: Exception) {
throw SQLException("Error converting String to JSON: " + e.message, e)
}
}
@Throws(SQLException::class)
override fun getNullableResult(cs: CallableStatement, columnIndex: Int): JsonElement? {
try {
val jsonString = cs.getString(columnIndex)
return parseJson(jsonString)
} catch (e: Exception) {
throw SQLException("Error converting String to JSON: " + e.message, e)
}
}
private fun parseJson(jsonString: String?): JsonElement? {
if (jsonString != null) {
return JsonParser.parseString(jsonString)
}
return null
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment