離你越近的地方,路途越遠;最簡單的音調,需要最艱苦的練習。——《泰戈爾詩選》

1、修改型別對映關係

在專案中,為了降低資料的儲存空間,status狀態欄位一般使用tinyint,
1個tinyint型資料只佔用一個位元組,一個int型資料佔用四個位元組。這看起來似乎差別不大,但是在比較大的表中,位元組數的增長是很快的。

tinyint的範圍一般是,帶符號的範圍是-128到127,無符號的範圍是0到255(1 bytes = 8 bit,0~2^8-1=255,-2^7~2^-1(-128~127))。這裡需要主要的是,我們經常看到int(1),tinyint(1),是不是意味著他們的儲存大小就一樣?其實不是的,數字型別後面括號中的數字,不表示長度,表示的是顯示寬度。這點與 varchar、char 後面的數字含義是不同的。

問題出現了,在mybatis-generator中,int(1)和tinyint(1)預設生成的jdbc型別是Boolean型別,只能表示true或false兩種狀態,無法表示多種狀態。

1.1 tinyint轉化為Byte型別

將其對映為Byte型別的解決方法有兩種:

(1)直接修改欄位長度,比如 tinyint(4) ;
(2)在jdbcURL 上加 ?tinyInt1isBit=false ,預設是true。

這種生成的對應語句為Byte型別了,可以表示多種狀態了。

1.2 tinyint轉戶為Integer型別

但是,在實際專案開發中Byte型別用起來不是很方便,我們想將Byte型別轉化為Integer型別,便於開發,解決方法同樣也有兩種:

(1)編寫一個外掛,修改mybatis原始碼中的JavaTypeResolver方法。參考地址。

(2)採用mybatis中table標籤的columnOverride方法。如:

generator.config配置:
<table xxx>
   <columnOverride column="status" javaType="Integer"/>
</table>

java生成的model:
private Integer status;

第一種方法是進行全域性修改,第二種方法是根據你的實際需要進行配置,比較方便,可根據需求動態配置。

2、修改主鍵對映

第二個問題也是在自動生成model的時候遇到的,我們知道在使用mybatis或tkmybatis時,能夠通過insert或insertSelective方法,通過getId()方法獲取自增主鍵的id,前提是需要在model上配置@GeneratedValue(generator = “JDBC)

@GeneratedValue 用於標註主鍵的生成策略,通過strategy 屬性指定。預設情況下,JPA 自動選擇一個最適合底層資料庫的主鍵生成策略:SqlServer對應identity,MySQL 對應 auto increment。
在javax.persistence.GenerationType中定義了以下幾種可供選擇的策略:
–IDENTITY:採用資料庫ID自增長的方式來自增主鍵欄位,Oracle 不支援這種方式;
–AUTO: JPA自動選擇合適的策略,是預設選項;
–SEQUENCE:通過序列產生主鍵,通過@SequenceGenerator 註解指定序列名,MySql不支援這種方式
–TABLE:通過表產生主鍵,框架藉由表模擬序列產生主鍵,使用該策略可以使應用更易於資料庫移植。

博主的JDBC是tkmybatis支援的一種屬性。

@Id
@GeneratedValue(generator = "JDBC")
private Long id;

我們想在生成的時候自動生成上述程式碼,而不是對每個生成的model去新增一行程式碼,解決方法是:

在採用generator.config中配置table標籤的generatedKey屬性:

<table xxx>
    <generatedKey column="id" sqlStatement="JDBC" identity="true"/>
</table>

這樣在model中就自動生成了generatedKey註解。