前言
这次的目的是将Card
对象中的ext
属性将以json
的格式存放在tb_card
表中的一个字段card_ext varchar(512)
中。并且能够查询出。
public class Card{
private Integer id;
private CardExt ext;
public CardExt getExt() {
return ext;
}
public void setExt(CardExt ext) {
this.ext = ext;
}
}
public class CardExt {
private Integer recoveryType;
public Integer getRecoveryType() {
return recoveryType;
}
public void setRecoveryType(Integer recoveryType) {
this.recoveryType = recoveryType;
}
}
准备数据
Card
和CardExt
对象如上面展示,接下来准备CardMapper.xml
以及相应的CardMapper
。
CardMapper.xml
<mapper namespace="com.test.mapper.CardMapper">
<resultMap id="cardResultMap" type="com.test.Card">
<id column="id" property="id" />
<result column="ext" property="ext" javaType="com.test.CardExt"/>
</resultMap>
<select id="selectCardById" resultMap="cardResultMap">
select id,card_ext
from
tb_card
WHERE id = #{cardId}
</select>
<update id="updateCardById">
UPDATE
tb_card
SET
card_ext= #{ext}
WHERE
id = #{id}
</update>
<insert id="insertCard" useGeneratedKeys="true" keyProperty="id" >
INSERT INTO tb_card
( card_ext )
VALUES (#{ext})
</insert>
</mapper>
CardMapper
提供三个简单的方法。
@Repository("cardMapper")
public interface CardMapper {
Card selectCardById(int cardId);
int updateCardExtById(@param("id") int cardId,@param("ext") CardExt ext);
int insert(Card card);
}
如果这个时候你调用任何一个方法,不出意外的话,应该都会失败的,因为没有相应的TypeHandler
来处理CardExt
类型的属性。所以这个时候我们需要来实现一个自定义的TypeHandler
。
实现自定义的TypeHandler
import com.alibaba.fastjson.JSON;
import org.apache.commons.lang.StringUtils;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class ObjectTypeHandler extends BaseTypeHandler<Object> {
private final Class clazz;
public ObjectTypeHandler(Class clazz) {
if (clazz == null) {
throw new IllegalArgumentException("clazz not null");
}
// 在这里对应com.test.CardExt.class 对象
this.clazz = clazz;
}
@Override
public void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {
ps.setString(i, JSON.toJSONString(parameter));
}
@Override
public Object getNullableResult(ResultSet rs, String columnName) throws SQLException {
String s = rs.getString(columnName);
if (StringUtils.isBlank(s)) {
return null;
}
return JSON.parseObject(s, clazz);
}
@Override
public Object getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
String s = rs.getString(columnIndex);
if (StringUtils.isBlank(s)) {
return null;
}
return JSON.parseObject(s, clazz);
}
@Override
public Object getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
String s = cs.getString(columnIndex);
if (StringUtils.isBlank(s)) {
return null;
}
return JSON.parseObject(s, clazz);
}
}
指定使用TypeHandler
实现好了TypeHandler
后,得让mybatis
知道有这个类是处理什么数据的。因此需要在CardMapper.xml
中指定TypeHandler
。
<mapper namespace="com.test.mapper.CardMapper">
<resultMap id="cardResultMap" type="com.test.Card">
<id column="id" property="id" />
<result column="ext" property="ext" javaType="com.test.CardExt" typeHandler="com.test.handler.ObjectTypeHandler"/>
</resultMap>
<select id="selectCardById" resultMap="cardResultMap">
select id,card_ext
from
tb_card
WHERE id = #{cardId}
</select>
<update id="updateCardById">
UPDATE
tb_card
SET
card_ext= #{ext,typeHandler=com.test.handler.ObjectTypeHandler}
WHERE
id = #{id}
</update>
<insert id="insertCard" useGeneratedKeys="true" keyProperty="id" >
INSERT INTO tb_card
( card_ext )
VALUES (#{ext,typeHandler=com.test.handler.ObjectTypeHandler})
</insert>
</mapper>
运行结果

网友评论