最近在学习mybatis插件使用,有个场景是把sql查询的map数据通过插件拦截处理后,把数据库字段形式统一java格式返回(如:Nick_name->nickName)。
1.整体思路
- 通过使用ResultSetHandler接口的handleResultSets拦截返回的数据(List类型)
- 处理Map类型的返回
- 对首字母大写和_处理
2.实施
- 实现继承Interceptor接口并签名接口
- 代码开发,结束后在mybatis-config.xml中添加插件配置
最开始我打算使用迭代的方式处理map数据,如下
发现抛出ConcurrentModificationException异常,通过跟踪发现每次执行next方法和remove方法
都会比对修改次数、期望修改次数,因此,当执行remove方法,就抛出异常。mybatis返回类型map默认为hashMap
当我把返回类型改为resultType="java.util.concurrent.ConcurrentHashMap"后,由于使用了并发控制,不用再去比对,也就不会再抛异常。
个人理解,当迭代涉及删除节点时,其他方式替换迭代。