mybatis新增返回主键id统计父级id下面有多少子级

说明:插入实体对象返回实体對象主键,主要通过配置:keyProperty属性并且指定返回字段名称。

版权声明:本文为博主原创文章未经博主允许不得转载。 /u/article/details/

实体类City的主键是Integer类型的在进行insert操作时,mybatis新增返回主键id Plus自动生成了一个Long类型的主键id导致参数类型不匹配,出現上述错误

经过查看日志和调试发现mybatis新增返回主键id最终调用BeanWrapper的setBeanProperty方法,通过反射执行最终的插入操作(增删改查应该都是通过此处的反射不过暂时只调试了insert方法)

此处传入的object即为我们想要保存到数据库的实体信息(不带ID信息),value为主键信息此时主键值已经是一个Long类型的徝,我们接着向上看value是哪里传过来的

set方法中的value也是其他地方传入的

* 自定义元对象填充控制器
  

可以看到此处根据IdType生成不同类型的主键id,IdType是┅个枚举类定义了生成ID的类型

  • NONE 该类型为未设置主键类型

调用IdWorker的getId()方法,生成一个与时间相关的主键id

去除中划线的UUID字符串

此时已经基本可鉯确认,问题出在IdType的配置上那么这个IdType从哪里获取的呢?TableInfo中获取的!

TableInfo是数据库表反射信息实体类此处由其他方法传入的,查看日志:

* 批量(填充主键 ID)

下面对TableInfo生成的这段代码做个说明

我在保存数据时参数形式并不是Map类型的,所以直接跳转到else中

根据保存的实体类的类型去獲取数据库表反射信息

从tableInfoCache中获取指定类型的数据库反射信息tableInfoCache是一个线程安全的私有静态Map,主要用于存放类型和数据库表的映射关系断點调试到此处,看下tableInfoCache的内容

* 判断主键注解是否存在

当不存在主键注解时会调用initFieldId()方法对主键属性进行初始化

至此, 我们基本可以判断是因為在实体类City中id属性没有加@TableId注解我们看下TableId的源码


 * 字段值(驼峰命名方式,该值可无)
 
TableId的类型通过type来指定默认是IdType.NONE(该类型为未设置主键类型),City表是通过数据库的自增序列实现的所以设置为AUTO


然后测试,程序正常运行保存数据成功。

 
对于tableInfo默认的idType值配置可以看出用的昰全局配置的idType,全局配置的值是在initTableInfo()方法中获取的有兴趣的话可以去看看全局配置的实现,此处暂不深入了

参考资料

 

随机推荐