1. Custom typeHandler type
Mybatis does not implement the TypeHandler corresponding to the jsonb type field by default, so generally we need to customize a simple implementation of mybatis's TypeHandler:
package com.jiarui.operlog.util.typehandler;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedTypes;
import org.postgresql.util.PGobject;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
@MappedTypes({ Object.class })
public class JsonbTypeHandler extends BaseTypeHandler<Object> {
private static final PGobject jsonObject = new PGobject();
@Override
public void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType)
throws SQLException {
if (ps != null) {
jsonObject.setType("jsonb");
jsonObject.setValue(parameter.toString());
ps.setObject(i, jsonObject);
}
}
@Override
public Object getNullableResult(ResultSet rs, String columnName) throws SQLException {
return rs.getObject(columnName);
}
@Override
public Object getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return rs.getObject(columnIndex);
}
@Override
public Object getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
return cs.getObject(columnIndex);
}
}
TypeHandler corresponding to json type field
package com.jiarui.operlog.util.typehandler;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedTypes;
import org.postgresql.util.PGobject;@MappedTypes({Object.class})
public class JsonTypeHandler extends BaseTypeHandler{@Override
public void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {
if (ps != null) {
PGobject ext = new PGobject();
ext.setType("json");
ext.setValue(parameter.toString());
ps.setObject(i, ext);
}
}@Override
public Object getNullableResult(ResultSet resultSet, String s) throws SQLException {
return resultSet.getObject(s);
}@Override
public Object getNullableResult(ResultSet resultSet, int i) throws SQLException {
return resultSet.getObject(i);
}@Override
public Object getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
return callableStatement.getObject(i);
}
}
2. Set the corresponding jsonb field in the entity class to Object
/** Other data*/
private Object data ;
3. Modify the related set method
public void setData(Object data) {
try {
//Query conversion this . data = JSON. parse (data.toString()); } catch (Exception e) { //Add conversion this . data = JSONArray. toJSON (data ); }}
4. Modify the configuration of mapper.xml related fields
<?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.jiarui.operlog.mapper.OperLogMapper">
<resultMap type="OperLog" id="OperLogResult">
<id property="Id" column="id" />
<result property="userId" column="user_id" />
<result property="operName" column="oper_name" />
<result property="operDescription" column="oper_description" />
<result property="createTime" column="create_time" />
<result property="startTime" column="start_time" />
<result property="endTime" column="end_time" />
<result property="operType" column="oper_type" />
<result property="project" column="project" />
<result property="pageName" column="page_name" />
<result property="queueName" column="queue_name" />
<result property="data" column="data"
jdbcType="OTHER" typeHandler="com.jiarui.operlog.util.typehandler.JsonbTypeHandler" />
</resultMap>
<insert id="insertOperLog" parameterType="OperLog">
insert into operlog (id, user_id, oper_name, oper_description, create_time, start_time, end_time, oper_type, project, page_name, queue_name, data)
values (#{Id}, #{userId}, #{operName}, #{operDescription}, now(), #{startTime}, #{endTime}, #{operType}, #{project}, #{pageName}, #{queueName}, #{data,jdbcType=OTHER,typeHandler=com.jiarui.operlog.util.typehandler.JsonbTypeHandler})
</insert>
<select id="selectOperLogList" parameterType="OperLogDTO" resultMap="OperLogResult">
select id, user_id, oper_name, oper_description, create_time, start_time, end_time, oper_type, project, page_name, queue_name, data from operlog
<where>
<if test="operName != null and operName != ''">
AND oper_name like concat('%', #{operName}, '%')
</if>
<if test="project != null and project != ''">
AND project like concat('%', #{project}, '%')
</if>
<if test="pageName != null and pageName != ''">
AND page_name like concat('%', #{pageName}, '%')
</if>
<if test="queueName != null and queueName != ''">
AND queue_name like concat('%', #{queueName}, '%')
</if>
<if test="beginTime != null and beginTime != ''"><!-- 开始时间检索 -->
and create_time >= #{beginTime}
</if>
<if test="endTime != null and endTime != ''"><!-- 结束时间检索 -->
and create_time <= #{endTime}
</if>
</where>
order by create_time desc
</select>
<delete id="deleteOperLogByIds" parameterType="String">
delete from operlog where id in
<foreach collection="array" item="infoId" open="(" separator="," close=")">
#{infoId}
</foreach>
</delete>
<update id="cleanOperLog">
truncate table operlog
</update>
</mapper>
5. Interface method
package com.jiarui.operlog.controller;
import com.jiarui.operlog.model.OperLog;
import com.jiarui.operlog.model.dto.OperLogDTO;
import com.jiarui.operlog.service.IOperLogService;
import com.jiarui.operlog.util.PageResult;
import com.jiarui.operlog.util.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.UUID;
@RestController
@RequestMapping("operlog")
public class OperlogController{
@Autowired
private IOperLogService operLogService;
@RequestMapping(value = "/save", method = {RequestMethod.POST})
@ResponseBody
public Result save(@RequestBody @Validated OperLog operLog)
{
operLog.setId(UUID.randomUUID().toString());
operLogService.insertOpeoLog(operLog);
return Result.ok();
}
@RequestMapping(value = "/list", method = {RequestMethod.GET})
@ResponseBody
public Result list(OperLogDTO operLogDTO,
final @RequestParam(value = "pageNum",required = false,defaultValue = "1") Integer pageNum,
final @RequestParam(value = "pageSize",required = false,defaultValue = "20") Integer pageSize)
{
PageResult<OperLog> result = new PageResult<>(pageNum,pageSize);
List<OperLog> list = operLogService.selectOperLogList(operLogDTO);
result.setTotal(list.size());
result.setData(list.subList((pageNum-1)*pageSize<0?0:(pageNum-1)*pageSize,pageSize<list.size()?pageSize:list.size()));
return Result.data(result);
}
}
6. Simulation request
New request:
Query request:
Note: JSON tool related dependencies
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.70</version>
</dependency>