1.JDBC有幾個步驟?
JDBC大致可以分為六個步驟:
加載驅動程序
獲得數據庫連接
創建一個Statement對象
操作數據庫,實現增刪改查
獲取結果集
關閉資源
2.什么是Mybatis?
如果在面試的時候被問到,只要你說出下面三種即可:
❝
MyBatis 是一款優秀的持久層框架,它支持自定義 SQL、存儲過程以及高級映射。
MyBatis 免除了幾乎所有的 JDBC 代碼以及設置參數和獲取結果集的工作。
MyBatis 可以通過簡單的 XML 或注解來配置和映射原始類型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 對象)為數據庫中的記錄。
❞
——來自官網。推薦大家按照官方的來回答。
3.什么是ORM?
全稱為Object Relational Mapping。對象-映射-關系型數據庫。對象關系映射(簡稱ORM,或O/RM,或O/R mapping),用於實現面向對象編程語言里不同類型系統的數據之間的轉換。簡單的說,ORM是通過使用描述對象和數據庫之間映射的元數據,將程序中的對象與關系數據庫相互映射。
ORM提供了實現持久化層的另一種模式,它采用映射元數據來描述對象關系的映射,使得ORM中間件能在任何一個應用的業務邏輯層和數據庫層之間充當橋梁。
4.說說ORM的優缺點
「優點」1.提高了開發效率。由於ORM可以自動對Entity對象與數據庫中的Table進行字段與屬性的映射,所以我們實際可能已經不需要一個專用的、龐大的數據訪問層。2.ORM提供了對數據庫的映射,不用sql直接編碼,能夠像操作對象一樣從數據庫獲取數據。
「缺點」犧牲程序的執行效率和會固定思維模式,降低了開發的靈活性。
從系統結構上來看,采用ORM的系統一般都是多層系統,系統的層次多了,效率就會降低。ORM是一種完全的面向對象的做法,而面向對象的做法也會對性能產生一定的影響。
在我們開發系統時,一般都有性能問題。性能問題主要產生在算法不正確和與數據庫不正確的使用上。
ORM所生成的代碼一般不太可能寫出很高效的算法,在數據庫應用上更有可能會被誤用,主要體現在對持久對象的提取和和數據的加工處理上,如果用上了ORM,程序員很有可能將全部的數據提取到內存對象中,然后再進行過濾和加工處理,這樣就容易產生性能問題。
在對對象做持久化時,ORM一般會持久化所有的屬性,有時,這是不希望的。但ORM是一種工具,工具確實能解決一些重復,簡單的勞動。這是不可否認的。但我們不能指望工具能一勞永逸的解決所有問題,有些問題還是需要特殊處理的,但需要特殊處理的部分對絕大多數的系統,應該是很少的。
5.說說Mybaits的優缺點
優點
① 基於SQL語句編程,相當靈活,不會對應用程序或者數據庫的現有設計造成任何影響,SQL寫在XML里,解除sql與程序代碼的耦合,便於統一管理;提供XML標簽,支持編寫動態SQL語句,並可重用。
② 與JDBC相比,減少了50%以上的代碼量,消除了JDBC大量冗余的代碼,不需要手動開關連接;
③ 很好的與各種數據庫兼容(因為MyBatis使用JDBC來連接數據庫,所以只要JDBC支持的數據庫MyBatis都支持)。
④ 能夠與Spring很好的集成;
⑤ 提供映射標簽,支持對象與數據庫的ORM字段關系映射;提供對象關系映射標簽,支持對象關系組件維護。
缺點
① SQL語句的編寫工作量較大,尤其當字段多、關聯表多時,對開發人員編寫SQL語句的功底有一定要求。
② SQL語句依賴於數據庫,導致數據庫移植性差,不能隨意更換數據庫。
MyBatis框架適用場合:
(1)MyBatis專注於SQL本身,是一個足夠靈活的DAO層解決方案。
(2)對性能的要求很高,或者需求變化較多的項目,如互聯網項目,MyBatis將是不錯的選擇。
6.Mybatis是如何進行分頁的?
Mybatis使用RowBounds對象進行分頁,它是針對ResultSet結果集執行的內存分頁,而非物理分頁,先把數據都查出來,然后再做分頁。
可以在sql內直接書寫帶有物理分頁的參數來完成物理分頁功能,也可以使用分頁插件來完成物理分頁。
7.分頁插件的基本原理是什么?
分頁插件的基本原理是使用Mybatis提供的插件接口,實現自定義插件,在插件的攔截方法內攔截待執行的sql,然后重寫sql(SQL拼接limit),根據dialect方言,添加對應的物理分頁語句和物理分頁參數,用到了技術JDK動態代理,用到了責任鏈設計模式。
8.簡述Mybatis的插件運行原理?
Mybatis僅可以編寫針對ParameterHandler、ResultSetHandler、StatementHandler、Executor這4種接口的插件,Mybatis使用JDK的動態代理,為需要攔截的接口生成代理對象以實現接口方法攔截功能,每當執行這4種接口對象的方法時,就會進入攔截方法,具體就是InvocationHandler的invoke()方法,當然,只會攔截那些你指定需要攔截的方法。
9.如何編寫一個插件?
編寫插件:實現Mybatis的Interceptor接口並復寫intercept()方法,然后再給插件編寫注解,指定要攔截哪一個接口的哪些方法即可,最后在配置文件中配置你編寫的插件。推薦:建議收藏,mybatis插件原理詳解
10.Mybatis動態sql有什么用?
Mybatis動態sql可以在Xml映射文件內,以標簽的形式編寫動態sql,執行原理是根據表達式的值完成邏輯判斷 並動態調整sql的功能。
Mybatis提供了9種動態sql標簽:trim | where | set | foreach | if | choose | when | otherwise | bind。
11.Xml映射文件中有哪些標簽?
除了常見的select|insert|updae|delete標簽之外,還有:
12.Mybatis是否支持延遲加載?
Mybatis僅支持association關聯對象和collection關聯集合對象的延遲加載,association指的就是一對一,collection指的就是一對多查詢。在Mybatis配置文件中,可以配置是否啟用延遲加載lazyLoadingEnabled=true|false。
13.延遲加載的基本原理是什么?
延遲加載的基本原理是,使用CGLIB創建目標對象的代理對象,當調用目標方法時,進入攔截器方法。
比如調用a.getB().getName(),攔截器invoke()方法發現a.getB()是null值,那么就會單獨發送事先保存好的查詢關聯B對象的sql,把B查詢上來,然后調用a.setB(b),於是a的對象b屬性就有值了,接着完成a.getB().getName()方法的調用。
當然了,不光是Mybatis,幾乎所有的包括Hibernate,支持延遲加載的原理都是一樣的。
14.mapper.xml文件對應的Dao接口原理是?
簡單說:使用了JDK動態代理和反射,把接口和xml綁定在一起而搞定的。
15.Dao接口里的方法,參數不同時能重載嗎?
不能重載。
16.#{}和${}的區別是什么?
${}是字符串替換,#{}是預處理;
Mybatis在處理時,就是把{}直接替換成變量的值。而Mybatis在處理#{}時,會對sql語句進行預處理,將sql中的#{}替換為?號,調用PreparedStatement的set方法來賦值;
使用#{}可以有效的防止SQL注入,提高系統安全性。
17.Mybatis執行批量插入,能返回數據庫主鍵列表嗎?
1、對於支持生成自增主鍵的數據庫:增加 useGenerateKeys和keyProperty ,
2、不支持生成自增主鍵的數據庫:使用
方式:
insert into Author (username, password, email, bio) values
(#{item.username}, #{item.password}, #{item.email}, #{item.bio})
注意Mybatis的版本,官方在這個3.3.1版本中加入了批量新增返回主鍵id的功能 。
18.不同的Xml映射文件,id是否可以重復?
不同的Xml映射文件,如果配置了namespace,那么id可以重復;如果沒有配置namespace,那么id不能重復;畢竟namespace不是必須的,只是最佳實踐而已。
原因就是namespace+id是作為Map<String, MappedStatement>的key使用的,如果沒有namespace,就剩下id,那么,id重復會導致數據互相覆蓋。有了namespace,自然id就可以重復,namespace不同,namespace+id自然也就不同。
19.Mybatis中Executor執行器的區別是?
Mybatis有三種基本的Executor執行器,「SimpleExecutor、ReuseExecutor、BatchExecutor。」
SimpleExecutor:每執行一次update或select,就開啟一個Statement對象,用完立刻關閉Statement對象。
ReuseExecutor:執行update或select,以sql作為key查找Statement對象,存在就使用,不存在就創建,用完后,不關閉Statement對象,而是放置於Map<String, Statement>內,供下一次使用。簡言之,就是重復使用Statement對象。
BatchExecutor:執行update(沒有select,JDBC批處理不支持select),將所有sql都添加到批處理中(addBatch()),等待統一執行(executeBatch()),它緩存了多個Statement對象,每個Statement對象都是addBatch()完畢后,等待逐一執行executeBatch()批處理。與JDBC批處理相同。
作用范圍:Executor的這些特點,都嚴格限制在SqlSession生命周期范圍內。
20.為什么說Mybatis是半自動ORM映射工具?
Hibernate屬於全自動ORM映射工具,使用Hibernate查詢關聯對象或者關聯集合對象時,可以根據對象關系模型直接獲取,所以它是全自動的。
而Mybatis在查詢關聯對象或關聯集合對象時,需要手動編寫sql來完成,所以,稱之為半自動ORM映射工具。
(2)Mybatis直接編寫原生態sql,可以嚴格控制sql執行性能,靈活度高,非常適合對關系數據模型要求不高的軟件開發,因為這類軟件需求變化頻繁,一但需求變化要求迅速輸出成果。但是靈活的前提是mybatis無法做到數據庫無關性,如果需要實現支持多種數據庫的軟件,則需要自定義多套sql映射文件,工作量大。
(3)Hibernate對象/關系映射能力強,數據庫無關性好,對於關系模型要求高的軟件,如果用hibernate開發可以節省很多代碼,提高效率。
其實關於常見ORM框架還設有Spring的JPA,后期的面試可能會更傾向於問JPA和Mybatis的區別了。希望大家留意點。
21.Mybatis全局配置文件中有哪些標簽?
❝
configuration 配置
properties 屬性:可以加載
properties配置文件的信息
settings 設置:可以設置mybatis的全局屬性
typeAliases 類型命名
typeHandlers 類型處理器
objectFactory 對象工廠
plugins 插件
environments 環境
environment 環境變量
transactionManager 事務管理器
dataSource 數據源
mappers 映射器
❞
22.當實體類中的屬性名和表中的字段名不一樣時怎么辦 ?
第 1 種:通過在查詢的 sql 語句中定義字段名的別名,讓字段名的別名和實體類的屬性名一致。
第 3 種:使用注解時候,使用Result,和第二種類似。
23.模糊查詢 like 語句該怎么寫?
第 1 種:在 Java 代碼中添加 sql 通配符。
String wildcardname = “%smi%”;
list
第 2 種:在 sql 語句中拼接通配符,會引起 sql 注入
String wildcardname = “smi”;
list
24.Mybatis構建步驟?
整體步驟:
25.簡述一下Mybatis 的手動編程步驟?
創建 SqlSessionFactory
通過 SqlSessionFactory 創建 SqlSession
通過 sqlsession 執行數據庫操作
調用 session.commit()提交事務
調用 session.close()關閉會話
25.Mybatis工作的流程是?
Mybatis工作流程可以大致分為四個步驟: