Mybatis部分 個人總結
一、JDBC程式設計有哪些不足之處:Mybatis是如何解決這些問題的?
1.資料庫連結建立、釋放頻繁造成系統資源浪費從而影響系統性能,如果使用資料庫連線池可以解決此問題
解決:在SqlMapConfig.xml中配置資料庫連線池,使用連線池管理資料庫連結
2.Sql語句寫在程式碼中,造成程式碼的不易維護,實際應用中Sql變化的可能較大,Sql變動需要改變Java原始碼
解決:將Sql語句配置在XXXMapper.xml檔案中,與java程式碼分離
3.向Sql語句傳引數麻煩,因為sql語句的where條件不一定,可能多也可能少,佔位符需要和引數一一對應
解決:Mybatis自動將java物件對映至sql語句
4.對結果集解析麻煩,sql變化導致解析程式碼變化,且解析前需要遍歷,如果能將資料庫記錄封裝成pojo物件解析比較方便
解決:Mybatis自動將sql執行結果對映至java物件。
二、Mybatis程式設計步驟是什麼樣的?
1.建立SqlSessionFactory
2.通過SqlSessionFactory建立SqlSession
3.通過SqlSession執行資料庫操作
4.呼叫session.commit()提交事務
5.呼叫session.close()關閉會話
三、Mybatis與Hibernate有哪些不同?
Mybatis和Hibernate不同,他不完全是一個ORM框架,因為Mybatis需要程式設計師自己編寫Sql語句,不過Mybatis可以通過XML或註解方式靈活配置要執行的sql語句,
並將java物件和sql語句對映生成最終執行的sql,最後將sql執行的結果再對映生成java物件
Mybatis學習門檻低,簡單易學,程式設計師直接編寫原生態sql,可嚴格控制sql執行效能,靈活度高,非常適合對關係資料模型要求不高的軟體開發,例如:網際網路軟體、企業運營類軟體等,
因為這類軟體需求變化頻繁,一但需求變化要求成果輸出迅速。但是靈活的前提是Mybatis無法做到資料庫無關性,如果需要實現支援多種資料庫的軟體則需要自定義多套sql對映檔案,工作量大
Hibernate物件/關係對映能力強,資料庫無關性好,對於關係模型要求高的軟體(例如需求固定的定製化軟體)如果用hibernate開發可以節省很多程式碼,提高效率。
但是Hibernate的缺點是學習門檻高,要精通門檻更高,而且怎麼設計O/R對映,在效能和物件模型之間如何權衡,以及怎樣用好Hibernate需要具有很強的經驗和能力
總之,按照使用者的需求在有限的資源環境下只要能做出維護性、擴充套件性良好的軟體架構都是好架構,所以框架只有適合才是最好
四、使用Mybatis的mapper介面呼叫時有哪些要求?
1.mapper介面方法名和mapper.xml中定義的每個sql的id相同
2.mapper介面方法的輸入引數型別和mapper.xml中定義的每個sql的parameterType的型別相同
3.mapper介面方法的輸出引數型別和mapper.xml中定義的每個sql的resultType的型別相同
4.mapper.xml檔案中的namespace即是mapper介面的類路徑。
五、SqlMapConfig.xml中配置有哪些內容?
SqlMapConfig.xml中配置的內容和順序如下:
properties(屬性)
settings(配置)
typeAliases(類型別名)
typeHandlers(型別處理器)
objectFactory(物件工廠)
plugins(外掛)
environments(環境集合屬性物件)
environment(環境子屬性物件)
transactionManager(事務管理)
dataSource(資料來源)
mappers(對映器)
六、簡單的說一下Mybatis的一級快取和二級快取?
Mybatis首先去快取中查詢結果集,如果沒有則查詢資料庫,如果有則從快取取出返回結果集就不走資料庫。Mybatis內部儲存快取使用HashMap,key為HashCode+sqlId+Sql語句。
value為從查詢出來對映生成的java物件
Mybatis的二級快取即查詢快取,它的作用域是一個mapper的namespace,即在同一個namespace中查詢sql可以從快取中獲取資料。二級快取是可以跨SqlSession的
七、Mapper編寫有哪幾種方式?
1.介面實現類繼承SqlSessionDaoSupport
使用此種方法需要編寫mapper介面,mapper介面實現類、mapper.xml檔案
(1)在SqlMapConfig.xml中配置mapper.xml的位置
<mappers>
<mapper resource = "mapper.xml檔案的地址">
<mapper resource = "mapper.xml檔案的地址">
</mappers>
(2)定義mapper介面
(3)實現類整合SqlSessionDaoSupport
mapper方法中可以this.getSqlSession()進行資料增刪改查
(4)spring配置
<bean id="" class="mapper介面的實現">
<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
</bean>
2.使用org.mybatis.spring.mapper.MapperFactoryBean
(1)在SqlMapConfig.xml中配置mapper.xml的位置
如果Mapper.xml和mapper介面的名稱相同且在同一個目錄,這裡可以不用配置
<mappers>
<mapper resource="mapper.xml檔案的地址">
<mapper resource="mapper.xml檔案的地址">
</mappers>
(2)定義mapper介面
注意
(1)mapper.xml中的namespace為mapper介面的地址
(2)mapper介面中的方法名和mapper.xml中的定義的statement的id保持一致
(3)Spring中定義
<bean id="" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="mapper介面地址">
<property name="sqlSessionFactory" ref="sqlSessionFactory">
</bean>
3.使用mapper掃描器
(1)mapper.xml檔案編寫
注意:
mapper.xml中的namespace為mapper介面的地址
mapper介面中的方法名和mapper.xml中的定義的statement的id保持一致
如果將mapper.xml和mapper介面的名稱保持一致則不用再SqlMapConfig.xml中進行配置
(2)定義mapper介面
注意mapper.xml的檔名和mapper的介面名稱保持一致,且放在同一個目錄
(3)配置mapper掃描器
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="mapper介面包地址"></property>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory">
</bean>
4.使用掃描器後從spring容器中獲取mapper的實現物件
掃描器將介面通過代理方法生成實現物件,要spring容器中自動註冊,名稱為mapper介面的名稱