maven
將
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<!-- <scope>runtime</scope>-->
</dependency>
sql
DROP TABLE IF EXISTS sensor CASCADE;
CREATE TABLE sensor (
id serial PRIMARY KEY,
name VARCHAR(30) NOT NULL,
type VARCHAR NOT NULL,
experiment_id INT NOT NULL references experiment(id),
position JSONB DEFAULT NULL,
description TEXT DEFAULT NULL,
addition JSONB DEFAULT NULL,
data_unit VARCHAR(6) DEFAULT NULL,
state BOOLEAN DEFAULT TRUE,
created_date TIMESTAMP DEFAULT NOW()
);
CREATE INDEX index_experiment_id ON sensor(experiment_id);
bean
pg數據庫中字段為json/jsonb,對應java實體類的類型是Object,以上數據庫對應的bean
package com.dbhd.gvs.bean;
import com.dbhd.gvs.enumeration.EquipmentType;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.stereotype.Repository;
import java.io.Serializable;
import java.util.Date;
@Data
@Repository
public class Sensor implements Serializable {
private static final long serialVersionUID=1L;
private Integer id;
private String name;
private EquipmentType type;
private Integer experimentId;
private Object position;
private String description;
private Object addition;
private String dataUnit;
private Boolean state;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") // 返回的時間格式
private Date createdDate;
}
JSONTypeHandlerPg
在mybatis的xml中,常規無法直接進行映射,需要自己寫一個TypeHandler,自定義一個JSONTypeHandlerPg類
具體代碼:
package com.dbhd.gvs.common;
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 JsonTypeHandler extends BaseTypeHandler<Object> {
private static final PGobject jsonObject = new PGobject();
@Override
public void setNonNullParameter(PreparedStatement preparedStatement, int i, Object o, JdbcType jdbcType) throws SQLException {
jsonObject.setType("jsonb");
jsonObject.setValue(JSON.toJSONString(o));
preparedStatement.setObject(i, jsonObject);
}
@Override
public Object getNullableResult(ResultSet resultSet, String s) throws SQLException {
return resultSet.getString(s);
}
@Override
public Object getNullableResult(ResultSet resultSet, int i) throws SQLException {
return resultSet.getString(i);
}
@Override
public Object getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
return callableStatement.getString(i);
}
}
mapper
使用typeHandler=com.dbhd.gvs.common.JsonTypeHandler,這個typeHandler是上面JSONTypeHandlerPg處理數據類的全限定名。
<resultMap id="resultMap_sensor" type="com.dbhd.gvs.bean.Sensor">
<!-- column:主鍵在數據庫中的列名 property:主鍵在pojo中的屬性名 -->
<id property="id" column="id"/>
<result column="username" property="username"/>
<result column="type" property="type"/>
<result column="experiment_id" property="experimentId"/>
<result column="position" property="position" typeHandler="com.dbhd.gvs.common.JsonTypeHandler"
javaType="Object"/>
<result column="description" property="description"/>
<result column="addition" property="addition" typeHandler="com.dbhd.gvs.common.JsonTypeHandler"
javaType="Object"/>
<result column="data_unit" property="dataUnit"/>
<result column="state" property="state"/>
<result column="created_date" property="createdDate"/>
</resultMap>
<insert id="save" parameterType="com.dbhd.gvs.bean.Sensor" useGeneratedKeys="true" keyProperty="id">
insert into sensor(name, type, experiment_id, position, description, addition, data_unit)
values (
#{name}, #{type}, #{experimentId},
#{position, typeHandler=com.dbhd.gvs.common.JsonTypeHandler},
#{description},
#{addition, typeHandler=com.dbhd.gvs.common.JsonTypeHandler},
#{dataUnit}
)
</insert>