mybatis是支援普通sql查詢、儲存過程和高階對映的優秀持久層框架。封裝了 幾乎所有的jdbc**和引數的手工設定 ,以及結果集的檢索:
封裝了:1,獲取連線,執行sql,釋放連線。
2,sql的引數設定,屬性自動傳遞引數(例如emp有name和age屬性,sql語句寫成「insert into emp (name,age) values(#,#)」就可以了,不用像jdbc 一樣還要用preparedstatement物件設定引數ps.setstring(1,「xiaoming」)
hibernate也是當前流行的orm工具,訪問資料庫的框架,對資料結構提供了較完整的封裝。
封裝了:1,獲取連線,sql編寫,執行sql,釋放連線。
2,sql引數設定,
3,記錄封裝成實體物件等一系列過程。
對比上面兩個,一目了然,hibernate相比mabatis居然連sql編寫也封裝了。這點本質的不同,是mybatis與hibernate的最大區別,很多網上寫的區別,看起來很亂,很頭大其實大多都是從這點引發出來的。
接下來我們一點一點的說。
區別一:擴充套件性方面。使用mybatis要自己根據相應的資料庫寫不同的sql實現,例如用mysql資料庫寫了乙個sql的分頁語句,如果換成了oracle資料庫就用不了了。然而如果是hibernate的hql語句則是對實體類(user)和屬性的操作,也拿分頁查詢來說,string hql=「from user」; query q1=session.creatquery(hql); q1.setfirstresult(m);q1.setmaxresult(n); listlist=q1.list();會根據具體的資料庫生成各自相應不同的查詢的語句,所以移植性很好。
區別二:sql效率,優化方面。hibernate的查詢,更新都是對所有欄位的操作例如(根據id查詢,sessin.get(user.class,"id"),還有要session.update(物件)時,按照物件的id做條件,更新其他字段資訊。如果想要更新部分字段,其他字段保持不變,則物件的其他字段對應的屬性也要有原值),這一點會有效能消耗。hibernate也可以自己寫sql來指定需要查詢的字段,但這樣就破壞了hibernate開發的簡潔性。而mybatis的sql是手動編寫的,所以可以按需求指定查詢的字段。maybatis的優化,就是對sql語句的優化,mybatis在session方面和hibernate的session生命週期是一致的,同樣需要合理的session管理機制。hibernate的優化(可以記一下):
制定合理的快取策略;
盡量使用延遲載入特性;
採用合理的session管理機制;
使用批量抓取,設定合理的批處理引數(batch_size);
進行合理的o/r對映設計
還有一點被面試問到過,就是sql和hql形式上的區別。個人認為屬於第一點區別:
sql: select 欄位名...from table_name where 欄位名... sql是直接對資料庫表的操作
hql:select 屬性名...from 實體類 where 屬性 條件 ...group by 屬性order by屬性。hql是對與表有對映關係的實體類的操作,底層會再自動生成相應的sql。
以上點就是最大的區別了。當然網上還有說物件管理和抓取策略,快取機制什麼的,太高階了這裡不再討論了。附上連線:
面試之jpa和mybatis的區別
第一 jpa是物件與物件之間的對映,而mybatis是物件和結果集的對映。第二 jpa移植性比較好,不用關心用什麼資料庫,因為mybatis自由寫sql語句,所以當專案移植的時候還需要改sql。及時判斷資料庫型別,不嫌累麼 第三 當需要修改欄位的時候mybatis改起來特別費事,而jpa就相對簡單。...
面試之Mybatis中的 和 區別?
mybatis是如何做到sql預編譯的呢?其實在框架底層,是jdbc中的preparedstatemen類在起作用,preparedstatement是我們很熟悉的statement的子類,它的物件包含了編譯好的sql語句。這種 準備好 的方式不僅能提高安全性,而且在多次執行同乙個sql時,能夠提高...
Mybatis面試整理
和 的區別 當實體類中的屬性名和表中的欄位名不一樣,如果將查詢的結果封裝到指定pojo 模糊查詢like語句該怎麼寫 通常乙個xml對映檔案,都會寫乙個dao介面與之對應,dao的工作原理,是否可以過載 mybatis是如何進行分頁的,分頁外掛程式實現的原理 xml對映檔案中,除了常見的select...