一个悲伤的故事
本来用的好好的 在一次业务迭代中 需要对复杂嵌套的json对象进行curd
灵机一动 反手写个类型处理器吧 JSONTypeHandler 然后再把类型处理器在Data的实体类当中映射出来
然后就有了
public class JSONTypeHandler extends BaseTypeHandler<JSONObject> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, JSONObject parameter, JdbcType jdbcType) throws SQLException {
ps.setString(i, parameter.toString());
}
@Override
public JSONObject getNullableResult(ResultSet rs, String columnName) throws SQLException {
return JSONUtil.parseObj(rs.getString(columnName));
}
@Override
public JSONObject getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return JSONUtil.parseObj(rs.getString(columnIndex));
}
@Override
public JSONObject getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
return JSONUtil.parseObj(cs.getString(columnIndex));
}
}
好了 为了让MyBatisPlus识别到 我写的类型处理器 要加上对应配置文件
<configuration>
<!-- 其他配置项 -->
<typeHandlers>
<!-- 注册自定义的类型处理器 -->
<typeHandler handler="TopOne.utils.Handler.JSONTypeHandler"/>
</typeHandlers>
</configuration>
可能你还不明白具体是什么概念
我们看到 这个Mapper 明明是继承BaseMapper对吧?
我们再来看看BaseMapper里面有啥!进去看!
public interface BaseMapper<T> extends Mapper<T> {
int insert(T entity);
int deleteById(Serializable id);
int deleteById(T entity);
int deleteByMap(@Param("cm") Map<String, Object> columnMap);
int delete(@Param("ew") Wrapper<T> queryWrapper);
int deleteBatchIds(@Param("coll") Collection<?> idList);
int updateById(@Param("et") T entity);
int update(@Param("et") T entity, @Param("ew") Wrapper<T> updateWrapper);
T selectById(Serializable id);
List<T> selectBatchIds(@Param("coll") Collection<? extends Serializable> idList);
List<T> selectByMap(@Param("cm") Map<String, Object> columnMap);
default T selectOne(@Param("ew") Wrapper<T> queryWrapper) {
List<T> list = this.selectList(queryWrapper);
if (list.size() == 1) {
return list.get(0);
} else if (list.size() > 1) {
throw new TooManyResultsException("Expected one result (or null) to be returned by selectOne(), but found: " + list.size());
} else {
return null;
}
}
default boolean exists(Wrapper<T> queryWrapper) {
Long count = this.selectCount(queryWrapper);
return null != count && count > 0L;
}
Long selectCount(@Param("ew") Wrapper<T> queryWrapper);
List<T> selectList(@Param("ew") Wrapper<T> queryWrapper);
List<Map<String, Object>> selectMaps(@Param("ew") Wrapper<T> queryWrapper);
List<Object> selectObjs(@Param("ew") Wrapper<T> queryWrapper);
<P extends IPage<T>> P selectPage(P page, @Param("ew") Wrapper<T> queryWrapper);
<P extends IPage<Map<String, Object>>> P selectMapsPage(P page, @Param("ew") Wrapper<T> queryWrapper);
}
1.ScannerMapper 扫描到了对应的Mapper
2.配置文件 路径正确
3.xml文件路径正确并无语法错误
4.别名扫描包确认路径无误
5.使用最新的MyBatisPlus版本
6.能用的法子都用了...
在你确认了我上面的所有待确认点无误后
可以尝试 在
MybatisConfig中
注意看这个地方
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
sessionFactory.setConfigLocation(new PathMatchingResourcePatternResolver().getResource("mybatis-config.xml"));
return sessionFactory.getObject();
}
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();