首先Mybatis是一個優秀的持久層ORM框架,它對jdbc的操作數據庫的過程進行封裝,使得開發者只需要關注SQL本身。不需要花費精力去處理一些重復和繁瑣的步驟。最后通過java對象和statement中的sql進行映射生成最終執行的sql語句。最后由mysql框架執行sql並將結果映射成java對象並返回。
ORM:對象關系映射,簡單點說就是將數據庫中的表和java中的對象建立映射關系,可以讓我們操作對象來間接的操作數據庫。
半ORM:在查詢關聯對象或關聯集合對象時,需要手動編寫sql來完成。
MyBatis編程步驟
- 創建SqlSessionFactory
- 通過SqlSessionFactory創建SqlSession
- 通過sqlsession執行數據庫操作
- 調用session.commit()提交事務
- 調用session.close關閉會話
MyBatis的工作原理
- 讀取MyBatis配置文件。(獲取MyBatis的運行環境等信息)
- 加載映射文件。(SQL映射文件,其中配置了操作數據庫的SQL語句)
- 構造會話工廠:通過MyBatis的環境等配置信息構建會話工廠SqlSessionFactory
- 創建會話對象:有會話工廠創建SqlSession對象,該對象包括了執行SQL語句的所有方法
- Executor執行器:根據SqlSession傳遞的參數動態的生成需要執行的SQL語句,同時負責查詢緩存的維護
- Mappedstatement對象:用於存儲要映射的SQL語句的id、參數等信息
- 輸入參數映射:參數類型可以為Map、List等集合類型也可以使用基本數據類型和POJO類型
- 輸出結果映射:和輸入類似。
MyBatis的優點
- 基於SQL語句編程,相當靈活。SQL寫在XML中,解除sql與程序代碼的耦合,便於統一管理。提供XML標簽,支持編寫動態SQL語句,並可重用
- 消除了 JDBC 大量冗余的代碼,不需要手動開關連接;
- 很好的與各種數據庫兼容
- 能夠與 Spring 很好的集成;
- 提供映射標簽,支持對象與數據庫的 ORM 字段關系映射;提供對象關系映射標簽,支持對象關系組件維護。
MyBatis框架的缺點
- SQL 語句的編寫工作量較大,尤其當字段多、關聯表多時,對開發人員編寫SQL 語句的功底有一定要求。
- SQL 語句依賴於數據庫,導致數據庫移植性差,不能隨意更換數據庫。
MyBatis與Hibernate有哪些不同
- MyBatis是一個半ORM框架,需要自己編寫sql語句,靈活性高,但是需要自定義多套sql映射文件,工作量大
- Hibernate數據庫無關性好,節省代碼,提高效率
#{}和${}的區別
- #{}:是預編譯處理,會把sql中的#{}替換為?,調用PreoaredStatement的set方法來賦值
- ${}:是字符串替換,用於標簽屬性值和sql內部,屬於靜態文本替換。把${}替換為變量的值。
使用#{}可以有效的防止SQL注入,提高系統的安全性 。
當實體類的屬性名和表中的字段名不一致如何處理
模糊查詢like怎么編寫
- 在Java代碼中添加sql通配符
- 在sql語句中拼接通配符(但是會引起sql注入問題)
通常一個Xml映射文件,都會寫一個Dao接口與之對應。那么Dao接口的工作原理是什么。
Dao接口就是Mapper接口。
- 接口的全限定名就是映射文件的namespace的值
- 接口的方法名就是映射文件中Mapper的Statement的id值
- 接口方法內的參數就是傳遞給sql的參數
Mapper接口是沒有實現類的,當調用接口方法的時候,接口的全限定名+方法名拼接字符串作為key值,可以唯一定位一個MapperStatement。在MyBatis中,每一個