MyBatisPlus深入探究映射匹配的兼容性
映射匹配兼容性
前面我們已經(jīng)能從表中查詢出數(shù)據(jù),并將數(shù)據(jù)封裝到模型類中,這整個(gè)過程涉及到一張表和一個(gè)模型類:
之所以數(shù)據(jù)能夠成功的從表中獲取并封裝到模型對(duì)象中,原因是表的字段列名和模型類的屬性名一樣。
那么問題就來了:
- 問題1:表字段與編碼屬性設(shè)計(jì)不同步
當(dāng)表的列名和模型類的屬性名發(fā)生不一致,就會(huì)導(dǎo)致數(shù)據(jù)封裝不到模型對(duì)象,這個(gè)時(shí)候就需要其中一方做出修改,那如果前提是兩邊都不能改又該如何解決?
MP給我們提供了一個(gè)注解@TableField
,使用該注解可以實(shí)現(xiàn)模型類屬性名和表的列名之間的映射關(guān)系
- 問題2:編碼中添加了數(shù)據(jù)庫中未定義的屬性
當(dāng)模型類中多了一個(gè)數(shù)據(jù)庫表不存在的字段,就會(huì)導(dǎo)致生成的sql語句中在select的時(shí)候查詢了數(shù)據(jù)庫不存在的字段,程序運(yùn)行就會(huì)報(bào)錯(cuò),錯(cuò)誤信息為:
Unknown column ‘多出來的字段名稱’ in ‘field list’
具體的解決方案用到的還是@TableField
注解,它有一個(gè)屬性叫exist
,設(shè)置該字段是否在數(shù)據(jù)庫表中存在,如果設(shè)置為false則不存在,生成sql語句查詢的時(shí)候,就不會(huì)再查詢?cè)撟侄瘟恕?/p>
- 問題3:采用默認(rèn)查詢開放了更多的字段查看權(quán)限
查詢表中所有的列的數(shù)據(jù),就可能把一些敏感數(shù)據(jù)查詢到返回給前端,這個(gè)時(shí)候我們就需要限制哪些字段默認(rèn)不要進(jìn)行查詢。解決方案是@TableField
注解的一個(gè)屬性叫select
,該屬性設(shè)置默認(rèn)是否需要查詢?cè)撟侄蔚闹?,true(默認(rèn)值)表示默認(rèn)查詢?cè)撟侄?,false表示默認(rèn)不查詢?cè)撟侄巍?/p>
知識(shí)點(diǎn)@TableField
名稱 | @TableField |
---|---|
類型 | 屬性注解 |
位置 | 模型類屬性定義上方 |
作用 | 設(shè)置當(dāng)前屬性對(duì)應(yīng)的數(shù)據(jù)庫表中的字段關(guān)系 |
相關(guān)屬性 | value(默認(rèn)):設(shè)置數(shù)據(jù)庫表字段名稱 exist:設(shè)置屬性在數(shù)據(jù)庫表字段中是否存在,默認(rèn)為true,此屬性不能與value合并使用 select:設(shè)置屬性是否參與查詢,此屬性與select()映射配置不沖突 |
- 問題4:表名與編碼開發(fā)設(shè)計(jì)不同步
該問題主要是表的名稱和模型類的名稱不一致,導(dǎo)致查詢失敗,這個(gè)時(shí)候通常會(huì)報(bào)如下錯(cuò)誤信息:
Table ‘databaseName.tableNaem’ doesn’t exist,翻譯過來就是數(shù)據(jù)庫中的表不存在。
解決方案是使用MP提供的另外一個(gè)注解@TableName
來設(shè)置表與模型類之間的對(duì)應(yīng)關(guān)系。
知識(shí)點(diǎn)@TableName
名稱 | @TableName |
---|---|
類型 | 類注解 |
位置 | 模型類定義上方 |
作用 | 設(shè)置當(dāng)前類對(duì)應(yīng)于數(shù)據(jù)庫表關(guān)系 |
相關(guān)屬性 | value(默認(rèn)):設(shè)置數(shù)據(jù)庫表名稱 |
代碼演示
接下來我們使用案例的方式把剛才的知識(shí)演示下:
步驟1:修改數(shù)據(jù)庫表user為tbl_user
直接查詢會(huì)報(bào)錯(cuò),原因是MP默認(rèn)情況下會(huì)使用模型類的類名首字母小寫當(dāng)表名使用。
步驟2:模型類添加@TableName注解
@Data @TableName("tbl_user") public class User { private Long id; private String name; private String password; private Integer age; private String tel; }
步驟3:將字段password修改成pwd
直接查詢會(huì)報(bào)錯(cuò),原因是MP默認(rèn)情況下會(huì)使用模型類的屬性名當(dāng)做表的列名使用
步驟4:使用@TableField映射關(guān)系
@Data @TableName("tbl_user") public class User { private Long id; private String name; @TableField(value="pwd") private String password; private Integer age; private String tel; }
步驟5:添加一個(gè)數(shù)據(jù)庫表不存在的字段
@Data @TableName("tbl_user") public class User { private Long id; private String name; @TableField(value="pwd") private String password; private Integer age; private String tel; private Integer online; }
直接查詢會(huì)報(bào)錯(cuò),原因是MP默認(rèn)情況下會(huì)查詢模型類的所有屬性對(duì)應(yīng)的數(shù)據(jù)庫表的列,而online不存在
步驟6:使用@TableField排除字段
@Data @TableName("tbl_user") public class User { private Long id; private String name; @TableField(value="pwd") private String password; private Integer age; private String tel; @TableField(exist=false) private Integer online; }
步驟7:查詢時(shí)將pwd隱藏
@Data @TableName("tbl_user") public class User { private Long id; private String name; @TableField(value="pwd",select=false) private String password; private Integer age; private String tel; @TableField(exist=false) private Integer online; }
到此這篇關(guān)于MyBatisPlus深入探究映射匹配的兼容性的文章就介紹到這了,更多相關(guān)MyBatis映射匹配內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java中javamail收發(fā)郵件實(shí)現(xiàn)方法
這篇文章主要為大家詳細(xì)介紹了java中javamail收發(fā)郵件實(shí)現(xiàn)方法,實(shí)例分析了javamail的使用方法與相關(guān)注意事項(xiàng),非常具有實(shí)用價(jià)值,感興趣的小伙伴們可以參考一下2016-02-02關(guān)于MyBatis中映射對(duì)象關(guān)系的舉例
這篇文章主要介紹了關(guān)于MyBatis中映射對(duì)象關(guān)系的舉例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06java foreach循環(huán)為什么不能賦值的講解
這篇文章主要介紹了java foreach循環(huán)為什么不能賦值的講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09詳解Java中的延時(shí)隊(duì)列 DelayQueue
這篇文章主要介紹了Java中延時(shí)隊(duì)列 DelayQueue的相關(guān)資料,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下2020-12-12IntelliJ IDEA中打開拼寫檢查與忽略提示曲線的方法
今天小編就為大家分享一篇關(guān)于IntelliJ IDEA中打開拼寫檢查與忽略提示曲線的方法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-10-10sprintboot使用spring-security包,緩存內(nèi)存與redis共存方式
這篇文章主要介紹了sprintboot使用spring-security包,緩存內(nèi)存與redis共存方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10Java設(shè)計(jì)模式之裝飾者模式詳解和代碼實(shí)例
這篇文章主要介紹了Java設(shè)計(jì)模式之裝飾者模式詳解和代碼實(shí)例,Decorator模式(別名Wrapper):動(dòng)態(tài)將職責(zé)附加到對(duì)象上,若要擴(kuò)展功能,裝飾者提供了比繼承更具彈性的代替方案,需要的朋友可以參考下2014-09-09