老师,拦截器中第28行if(ms.getId.contains(.....SELECT_KEY_SUFFIX))的作用
来源:5-4 代码层读写分离的实现B
慕数据1227650
2020-09-16
我多次debug发现无论是插入操作还是查询操作 这个if语句判断都为fasle 什么时候会为true?我进入源码发现 SELECT_KEY_SUFFIX的值为 '!selectKey' 而ms.getId的值就是执行的mapper映射文件中语句的id值 所以这个id什么时候会为'!selectKey'呢?'!selectKey'什么时候会用到?
写回答
1回答
-
慕数据1227650
提问者
2020-09-17
问题已解决
经过网上查资料发现useGeneratedKeys=true时
mybatis有两种不同的处理方式
1.对于支持主键自增的数据库 如MySQL 会在insert返回结果中给出新增的主键值,此时selectKey并未执行
2.对于不支持主键自增的数据库如Oracle 需要在insert前发送一个查询语句来查询新增主键的值,然后再insert插入的时候给出主键的值,此时selectKey会被执行并且id值的后缀默认为'!select'
所以 我们用的是MySQL数据库 这句if语句可以不要 但若数据库类型为Oracle 这句话必须有 否则由于selcetKey是读语句是查询的从数据库而不是主数据库 会导致我们获取不到主键的值
112020-09-17
相似问题