天天看點

第十三篇:SpringBoot 2.x整合Mybatis以及通用Mapper的問題更新 2018.11.21總結

今天聽說在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 + '\'' +
                '}';
    }
}
           

看得出來差別嗎?在這裡我僅僅是把

id

int

類型 轉為了

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
           

。。。

第十三篇:SpringBoot 2.x整合Mybatis以及通用Mapper的問題更新 2018.11.21總結

timg.jpg

具體情況還不清楚,我已經準備潛伏到

tk.mapper

的群裡問個明白,等搞清楚了再更新

更新 2018.11.21

在github的文檔上找到了

預設情況下,簡單類型會被識别為表中的字段,但是,不 包 含

Java

的 基 本 類 型
第十三篇:SpringBoot 2.x整合Mybatis以及通用Mapper的問題更新 2018.11.21總結

timg (1).jpg

繼續翻翻文檔,發現下面有一項配置可以支援基本類型

usePrimitiveType=true

總結

雖然之後找到了解決方案,但同時也發現了對應的問題

使用基本資料類型就會有預設值,而在

Mybatis

中經常會判斷屬性值是否為空,為了避免這樣的問題最好在類中聲明屬性時都使用包裝類