一 序
工作中,使用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那种复杂对象。
真的特别复杂,要不要从业务上拆开一张单独的表来存放会更好些?