我们在使用mysql的json字段的时候有时为了方便,最好是查询的时候直接反序列化为对象比较好,这时候我们就用到了typehandler这个属性
首先mybatis plus 会初始化一系列的 typeHandler,并且扫描用户设置的typeHandler路径(mybatis-plus: type-handlers-package: //路径),把用户自定义的typeHandler一并初始化到 typeHandlerMap中
执行查询的时候,会先处理参数,获取所传参数的typehandler,然后setparameter之类的,处理完之后会执行 baseExecutor的doquery方法
当设置 @TableName(autoResultMap = true) 时,会自动根据类型以及对应的注解去匹配,而不需要手动匹配。开始的时候就会把所有的mapper的对应的放进mappedStatements里
在doquery前就把resultMapping设置好
key为对应的我们对应的mapper里对应的方法
在mybatis解析的时候会从根据当前的方法去获取对应的映射的statement
如selectById 这里会走到selectList,再根据我们当前的statement去从配置中获取到映射好的MappedStatement
在这个MappedStatement中,我们就可以发现,typehandler已经配置好了的
当不设置 @TableName(autoResultMap = true)时,查询的时候执行getJdbcHandlerMap方法,尝试根据字段的类型,手动从map中获取handler,把每个字段都配置上对应的handler,如果没找到handler则不处理结果也就是返回null
然后我们再把注解去掉,同样走到这里:
我们发现这里的resultMapping是空的,也就是没有自动装配,所以没有注解是到后面才做的匹配映射
所以最好的方式就是用官方推荐的: autoResultMap = true 必传。通过注解可以灵活处理
当然,我们使用自己在mapper中写的方法时,是不走自动映射的,这时候我们需要自定resultMap,把需要的的字段定义上typeHandler