這是MyBatis系列第1篇。大概會用十三篇的篇幅來說解MyBatis,喜歡這個系列的歡迎關注公衆號【Java冢狐】獲取最新文章。那麼廢話很少說,讓咱們開始吧!java
要提及MyBatis,那要從尚未MyBatis的時代的時候提及。那個時候咱們進行數據庫開發的,大多使用jdbc來進行。可是JDBC的操做數據庫用起來真的是頭大。十分的繁瑣和無聊,很容易出現問題和錯誤。其中具體的狀況以下所示:mysql
上面這些操做都是咱們使用jdbc鏈接數據庫的時候必須通過的過程。能夠看出步驟十分的繁瑣,關鍵是這些步驟中不少都不是咱們程序員真正關心的,咱們程序員真正關心的只有拼接sql、執行sql和解析結果。程序員
可是基於JDBC得框架下,其餘的操做又不得不去編寫和操做,使得咱們在代碼編寫上十分的吃力和冗餘,對於程序員來講不是特別的友好。spring
正如上面所說的,JDBC有着一些很致命的缺點,整體來講有一下幾個方面:sql
正是由於JDBC有着一些致命的缺點才致使咱們使用其餘的框架來完成與數據庫的交互,諸如Hibernate和MyBatis就是其中比較好的表明。數據庫
介紹hibernate以前,咱們先了解一下什麼是ORM?編程
ORM:對象關係映射,簡單點說就是將數據庫中的表和java中的對象創建映射關係,可讓咱們操做對象來間接的操做數據庫。session
ORM最好的框架就是hibernate,hibernate可讓你經過java對象來間接的操做數據庫。對於開發者來講更加容易上手,也隱藏了底層jdbc和db的交互過程,對於程序員來講兼容了不一樣的數據庫,可是對程序員來講是無感的。只須要像操做對象同樣操做數據庫便可mybatis
其甚至方便到了即便你不會sql也能經過它來操做數據庫,能夠說是十分的友好了,尤爲是對於初入職場和工做經驗差的小夥伴來講。app
總結起來優勢就是:
正所謂有的就有失,咱們得到了這些方便,那也有一些相應的缺點和不足。
因此說Hibernate只適合作一些簡單的系統,或者是開發週期比較緊張的系統,對sql優化不高的項目。
而mybatis將sql交由開發者去控制,因此開發者來講比較自由自在,沒有過多的限制,能夠盡情的實現各類公司各類奇奇怪怪的業務和邏輯,在SQL優化方面,也是可以發揮程序員的能力,可謂是好壞皆有本身定。而Mybatis只是幫咱們把重複性的工做優化到了極致,例如操做db的過程、動態sql的拼接,結果和對象的映射都幫咱們處理完成了,不須要咱們過多的操心和關注。讓咱們把更多的精力放在sql的編寫上,因此這也受到了國內不少大廠的青睞,因此要想年後進入大廠那必需要掌握起來。
言而總之MyBatis:
上面說的這麼好,總歸是騾子是馬要拉出來遛一遛,那麼接下來咱們就一塊兒搭建一個Mybatis項目的架子,在下一篇文章中會將其填充完成。並進行演示
首先第一步就是要引入mybatis
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>${mybatis.version}</version> </dependency>
上面的myba.ve.version版本,你們能夠在maven倉庫中尋找最新的,或者公司要求的版本。
當咱們引入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="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatisdemo?characterEncoding=UTF-8"/> <property name="username" value="root"/> <property name="password" value="123456"/> </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> <mappers> <mapper resource="mapper/user.xml"/> </mappers> </configuration>
這個文件主要是對mybatis進行全局配置,好比數據源、事務的配置,如上面的datasource元素用來配置數據源,數據源中就須要指定數據庫的一些配置信息;在這裏我就設置了我使用到的數據庫的連續信息,你們能夠根據本身的數據庫更改這個代碼。
如今對於代碼並非很瞭解沒有關係,後續的文章會逐步進行講解和分析。
這個文件中表示咱們全部對錶的操做。完成後而後再由上面的mybatis的配置文件來引入,以下所示
<mappers> <mapper resource="mapper/user.xml"/> </mappers>
mappers元素中能夠有多個mapper文件,咱們開發的項目中可能有不少表須要操做,那麼對應會有不少mapper xml文件,咱們都須要在mappers元素中進行引入,而後mybatis纔會使用到。通常來講一個表對應一個mapper文件。
上面咱們建立了mybatis的配置文件和表操做文件,後面咱們就須要用一個Mapper接口來和咱們上面一步中的mapper.xml來創建映射關係。
後續當咱們調用Mapper接口中的方法的時候,會間接的調用到mapper xml中的各類數據的sql操做。
上面咱們建立了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動態代理實現的。
上面咱們說了,咱們能夠經過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中的核心組件,咱們具體來看一下。
這個是一個構建器,是用來構建SqlSessionFactory對象的,SqlSessionFactoryBuilder能夠經過讀取mybatis的配置文件,而後構建一個SqlSessionFactory對象。
SqlSessionFactoryBuilder將mybatis配置文件、mapper xml文件、mapper xml文件和Mapper 接口的映射關係,這些都先給解析好,而後放在java對象中,java對象存在於內存中,內存中訪問會很是快的,那麼咱們每次去用的時候就不須要從新去解析xml了,SqlSessionFactoryBuilder解析配置以後,生成的對象就是SqlSessionFactory,這個是一個重量級的對象,建立他是比較耗時的,因此通常一個db咱們會建立一個SqlSessionFactory對象,而後在系統運行過程當中會一直存在,而SqlSessionFactoryBuilder用完了就能夠釋放了。
經過名字能夠知道,這個是一個工廠,是用來建立SqlSession的工廠。
如上面所說SqlSessionFactory是一個重量級的對象,通常一個db對應一個SqlSessionFactory對象,系統運行過程當中會一直存在。
SqlSessionFactory是一個接口,這個接口有2個實現DefaultSqlSessionFactory和SqlSessionManager,通常都是經過SqlSessionFactoryBuilder來建立SqlSessionFactory對象。
經過SqlSessionFactoryBuilder來建立SqlSessionFactory對象主要有2種方式,一種經過讀取mybatis配置文件的方式,另一種是硬編碼的方式。
咱們經過jdbc操做數據庫須要先獲取一個Connection鏈接,而後拿着這個鏈接去對db進行操做,在mybatis中SqlSession就相似於jdbc中Connection鏈接對象,在mybatis中叫作Sql會話對象,通常咱們一個db操做使用一個SqlSession對象,因此這個對象通常是方法級別的,方法結束以後,這個對象就銷燬了,這個對象能夠調用sqlSessionFactory.openSession的方法來進行獲取。
咱們能夠直接經過SqlSession對象來調用mapper xml中各類db操做,須要指定具體的操做的id,id的格式爲namespace.操做的id。
咱們能夠經過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冢狐」獲取最新消息