前言
本篇文章我主要分享幾個我認為MyBtis比較重要的點,亦或是MyBatis在面試中高頻的幾個問題的分析,好~
廢話不多說,我們直接開始干貨!!!
MyBatis框架
- 前言
- 一、基礎概述
- 1.概述:
- 2.優點:
- 3.缺點:
- 二、環境搭建問題
- 三、CRUD注意事項
- 四、配置決議
- 1.環境和屬性
- 2.常見配置
- 3.映射器
- 方式一:
- 方式二:
- 方式三:
- 4.生命周期和作用域
- SqlSessionFactoryBuilder:
- SqlSessionFactory:
- SqlSession:
- 五、解決屬性名和欄位名不一致問題
- 1.方法一:
- 2.方法二:
- 六、多對一和一對多問題
- 七、動態SQL
- 八、快取
一、基礎概述
1.概述:
學過MyBatis的人都知道,MyBatis可以說是一種增強版的JDBC,既然和JDBC有關,那么MyBatis的作用想必大家也能夠知道,自然而然離不開資料庫
MyBatis是一種主流的ORM框架,之前叫做iBatis,后來更名為MyBatis,實作資料持久化的框架,
2.優點:
既然是JDBC的增強版,我們在學習JDBC的時候,可以知道JDBC的代碼量是相對較多的,而MyBatis則對JDBC進行了封裝,大大減少了代碼量
- 極大簡化了JDBC代碼的開發
- 簡單好用、容易上手、具有更好的靈活性
- 通過將SQL定義在XML中的方式降低程式的耦合性
- 支持動態SQL,可以根據具體業務需求靈活實作功能
3.缺點:
MyBatis是最好的嘛?任何事物都會有其的優越點,即使是優化了的JDBC也不例外
- 相比于Hibernate,開發者需要完成更多的作業,eg:定義SQL,設定POJO與資料的映射關系等
- 要求開發者具備一定的SQL撰寫能力,在一些特定場景下作業量較大
- 資料庫的移植性差,SQL依賴于底層資料庫,如果進行資料庫的遷移,部分SQL需要重撰寫
二、環境搭建問題
對于一些剛開始學習MyBatis的小伙伴來說,搭建環境可謂是令人頭疼的一項操作,接下來我總結一下大家在初次搭建環境及測驗時可能會出現的錯誤
1.組態檔沒用注冊
2.系結介面錯誤
3.方法名不對
4.回傳值型別不對
5.Maven匯出資源錯誤
6.mysql是5.7之前在注冊驅動時應該是com.mysql.jdbc.Driver
而mysql5.7之后則是com.mysql.cj.jdbc.Driver
三、CRUD注意事項
在進行資料庫操作的時候:增刪改要提交事務!!!
方式有兩種:
手動提交: sqlSession.commit();方法提交事務
自動提交:
我們可以在撰寫工具類的時候,手動設定為true
//既然有了 SqlSessionFactory,顧名思義,我們可以從中獲得 SqlSession 的實體,
// SqlSession 提供了在資料庫執行 SQL 命令所需的所有方法,你可以通過 SqlSession 實體來直接執行已映射的 SQL 陳述句,
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession(true);
}
四、配置決議
1.環境和屬性
①environments:
MyBatis 可以配置成適應多種環境,不過要記住:盡管可以配置多個環境,但每個 SqlSessionFactory 實體只能選擇一種環境,
Mybatis默認的事務管理器就是JDBC
連接池:POOLED
②properties:
我們可以通過properties屬性來實作參考組態檔
這些屬性可以在外部進行配置,并可以進行動態替換,你既可以在典型的 Java 屬性檔案中配置這些屬性,也可以在 properties 元素的子元素中設定【db.properties】
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
2.常見配置
接下來給大家說一下:型別別名
型別別名可為 Java 型別設定一個縮寫名字,
它僅用于 XML 配置,意在降低冗余的全限定類名書寫,例如:
<typeAliases>
<typeAlias type="com.zjd.pojo.User" alias="User"/>
</typeAliases>
或者用包名:
掃描物體類的包,它的默認別名就為這個類的 類名小寫
<typeAliases>
<package name="com.zjd.pojo"/>
</typeAliases>
總結:
物體類比較少,使用第一種方式
如果物體類過多,可以使用第二種
但是第一種可以diy起別名
第二種可以通過加注解起別名@Alias()
3.映射器
大家在第一次跑mybatis的程式時,想必都見過這個錯誤吧:MapperRegistry
翻譯過來也就是說:未注冊系結我們的mapper檔案
我們在運行時,如果不在核心組態檔中系結我們對應介面的Mapper.xml,程式怎么能夠識別呢?
方式一:
<mappers>
<mapper resource="com/wdit/dao/userMapper.xml"/>
</mappers>
方式二:
使用class檔案系結注冊
<!-- 使用映射器介面實作類的完全限定類名 -->
<mappers>
<mapper class="org.mybatis.builder.AuthorMapper"/>
<mappers>
注意點:
- 介面和它的mapper組態檔必須同名
- 介面和它的mapper組態檔必須在同一個包下
方式三:
<!-- 將包內的映射器介面實作全部注冊為映射器 -->
<mappers>
<package name="org.mybatis.builder"/>
</mappers>
注意點:
- 介面和它的mapper組態檔必須同名
- 介面和它的mapper組態檔必須在同一個包下
4.生命周期和作用域
SqlSessionFactoryBuilder:
- 一旦創建了 SqlSessionFactory,就不再需要它了
- 區域變數
SqlSessionFactory:
- 說白了就是可以理解成:資料庫連接池
- SqlSessionFactory 一旦被創建就應該在應用的運行期間一直存在,沒有任何理由丟棄它或重新創建另一個實體
- 因此 SqlSessionFactory 的最佳作用域是應用作用域
- 最簡單的就是使用單例模式或者靜態單例模式,
SqlSession:
- 連接到連接池的一個請求!
- 用完之后需要趕緊關閉,否則資源被占用
- SqlSession 的實體不是執行緒安全的,因此是不能被共享的,所以它的最佳的作用域是請求或方法作用域

五、解決屬性名和欄位名不一致問題
有時候,我們會發現比如資料庫表中寫到是pwd,然而我們創建物體類的時候卻寫成了password,結果我們在測驗時,就會報錯,這種情況怎么辦呢?
1.方法一:
起別名
select id,name,pwd as password from user where id= #{id}
2.方法二:
使用ResultMap結果集映射
<!-- 結果集映射-->
<resultMap id="UserMap" type="User">
<!-- column資料庫中的欄位,property物體類中的屬性-->
<result column="id" property="id"/>
<result column="name" property="name"/>
<result column="pwd" property="password"/>
</resultMap>
<select id="getUserByID" resultMap="UserMap">
select * from mybatis.user where id= #{id}
</select>
六、多對一和一對多問題
多對一和一對多問題是MyBatis里常見的問題,也是面試官比較愛問的問題

在這里,我簡單的說一下實作的兩種方法:
①按照結果嵌套查詢---------------------->sql陳述句完整
②按照查詢嵌套查詢---------------------->類似于子查詢,sql陳述句嵌套sql陳述句
兩種方法都是解決問題的方法,也沒什么優略之分,但是要注意
- 保證sql的可讀性【通俗易懂】
- 注意一對多和多對一,屬性名和欄位的問題
- 問題不好排除,可以用日志
七、動態SQL
所謂動態sql,我們就可以理解成根據不同條件動態的生成sql
動態sql還是相對好理解的,在這里,我就主要說一下sql片段
<sql id="if-title-author">
<if test="title != null">
and title=#{title}
</if>
<if test="author != null">
and author = #{author}
</if>
</sql>
當我們去寫動態sql時發現,頻繁的出現相同的代碼,此時我們可以采取sql片段的方法,將重復的提取出來
<include refid="if-title-author"></include>
在后續的sql陳述句中,插入include標簽即可使用,減少了代碼的復雜量
八、快取
這里我主要說一下MyBatis的快取原理:
用戶查詢的順序:
其實是從右往左,也就是從二級快取----一級快取----再去資料庫

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/253137.html
標籤:其他
