關(guān)于mybatis關(guān)聯(lián)查詢,及到底好在哪里的疑惑。
老師您好,工作中一直未使用過mybatis,既然用戶信息及密碼在兩張表里存著,為何不用映射關(guān)系呢?或者為什么不用關(guān)聯(lián)查詢返回結(jié)果而要請(qǐng)求兩次數(shù)據(jù)庫呢?看到mybatis查詢返回都是對(duì)應(yīng)的數(shù)據(jù)庫對(duì)象,那如果我要想返回多表關(guān)聯(lián)的結(jié)果該怎么做呢?個(gè)人認(rèn)為mybais的xml文件寫起來很麻煩,求教mybatis到底好在哪里為什么現(xiàn)在用mybatis的越來越多,mybatis的多表關(guān)聯(lián)是不是寫起來很麻煩不如直接jdbctemplate來洋洋灑灑。求教,謝謝。
2018-12-10
你好:
mybatis和jdbctemplate比較,的確jdbctemplate可以讓你非常自由的寫代碼,就像直接寫sql語句一樣,但是這些自由度在企業(yè)級(jí)的團(tuán)隊(duì)內(nèi)的應(yīng)用是災(zāi)難性的,首先,所有人的代碼落地都是基于自己的業(yè)務(wù)場(chǎng)景,放縱的寫sql,用join,當(dāng)然,必要的多對(duì)多的join是可以的,但是好幾張甚至好幾十張表關(guān)聯(lián)在一起的應(yīng)用是沒有辦法維護(hù)的,到那一天所有人都會(huì)發(fā)現(xiàn)我們的應(yīng)用是完全面向數(shù)據(jù)庫的設(shè)計(jì)風(fēng)格,而不是面向業(yè)務(wù)模型的,等到業(yè)務(wù)發(fā)生了變化所有人都要看代碼改代碼到底層的sql語句級(jí)別,而且多join的數(shù)據(jù)表操作在上萬數(shù)據(jù)后都是沒有任何性能優(yōu)化的空間,索引都不知道往哪里加,因此mybatis提供的是orm的一套框架,不是說mybatis好,而是orm在業(yè)務(wù)模型的應(yīng)用中好,將數(shù)據(jù)庫當(dāng)作簡單的存儲(chǔ),業(yè)務(wù)應(yīng)用只感知領(lǐng)域模型,模型及是業(yè)務(wù),性能優(yōu)化也圍繞模型去做,用緩存存模型而非單純靠sql語句優(yōu)化。
用戶和密碼對(duì)應(yīng)的一對(duì)一關(guān)系的確可以用mybatis的關(guān)系映射做,但是試想日后我們數(shù)據(jù)庫龐大到一定程度了需要拆庫分表,我們第一個(gè)想到的是將只有登陸會(huì)用的密碼表放到另一個(gè)數(shù)據(jù)庫,將現(xiàn)在的user數(shù)據(jù)表放在獨(dú)立的數(shù)據(jù)庫內(nèi)提升用戶查詢方面的效率,這個(gè)時(shí)候一個(gè)mybatis的映射是無法跨兩個(gè)數(shù)據(jù)源的,因此性能優(yōu)化又會(huì)碰到問題。我強(qiáng)烈推薦數(shù)據(jù)庫和mybatis的dataobject做一對(duì)一關(guān)系,既方便代碼的維護(hù),又可以清晰的在model層面理清領(lǐng)域模型的處理關(guān)系。當(dāng)然針對(duì)一些聯(lián)合查詢排序的問題還是要依靠join的。我說的絕對(duì)不是不用join,而是可以依靠單表操作解決的一定不要用join