數據庫表字段類型爲timestampzone時,mybatis是無法將timestampz轉成localDatetime。
錯誤信息如下:
Cannot convert the column of type TIMESTAMPTZ to requested type timestamp
解決方法如下:
定義類型轉換handler
TimestampTypeHandler.java
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.PGTimestamp;
import java.sql.*;
import java.time.LocalDateTime;
@MappedTypes({LocalDateTime.class})
@MappedJdbcTypes({JdbcType.OTHER})
public class TimestampTypeHandler extends BaseTypeHandler {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {
Timestamp p=null;
if(parameter!=null) {
if (parameter instanceof LocalDateTime) {PGTimestamp.valueOf(LocalDateTime.now());
p = PGTimestamp.valueOf((LocalDateTime)parameter);
}
ps.setObject(i, p);
}
}
/**
* Gets the nullable result.
*
* @param rs the rs
* @param columnName Colunm name, when configuration <code>useColumnLabel</code> is <code>false</code>
* @return the nullable result
* @throws SQLException the SQL exception
*/
@Override
public Object getNullableResult(ResultSet rs, String columnName) throws SQLException {
return toFill(rs.getObject(columnName));
}
@Override
public Object getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return toFill(rs.getObject(columnIndex));
}
@Override
public Object getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
return toFill(cs.getObject(columnIndex));
}
private Object toFill(Object v){
if(v!=null) {
if (v instanceof PGTimestamp) {
PGTimestamp p = (PGTimestamp) v;
return p.toLocalDateTime();
} else if (v instanceof Timestamp) {
return ((Timestamp) v).toLocalDateTime();
}
}
return v;
}
}
對model類設置如下:
User.java
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.util.List;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* 用戶
* @TableName uc_user
*/
@TableName(value ="uc_user",autoResultMap = true)
@Accessors(chain = true)
@Data
public class UcUser implements Serializable {
/**
* id
*/
@TableId
private Long id;
/**
* 創建時間
*/
@TableField(typeHandler = TimestampTypeHandler.class)
protected LocalDateTime createTime;
/**
* 創建人id
*/
protected Long creatorId;
protected String creatorName;
private String fullName;
}