1. 碎碎念
最近在业务中遇到一个问题,业务是这样的:在插入新用户时需要校验用户的某些信息是否唯一,而在程序中校验结果永远是不唯一的。然后我把 MyBatis 打印的执行 SQL 语句拿了出来在数据库中执行,发现没有数据。
然后我就奇怪了,数据库是同一个啊、SQL 是同一个啊、查询结果都没有变啊,为什么执行的结果在程序里面是 1,而在数据库中是0。
难道是因为 MyBatis 和数据库执行的结果不一样?
后来我才明白不一致的原因。
我编写了一个与实际业务类似的代码,用来模拟上述的问题。
2. 复现问题
2.1. 表结构
MySQL 数据库中创建了一张用户表,只有4个字段。
CREATE TABLE `user` (
`user_id` varchar(36) NOT NULL COMMENT '用户主键id',
`user_name` varchar(55) NULL DEFAULT NULL COMMENT '账号',
`password` varchar(55) NULL DEFAULT NULL COMMENT '密码',
`email` varchar(55) NULL DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY (`user_id`) USING BTREE
);
复制代码
2.2. 项目依赖
示例项目是一个 SpringBoot 工程,pom 文件中除了 web 依赖还有 mysql 的驱动、MyBatis 和 lombok。
org.springframework.boot
spring-boot-starter-web
2.2.6.RELEASE
mysql
mysql-connector-java
5.1.47
org.projectlombok
lombok
1.18.8
org.mybatis.spring.boot
mybatis-spring-boot-starter
1.3.0
复制代码
2.2. 业务
业务流程是这样:新建一个用户,在新建用户之前首先校验邮箱是否已在