一 序
工作中,使用mybatis做dao操作,會常遇到bean對象裏面不是基本屬性,而是一個對象。
這種情況下通常有兩種辦法:
二 使用String
就是字段使用string,數據庫表使用vachar ,再大使用文本。看業務
轉換方式放在外面,就是使用josn轉換。
三 使用自定義的handler:
參見官網:https://mybatis.org/mybatis-3/zh/configuration.html#typeHandlers
public class GenericTypeHandler<T extends Object> extends BaseTypeHandler<T> {
private Class<T> clazz;
public GenericTypeHandler(Class<T> clazz) {
if (clazz == null) throw new IllegalArgumentException("Type argument cannot be null");
this.clazz = clazz;
}
/**
* @param ps
* @param i
* @param parameter
* @param jdbcType
* @throws SQLException
*/
@Override
public void setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException {
ps.setString(i, JSON.toJSONString(parameter));
}
/**
* @param rs
* @param columnName
* @return
* @throws SQLException
*/
@Override
public T getNullableResult(ResultSet rs, String columnName) throws SQLException {
String sqlJson = rs.getString(columnName);
if (null != sqlJson) {
return JSONObject.parseObject(sqlJson, clazz);
}
return null;
}
/**
* @param rs
* @param columnIndex
* @return
* @throws SQLException
*/
@Override
public T getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
String sqlJson = rs.getString(columnIndex);
if (null != sqlJson) {
return JSONObject.parseObject(sqlJson, clazz);
}
return null;
}
@Override
public T getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
String sqlJson = cs.getString(columnIndex);
if (null != sqlJson) {
return JSONObject.parseObject(sqlJson, clazz);
}
return null;
}
}
<!-- mybatis-config.xml --> <typeHandlers> <typeHandler handler="org.mybatis.example.JsonTypeHandler"/> </typeHandlers>
如果是使用springboot:
mybatis: mapper-locations: classpath*:mapper/*.xml type-aliases-package: com.xx.bean type-handlers-package: com.xx.typehandle
使用哪個方式:
查詢:
定義
<resultMap id="xxMap" type="com.xx.bean">
<result column="column" property="xxbean" typeHandler="org.mybatis.example.JsonTypeHandler" />
</resultMap>
插入、修改:
<if test="xxinfo != null"> xx_info = #{xxinfo,jdbcType=VARCHAR,typeHandler=org.mybatis.example.JsonTypeHandler}, </if>
這裏的bean屬性不是list那種複雜對象。
真的特別複雜,要不要從業務上拆開一張單獨的表來存放會更好些?