美文网首页
mybatis 将属性对象放入Mysql

mybatis 将属性对象放入Mysql

作者: 瞿大官人 | 来源:发表于2019-04-08 17:33 被阅读0次

前言

这次的目的是将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;
    }
}

准备数据

CardCardExt 对象如上面展示,接下来准备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>

运行结果

image.png

相关文章

网友评论

      本文标题:mybatis 将属性对象放入Mysql

      本文链接:https://www.haomeiwen.com/subject/hbohiqtx.html