第十三篇:SpringBoot 2.x整合Mybatis以及通用Mapper的问题

今天听说在SpringBoot整合mybatis和通用mapper的时候会产生一个奇怪的问题,即执行sql语句的时候会找不到主键,比如下面这个样子

//这是我要执行的方法,很明显就只是查询user表中的所有数据 userMapper.selectAll(); //结果是这样的 2018-11-20 16:17:54.111 DEBUG 10640 --- [nio-8111-exec-1] p.gabriel.mapper.UserMapper.selectAll : ==> Preparing: SELECT username,password FROM user 2018-11-20 16:17:54.111 DEBUG 10640 --- [nio-8111-exec-1] p.gabriel.mapper.UserMapper.selectAll : ==> Parameters: 2018-11-20 16:17:54.129 DEBUG 10640 --- [nio-8111-exec-1] p.gabriel.mapper.UserMapper.selectAll : <== Total: 1

明显看到id这个列并没有被查询到,第一反应是先去查看User

package priv.gabriel.model; import javax.persistence.*; /** * Created with Intellij IDEA. * * @Author: Gabriel * @Date: 2018-11-20 * @Description: */ @Entity @Table public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; @Column private String username; @Column private String password; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "User{" + "id=" + id + ", username='" + username + '\'' + ", password='" + password + '\'' + '}'; } }

然而并没有什么问题,该标识的都标识了,然后又去查了一波dao

package priv.gabriel.mapper; import org.apache.ibatis.annotations.Mapper; import priv.gabriel.model.User; import tk.mybatis.mapper.common.BaseMapper; /** * Created with Intellij IDEA. * * @Author: Gabriel * @Date: 2018-11-20 * @Description: */ @Mapper public interface UserMapper extends BaseMapper<User>{ }

···根本不可能出现问题嘛,然后绞尽脑汁的考虑的各方面的问题,怀疑是版本问题甚至把tk.mapper的2.x版本挨个下载完了,但是,并没有什么用。
就在我怀疑人生的时候,突然瞟了一眼User类,灵光一闪,改造成了如下的款式

package priv.gabriel.model; import javax.persistence.*; /** * Created with Intellij IDEA. * * @Author: Gabriel * @Date: 2018-11-20 * @Description: */ @Entity @Table public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column private String username; @Column private String password; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "User{" + "id=" + id + ", username='" + username + '\'' + ", password='" + password + '\'' + '}'; } }

看得出来区别吗?在这里我仅仅是把idint类型 转为了 Long类型居然就好了???

2018-11-20 16:33:10.236 DEBUG 10076 --- [nio-8111-exec-1] p.gabriel.mapper.UserMapper.selectAll : ==> Preparing: SELECT id,username,password FROM user 2018-11-20 16:33:10.257 DEBUG 10076 --- [nio-8111-exec-1] p.gabriel.mapper.UserMapper.selectAll : ==> Parameters: 2018-11-20 16:33:10.281 DEBUG 10076 --- [nio-8111-exec-1] p.gabriel.mapper.UserMapper.selectAll : <== Total: 1

。。。

9988457-0a1da1a6c9c60659.jpg
timg.jpg

具体情况还不清楚,我已经准备潜伏到 tk.mapper的群里问个明白,等搞清楚了再更新

更新 2018.11.21

在github的文档上找到了

默认情况下,简单类型会被识别为表中的字段,但是不 包 含 Java 的 基 本 类 型

9988457-71039c28e0a9a519.jpg
timg (1).jpg

继续翻翻文档,发现下面有一项配置可以支持基本类型
usePrimitiveType=true

总结

虽然之后找到了解决方案,但同时也发现了对应的问题

使用基本数据类型就会有默认值,而在Mybatis中经常会判断属性值是否为空,为了避免这样的问题最好在类中声明属性时都使用包装类


__EOF__

本文作者Gabriel
本文链接https://www.cnblogs.com/youarephoenix/p/15972918.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   gabriel丶  阅读(46)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示