這是MyBatis系列第1篇,大概會用十三篇的篇幅來講解MyBatis,喜歡這個系列的歡迎關注公眾號【Java冢狐】獲取最新文章,那么廢話不多說,讓我們開始吧!
沒有MyBatis的時代
要說起MyBatis,那要從還沒有MyBatis的時代的時候說起,那個時候我們進行資料庫開發的,大多使用jdbc來進行,但是JDBC的操作資料庫用起來真的是頭大,十分的繁瑣和無聊,很容易出現問題和錯誤,其中具體的情況如下所示:
JDBC時代
連接使用資料庫的程序:
- 加載驅動
- 獲取連接
- 拼接sql
- 執行sql
- 獲取結果
- 決議結果
- 關閉資料庫
上面這些操作都是我們使用jdbc連接資料庫的時候必須經過的程序,可以看出步驟十分的繁瑣,關鍵是這些步驟中很多都不是我們程式員真正關心的,我們程式員真正關心的只有拼接sql、執行sql和決議結果,
但是基于JDBC得框架下,其他的操作又不得不去撰寫和操作,使得我們在代碼撰寫上十分的吃力和冗余,對于程式員來說不是特別的友好,
JDBC缺點
正如上面所說的,JDBC有著一些很致命的缺點,總體來說有一下幾個方面:
- 重復代碼過多
- 每個操作耗時過多
- 除錯維護麻煩
- 動態sql方面沒有規范,難以維護
正是因為JDBC有著一些致命的缺點才導致我們使用其他的框架來完成與資料庫的互動,諸如Hibernate和MyBatis就是其中比較好的代表,
Hibernate
介紹hibernate之前,我們先了解一下什么是ORM?
ORM
ORM:物件關系映射,簡單點說就是將資料庫中的表和java中的物件建立映射關系,可以讓我們操作物件來間接的操作資料庫,
ORM最好的框架就是hibernate,hibernate可以讓你通過java物件來間接的操作資料庫,對于開發者來說更加容易上手,也隱藏了底層jdbc和db的互動程序,對于程式員來說兼容了不同的資料庫,但是對程式員來說是無感的,只需要像操作物件一樣操作資料庫即可
其甚至方便到了即使你不會sql也能通過它來操作資料庫,可以說是十分的友好了,尤其是對于初入職場和作業經驗差的小伙伴來說,
優點
總結起來優點就是:
- 簡化了整個jdbc操作程序
- 需要去操作物件,不需要關心sql,hibernate可以幫我們自動生成所需要的sql
- 代碼移植性比較好,通過hibernate操作db都是通過操作物件來進行的,如果我們需要切換db的型別,hibernate會自動適應,對于開發者業務代碼來說不需要做任何業務代碼上的調整
- 開發效率比較高
缺點
正所謂有的就有失,我們獲得了這些方便,那也有一些相應的缺點和不足,
- sql優化比較艱難,各種操作最終發給db的,而sql是由hibernate自動生成的,對于開發者來說如果想干預最終需要執行的sql,相對來說比較困難
- hibernate入門比較容易,精通難
- 對于復雜的動態sql,代碼中也需要寫很多判斷進行組裝,動態sql這塊的支持比較欠缺
所以說Hibernate只適合做一些簡單的系統,或者是開發周期比較緊張的系統,對sql優化不高的專案,
MyBatis
而mybatis將sql交由開發者去控制,所以開發者來說比較自由自在,沒有過多的限制,可以盡情的實作各種公司各種奇奇怪怪的業務和邏輯,在SQL優化方面,也是能夠發揮程式員的能力,可謂是好壞皆有自己定,而Mybatis只是幫我們把重復性的作業優化到了極致,例如操作db的程序、動態sql的拼接,結果和物件的映射都幫我們處理完成了,不需要我們過多的操心和關注,讓我們把更多的精力放在sql的撰寫上,所以這也受到了國內很多大廠的青睞,所以要想年后進入大廠那必須要掌握起來,
言而總之MyBatis:
- 是一款優秀的持久層框架
- 幾乎避免了所有的JDBC代碼和壽佛那個設定引數以及獲取結果集的程序,
- 使用簡單的XML或者注釋來配置和映射原生資訊,將介面和Java的物體類映射成資料庫中的記錄
mybatis開發專案的具體步驟
上面說的這么好,總歸是騾子是馬要拉出來遛一遛,那么接下來我們就一起搭建一個Mybatis專案的架子,在下一篇文章中會將其填充完成,并進行演示
Spring專案中引入mybatis maven配置
首先第一步就是要引入mybatis
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
上面的myba.ve.version版本,大家可以在maven倉庫中尋找最新的,或者公司要求的版本,
創建mybatis組態檔
當我們引入Mybatis后,接下來就是要撰寫mybatis的組態檔,組態檔為xml格式,一般放在resource目錄下,
如下所示:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties>
<property name="driver" value="https://www.cnblogs.com/javazhonghu/archive/2021/02/02/com.mysql.jdbc.Driver"/>
<property name="url" value="https://www.cnblogs.com/javazhonghu/archive/2021/02/02/jdbc:mysql://localhost:3306/mybatisdemo?characterEncoding=UTF-8"/>
<property name="username" value="https://www.cnblogs.com/javazhonghu/archive/2021/02/02/root"/>
<property name="password" value="https://www.cnblogs.com/javazhonghu/archive/2021/02/02/123456"/>
</properties>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="https://www.cnblogs.com/javazhonghu/archive/2021/02/02/${driver}"/>
<property name="url" value="https://www.cnblogs.com/javazhonghu/archive/2021/02/02/${url}"/>
<property name="username" value="https://www.cnblogs.com/javazhonghu/archive/2021/02/02/${username}"/>
<property name="password" value="https://www.cnblogs.com/javazhonghu/archive/2021/02/02/${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/user.xml"/>
</mappers>
</configuration>
這個檔案主要是對mybatis進行全域配置,比如資料源、事務的配置,如上面的datasource元素用來配置資料源,資料源中就需要指定資料庫的一些配置資訊;在這里我就設定了我使用到的資料庫的連續資訊,大家可以根據自己的資料庫更改這個代碼,
現在對于代碼并不是很了解沒有關系,后續的文章會逐步進行講解和分析,
創建mapper xml檔案
這個檔案中表示我們所有對表的操作,完成后然后再由上面的mybatis的組態檔來引入,如下所示
<mappers>
<mapper resource="mapper/user.xml"/>
</mappers>
mappers元素中可以有多個mapper檔案,我們開發的專案中可能有很多表需要操作,那么對應會有很多mapper xml檔案,我們都需要在mappers元素中進行引入,然后mybatis才會使用到,一般來說一個表對應一個mapper檔案,
創建Mapper介面
上面我們創建了mybatis的組態檔和表操作檔案,后面我們就需要用一個Mapper介面來和我們上面一步中的mapper.xml來建立映射關系,
后續當我們呼叫Mapper介面中的方法的時候,會間接的呼叫到mapper xml中的各種資料的sql操作,
Mapper介面與xml檔案關聯
上面我們創建了Mapper介面和xml檔案,但是這兩者又是如何建立關聯的呢?
這就需要uesr.xml中進行配置,如下所示
<mapper namespace="zhonghu.mybatis.chat01.UserMapper"
注意上面的namespace的值,對應的是UserMapper這個介面完整的參考,通過這個namespace,UserMapper介面就可以user.xml建立了映射關系,
user.xml中又有很多db操作,這些操作會和UserMapper介面中的方法建立映射關系,當呼叫UserMapper中的方法的時候,間接的會呼叫到user.xml中對應的操作,
如user.xml中有下面一段配置:
<!-- 批量插入 -->
<insert id="insertBatch" parameterType="map">
<![CDATA[ INSERT INTO `user` (`id`, `name`, `age`, `salary`) VALUES ]]>
<foreach collection="list" separator="," item="item">
(#{item.id}, #{item.name}, #{item.age}, #{item.salary})
</foreach>
</insert>
而UserMapper中有個insertBatch方法和上面這個insert批量插入對應,如下:
/**
* 批量插入用戶資訊
*
* @param userModelList
*/
void insertBatch(List<UserModel> userModelList);
所以當我們呼叫UserMapper中的insertBatch方法的時候,會間接呼叫到user.xml中的id ="insertBatch"這個操作,
下面我們就可以使用mybatis來操作db了,
介面和mapper xml映射起來間接呼叫,是通過java動態代理實作的,
通過mybatis獲取Mapper介面執行對db的操作
上面我們說了,我們可以通過mapper介面來執行對db的操作,獲取Mapper的主要代碼如下:
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"));
SqlSession sqlSession = sqlSessionFactory.openSession(true);
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
上面代碼中使用到了mybatis中的核心組件,我們具體來看一下,
Mybatis核心物件介紹
SqlSessionFactoryBuilder
這個是一個構建器,是用來構建SqlSessionFactory物件的,SqlSessionFactoryBuilder可以通過讀取mybatis的組態檔,然后構建一個SqlSessionFactory物件,
SqlSessionFactoryBuilder將mybatis組態檔、mapper xml檔案、mapper xml檔案和Mapper 介面的映射關系,這些都先給決議好,然后放在java物件中,java物件存在于記憶體中,記憶體中訪問會非常快的,那么我們每次去用的時候就不需要重新去決議xml了,SqlSessionFactoryBuilder決議配置之后,生成的物件就是SqlSessionFactory,這個是一個重量級的物件,創建他是比較耗時的,所以一般一個db我們會創建一個SqlSessionFactory物件,然后在系統運行程序中會一直存在,而SqlSessionFactoryBuilder用完了就可以釋放了,
SqlSessionFactory
通過名字可以知道,這個是一個工廠,是用來創建SqlSession的工廠,
如上面所說SqlSessionFactory是一個重量級的物件,一般一個db對應一個SqlSessionFactory物件,系統運行程序中會一直存在,
SqlSessionFactory是一個介面,這個介面有2個實作DefaultSqlSessionFactory和SqlSessionManager,一般都是通過SqlSessionFactoryBuilder來創建SqlSessionFactory物件,
通過SqlSessionFactoryBuilder來創建SqlSessionFactory物件主要有2種方式,一種通過讀取mybatis組態檔的方式,另外一種是硬編碼的方式,
SqlSession
我們通過jdbc操作資料庫需要先獲取一個Connection連接,然后拿著這個連接去對db進行操作,在mybatis中SqlSession就類似于jdbc中Connection連接物件,在mybatis中叫做Sql會話物件,一般我們一個db操作使用一個SqlSession物件,所以這個物件一般是方法級別的,方法結束之后,這個物件就銷毀了,這個物件可以呼叫sqlSessionFactory.openSession的方法來進行獲取,
我們可以直接通過SqlSession物件來呼叫mapper xml中各種db操作,需要指定具體的操作的id,id的格式為namespace.操作的id,
Mapper介面
我們可以通過SqlSession直接呼叫mapper xml中的db操作,不過更簡單的以及推薦的方式是使用Mapper介面,Mapper介面中的方法和mapper xml檔案中的各種db操作建立了映射關系,是通過Mapper介面完整名稱+方法名稱和mapper xml中的namespace+具體操作的id來進行關聯的,然后我們直接呼叫Mapper介面中的方法就可以間接的操作db了,使用想當方便,Mapper介面需要通過SqlSession獲取,傳入Mapper介面對應的Class物件,然后會回傳這個介面的實體,如:
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
最后
- 如果覺得看完有識訓,希望能關注一下,順便給我點個贊,這將會是我更新的最大動力,感謝各位的支持
- 歡迎各位關注我的公眾號【java冢狐】,專注于java和計算機基礎知識,保證讓你看完有所識訓,不信你打我
- 求一鍵三連:點贊、轉發、在看,
- 如果看完有不同的意見或者建議,歡迎多多評論一起交流,感謝各位的支持以及厚愛,
——我是冢狐,和你一樣熱愛編程,
歡迎關注公眾號“Java冢狐”獲取最新訊息
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/255840.html
標籤:其他
