注解查詢映射
我們再來調用下面的 selectAll() 這個接口,執行的 SQL 是 select* from user_info
,表示全列查詢:
運行測試類對應方法,在日志中可以看到,字段名一致,Mybatis 就成功從數據庫對應的字段中拿到值,但是字段名不一樣,則沒有從數據庫中獲取到值;
因為 Java 和數據庫的屬性命名規范不同,導致一些字段名稱不同;
雖然數據庫返回的值是正確的,但是并沒有給 Java 中 UserInfo 類對象的各個屬性成功賦值;
此時,我們需要一個轉換規則,讓名稱不一樣的字段可以對應起來:
通過 as 起別名映射
我們通過 as
關鍵字來給字段起別名
select id , username, `password`, age, gender, phone, delete_flag as deleteFlag, create_time as createTime, update_time as updateTime from user_info;
驗證 SQL 語句是否可以被成功執行:
接下來,我們將起好別名的 SQL 語句用 Mybatis 執行:
執行對應測試類方法,觀察打印日志:
通過 @Results 進行結構映射映射
但是上面的方式還是比較麻煩的,我們可以通過注解 @Results
來綁定參數:
我們再繼續點 Result [ ]
查看源碼:
光從源碼,我們還是無法知道 @Results
注解是如何使用的;
下面是 @Results 注解的使用,用于對應名稱不一樣的數據庫字段和 java 屬性:
我們重新執行對應的測試類方法,觀察打印日志:
通過 @ResultsMap 復用@Results
但是如果后續還要執行關于 select 的 SQL ,豈不是每一個接口方法都要加上:
@Results({@Result(column = "delete_flag" , property = "deleteFlag"),@Result(column = "create_time" , property = "createTime"),@Result(column = "update_time" , property = "updateTime")})
還是有些麻煩了,是否有更簡單的工具,可以幫我們對應上名稱不一樣的字段呢?
我們再來查看 @Results
注解的源碼,源碼不單單只有 Result[ ],還有 id;
這個 id 屬性可以幫我們標識一條 @Result
注解對應的名字:
通過上面的方式,我們就給這條注解起好了名字,后續如果還要使用 @Results
映射剛剛的字段,只需要使用 @ResultMap
注解來映射 @Results
即可
執行 selectAllById
接口對應的測試類方法,觀察日志,成功給后面三個字段賦值,說明映射成功:
開啟駝峰命名
但但但但但是,上面的兩種方式還是太吃操作了,煮啵煮啵,有沒有更簡單快捷的映射方法推薦一下?
有的兄弟,有的!!!
接下來這款操作,不需要修改老長的 SQL 語句,也不需要使用復雜的 @Results、@Result、@ResultMap 注解;
我們只需要賦值下面的代碼到配置文件中,即可實現從數據庫命名規范字段
到 Java 命名規范字段
的轉換:
mybatis:configuration:map-underscore-to-camel-case: true # 開啟駝峰命名自動轉換
通常數據庫列使用蛇形命名法進行命名(下劃線分割各個單詞),而 Java 屬性一般遵循駝峰命名法
約定。
為了在這兩種命名方式之間啟用自動映射,需要將mapUnderscoreToCamelCase
設置為true。
駝峰命名規則:
abc_xyz
=>abcXyz
- 表中字段名:
abc_xyz
- 類中屬性名:
abcXyz
配置好對應 yml 文件后,我們再來執行下列接口對應的測試類方法:
觀察打印日志,賦值成功,說明成功映射參數:
XML 查詢映射
通過 as 起別名映射
上文提到,我們可以使用 as 對 SQL 中的字段起別名,來解決查詢映射的問題;
那么在 XML 開發模式下,又該如何解決該問題呢?我們寫出如下 SQL:
select id , username, `password`, age, gender, phone, delete_flag as deleteFlag, create_time as createTime, update_time as updateTime from user_info;
值得一提,XML 文件中的 SQL 語句換行沒有意義,依舊代表一個完整的字符串,但是在 java 文件中,SQL 語句換行是需要帶上 +
加號的;
我們執行對應的測試類方法:
查看打印日志,可以發現,不同名的對應屬性通過起別名的方式,依舊可以成功映射:
結果映射
我們重新添加一個方法,來講解結果映射:
<resultsMap>
此時,我們需要使用 <resultMap> </resultMap>
標簽來進行結果映射
其實<resultsMap>
標簽和 @Result 注解源碼是類似的,需要寫的字段一樣,知識寫法不同:
@Results 的寫法如下:
我們可以類比 <resultsMap>
的寫法:
不過,如果使用這種方法來映射屬性,就要把對象中的所有屬性的映射都寫全;
因為在別的 XML 文件中,依舊可以引入這個映射,特定場景下,如果這個映射沒有寫入全部對象屬性,則可能會映射不上;
生成測試語句,調用 selectAll2() 對應的測試類方法,觀察打印日志:
開啟駝峰命名
mybatis:configuration:map-underscore-to-camel-case: true # 開啟駝峰命名自動轉換