1. 什么是Mybatis轮听?
(1)Mybatis是一個半ORM(對象關(guān)系映射)框架藻茂,它內(nèi)部封裝了JDBC,開發(fā)時只需要關(guān)注SQL語句本身,不需要花費精力去處理加載驅(qū)動折晦、創(chuàng)建連接宁改、創(chuàng)建statement等繁雜的過程谜喊。程序員直接編寫原生態(tài)sql怒坯,可以嚴格控制sql執(zhí)行性能归敬,靈活度高舱污。
(2)MyBatis 可以使用 XML 或注解來配置和映射原生信息,將 POJO映射成數(shù)據(jù)庫中的記錄缤底,避免了幾乎所有的 JDBC 代碼和手動設置參數(shù)以及獲取結(jié)果集膘流。
(3)通過xml 文件或注解的方式將要執(zhí)行的各種 statement 配置起來吸奴,并通過java對象和 statement中sql的動態(tài)參數(shù)進行映射生成最終執(zhí)行的sql語句,最后由mybatis框架執(zhí)行sql并將結(jié)果映射為java對象并返回。(從執(zhí)行sql到返回result的過程)渐北。
2. Mybaits的優(yōu)點:
答案:
1.把Sql語句從Java中獨立出來破托。
2.封裝了底層的JDBC吴叶,API的調(diào)用逊彭,并且能夠?qū)⒔Y(jié)果集自動轉(zhuǎn)換成JavaBean對象审胸,簡化了Java數(shù)據(jù)庫編程的重復工作。
3.自己編寫Sql語句芽淡,更加的靈活椭赋。
4.入?yún)o需用對象封裝(或者map封裝),使用@Param注解
另一種答案:
(1)基于SQL語句編程,相當靈活,不會對應用程序或者數(shù)據(jù)庫的現(xiàn)有設計造成任何影響,SQL寫在XML里讶迁,解除sql與程序代碼的耦合,便于統(tǒng)一管理;提供XML標簽婶希,支持編寫動態(tài)SQL語句,并可重用换棚。
(2)與JDBC相比,減少了50%以上的代碼量,消除了JDBC大量冗余的代碼萍程,不需要手動開關(guān)連接;
(3)很好的與各種數(shù)據(jù)庫兼容(因為MyBatis使用JDBC來連接數(shù)據(jù)庫嗤堰,所以只要JDBC支持的數(shù)據(jù)庫MyBatis都支持)划鸽。
(4)能夠與Spring很好的集成;
(5)提供映射標簽疏唾,支持對象與數(shù)據(jù)庫的ORM字段關(guān)系映射露氮;提供對象關(guān)系映射標簽莫绣,支持對象關(guān)系組件維護么翰。
3. MyBatis框架的缺點:
(1)SQL語句的編寫工作量較大,尤其當字段多每瞒、關(guān)聯(lián)表多時钞速,對開發(fā)人員編寫SQL語句的功底有一定要求调违。
(2)SQL語句依賴于數(shù)據(jù)庫雳锋,導致數(shù)據(jù)庫移植性差辛蚊,不能隨意更換數(shù)據(jù)庫软啼。
4. MyBatis框架適用場合:
(1)MyBatis專注于SQL本身,是一個足夠靈活的DAO層解決方案贞间。
(2)對性能的要求很高,或者需求變化較多的項目豆同,如互聯(lián)網(wǎng)項目佳晶,MyBatis將是不錯的選擇。
5. ibatis/mybatis框架的優(yōu)缺點?
? ? 優(yōu)點: 易于上手和掌握
? ? ? ? ? sql寫在xml里,便于統(tǒng)一管理和優(yōu)化
? 解除sql與程序代碼的耦合
? 提供對象關(guān)系映射標簽,支持對象關(guān)系組建維護
? 提供xml標簽,支持編寫動態(tài)sql
缺點: 可讀性低,調(diào)試非常困難,非常受限,無法像jdbc那樣在代碼里根據(jù)邏輯實現(xiàn)復雜動態(tài)sql拼接
6. ibatis核心類的作用;MyBatis核心類的作用?
? ? ibatis:
SqlMapClientBuilder: 加載配置文件,返回一個會話
SqlMapClient: 具體的會話
SqlSession: 對數(shù)據(jù)的增刪查改
SqlMapSession: 進行數(shù)據(jù)庫操作
SqlSessionManager: 創(chuàng)建SqlSesstion的對象
SqlMapTransactionManager: 定義事務管理功能
? ? Mybatis:
SqlSessionFactory 每個MyBatis應用的核心
7. mybatis/ibatis跟hibernate的比較;
Hibernate是全自動化的,只要配置映射文件,可以為我們動態(tài)的生成sql
ibatis是半自動化的,需要我們手動的編寫sql,ibatis簡單易學
Hibernate比較復雜,ibatis可以細粒度的優(yōu)化,而Hibernate是根據(jù)映射文件進行優(yōu)化
8. ibatis的工作流程或運行原理?
答案:
Mybatis工作原理:
1.通過SqlSessionFactoryBuilder從mybatis-config.xml配置文件中構(gòu)建出SqlSessionFactory议蟆。
2.SqlSessionFactory開啟一個SqlSession灼伤,通過SqlSession實例獲得Mapper對象并且運行Mapper映射的Sql語句。
3.完成數(shù)據(jù)庫的CRUD操作和事務提交咪鲜,關(guān)閉SqlSession。
另一種答案:
1.在sqlMapConfig的配置文件中進行數(shù)據(jù)庫連接的配置撞鹉。
2.在sqlMapConfig的xml配置文件中引用sqlMap的xml配置文件疟丙。
3.在sqlMap的xml配置文件中進行SQL文件的配置。(文件名稱隨意鸟雏,一般是javaBean的類名加xml享郊。)
4.通過SqlMapClient生成具體的操作,用來操作sqlMap配置文件中SQL文件的IBATIS對象。
5.SqlMapClient對象提供函數(shù)孝鹊,函數(shù)的參數(shù)對應替換sqlMap配置文件的id炊琉,parameter等屬性,完成SQL文件的執(zhí)行
9. #{}和${}的區(qū)別是什么又活?
答案:
${}:簡單字符串替換苔咪,把${}直接替換成變量的值,不做任何轉(zhuǎn)換柳骄,這種是取值以后再去編譯SQL語句团赏。
#{}:預編譯處理,sql中的#{}替換成耐薯?舔清,補全預編譯語句,有效的防止Sql語句注入曲初,這種取值是編譯好SQL語句再取值体谒。
總結(jié):一般用#{}來進行列的代替
另一種答案:
#{}是預編譯處理,${}是字符串替換臼婆。
Mybatis在處理#{}時抒痒,會將sql中的#{}替換為?號,調(diào)用PreparedStatement的set方法來賦值颁褂;
Mybatis在處理${}時评汰,就是把${}替換成變量的值。
使用#{}可以有效的防止SQL注入痢虹,提高系統(tǒng)安全性被去。
10. Mybatis是如何進行分頁的?分頁插件的原理是什么奖唯?
答案:
RowBounds對象分頁
在Sql內(nèi)直接書寫惨缆,帶有物理分頁
另一種答案:
Mybatis使用RowBounds對象進行分頁,它是針對ResultSet結(jié)果集執(zhí)行的內(nèi)存分頁,而非物理分頁坯墨〖呕悖可以在sql內(nèi)直接書寫帶有物理分頁的參數(shù)來完成物理分頁功能,也可以使用分頁插件來完成物理分頁捣染。
? ? ? 分頁插件的基本原理是使用Mybatis提供的插件接口骄瓣,實現(xiàn)自定義插件,在插件的攔截方法內(nèi)攔截待執(zhí)行的sql耍攘,然后重寫sql榕栏,根據(jù)dialect方言,添加對應的物理分頁語句和物理分頁參數(shù)蕾各。
11. Ibatis中#與$的區(qū)別扒磁?
(1)#號它會將傳進來的數(shù)據(jù)都當成一個一個字符串,會給數(shù)據(jù)加一對雙引號,而$號它會將傳進來的數(shù)據(jù)直接顯示生成到sql中
(2)#號能夠防止sql的注入,而$號無法防止sql的注入
(3)$方式一把用于傳入數(shù)據(jù)庫對象式曲,比如表名
12. ibatis與mybatis比較? # $ %干什么的
? ? 1 iBATIS3.0以后到goole公司了妨托,更名為mybatis
? ? 2 mybatis增加了接口綁定
? ? 3 傳值方式由##---#{}? $:解析數(shù)據(jù)庫的關(guān)鍵字? %:模糊查詢
? ? 4 mybatis核心類SqlSessionfactory SqlSeession? ? ibatis sqlMapclient
? ? 5 使用ognl表達式,體現(xiàn)在動態(tài)sql上
? ? 6 配置的改變吝羞,如別名的配置兰伤,mybatis移動到了總配置文件中
13. 為什么說Mybatis是半自動ORM映射工具?它與全自動的區(qū)別在哪里钧排?
Hibernate屬于全自動ORM映射工具医清,使用Hibernate查詢關(guān)聯(lián)對象或者關(guān)聯(lián)集合對象時,可以根據(jù)對象關(guān)系模型直接獲取卖氨,所以它是全自動的会烙。而Mybatis在查詢關(guān)聯(lián)對象或關(guān)聯(lián)集合對象時,需要手動編寫sql來完成筒捺,所以柏腻,稱之為半自動ORM映射工具。
14. Mybatis的一級系吭、二級緩存:
1)一級緩存: 基于 PerpetualCache 的 HashMap 本地緩存五嫂,其存儲作用域為 Session,當 Session flush 或 close 之后肯尺,該 Session 中的所有 Cache 就將清空沃缘,默認打開一級緩存。
2)二級緩存與一級緩存其機制相同则吟,默認也是采用 PerpetualCache槐臀,HashMap 存儲,不同在于其存儲作用域為 Mapper(Namespace)氓仲,并且可自定義存儲源水慨,如 Ehcache得糜。默認不打開二級緩存,要開啟二級緩存晰洒,使用二級緩存屬性類需要實現(xiàn)Serializable序列化接口(可用來保存對象的狀態(tài)),可在它的映射文件中配置<cache/> 朝抖;
3)對于緩存數(shù)據(jù)更新機制,當某一個作用域(一級緩存 Session/二級緩存Namespaces)的進行了C/U/D 操作后谍珊,默認該作用域下所有 select 中的緩存將被 clear治宣。
15. mybatis,hibernate如何開發(fā)一對多的案例 過程以及如何配置
? ? ? o : 一方放多方的集合,多方放一方的實體
? ? ? r : 多方放一方的id
? ? ? m :
? ? ? ? mybatis: 查詢數(shù)據(jù)
? ? ? ? ? ? 1 使用嵌套查詢或者嵌套結(jié)果
? ? ? ? ? ? ? ? 嵌套查詢: 先查詢自己的數(shù)據(jù)砌滞,另外發(fā)送一條sql查詢關(guān)聯(lián)數(shù)據(jù)侮邀,在collection標簽上使用select屬性指定id,如select='xxx',
? ? ? ? ? ? ? ? 嵌套結(jié)果: 一條sql查詢自己以及關(guān)聯(lián)數(shù)據(jù)布持,結(jié)果由mybatis自行封裝,在collection標簽上使用resultMap
? ? ? ? ? ? 2 插入數(shù)據(jù) 使用動態(tài)sql
? ? ? hibernate :在set標簽上使用級聯(lián)與反轉(zhuǎn)
? ? ? ? ? ? ? 1 級聯(lián):主對象做什么,其關(guān)聯(lián)對象也做同樣的操作
? ? ? ? ? ? ? 2 反轉(zhuǎn)? 將關(guān)聯(lián)字段的維護權(quán)交給多方陕悬,減少update語句?