最近在知乎讀書複習劉增輝老師所著的《MyBatis從入門到精通》一書,頗有收穫,因而將本身學習的過程以博客形式輸出,若有錯誤,歡迎指正!知乎讀書能夠經過火狐瀏覽器另存頁面爲「網頁,所有」的方式永久保存你借閱的電子書。html
做爲一個正在自學Java的自動化專業本科生,在學習和實踐過程當中」趟了很多雷「,「走了很多彎路」。這本書首先是適合剛學完JavaSE知識後入門,不足之處是未能在整合過程當中集成spring框架測試。爲此我會將更新的IDEA版源碼給出。java
MyBatis是一款支持自定義SQL查詢、存儲過程和高級映射的持久層框架。消除了幾乎全部JDBC代碼和參數的手動設置以及結果集的檢索。mysql
MyBatis可使用XML或註解進行配置和映射。它經過將參數映射到配置的SQL最終造成執行的SQL語句,最後將執行的SQL的結果映射成Java對象返回。git
與其餘的ORM(對象關係映射)框架不一樣,MyBatis並沒有將Java對象與數據庫表關聯起來,而是將Java方法與SQL語句關聯。github
MyBatis 支持聲明式數據緩存( declarative data caching )。當一條 SQL 語句被標記爲「可緩存」後,首次執行它時從數據庫獲取的全部數據會被存儲在高速緩存中,後面再執行這條語句時就會從高速緩存中讀取結果,而不是再次命中數據庫。spring
- MyBatis官方GitHub地址爲:https://github.com/mybatis
Maven是一個項目構建和管理工具。目前市面上不少(2018年之前出版)陳舊的Java參考書還停留在講如何使用Eclipse開發工具,包括本書。不過自2018年以後IT培訓畢業班的雙元視頻都在介紹如何使用IntelliJ IDEA開發。sql
所以咱們要新建個Maven項目,使用IntelliJ IDEA 2018.3.6 新建Maven項目的過程以下:數據庫
+ Create New Projectapache
注:JDK1.8 和 Maven3.6.2是須要用戶解壓安裝並配置好系統環境變量,相關教程請參考黑馬雙元視頻課的介紹。api
咱們新建完的Maven項目結構以下圖所示:
默認生成的pom.xml文件其內容以下所示。
(此處省略,工具自動生成->無需記憶)
首先,設置源代碼編碼方式爲UTF-8,配置以下。(推薦新手看:尚硅谷Java開發利器:IntelliJ IDEA的安裝、配置與使用 ->編碼格式如何在IDEA中配置成UTF-8)
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>1.8</java.version> </properties>
接着,設置編譯源代碼的JDK版本,爲了增大兼容範圍使用的是JDK 1.8,配置以下。
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version><!-- May, 2019 --> <configuration> <source>${java.version}</source> <target>${java.version}</target> <encoding>${project.build.sourceEncoding}</encoding> </configuration> </plugin> </plugins> </build>
還須要在配置文件pom.xml中添加一些依賴才能使接下來的工做順利進行。
這裏要添加最重要的Mybatis3依賴、接着還須要添加會用到的 MySql驅動、JUnit、、Log4j的依賴。
注:數據庫依賴的version要和本身電腦安裝的實際狀況一致->高版本的數據庫驅動好比8.0.17兼容5.6.45數據庫,可是url具體的一些鏈接規則有變化。(好比須要serverTimezone=Asia/Shanghai)
能夠經過 http://search.maven.org/ 或 http://mvnrepository.com/ 來查找依賴座標。
junit 是一個單元測試框架,那麼使用 Junit 能讓咱們快速的完成單元測試。下載地址: https://www.mvnjar.com/junit/junit/4.12/detail.html
mysql是一個數據庫,Navicat是數據庫可視化操做工具,二者須要先自行安裝後再進行本實驗流程。下載地址: https://www.mysql.com/downloads/
log4j是一個一款開源的日誌框架,在項目中,咱們通常會結合slf4j和log4j一塊兒使用。 下載地址: http://logging.apache.org/log4j/1.2/download.html
slf4j是一個簡單日記門面(simple logging Facade for java)能夠爲各類loging APIs提供一個簡單統一的接口。 下載地址: https://www.slf4j.org/download.html
最終的pom.xml文件內容以下:
完成這個步驟後,MyBatis的基本開發環境就已經準備好了。
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>cn.bjut.mybatis</groupId> <artifactId>example</artifactId> <version>0.1-SNAPSHOT</version> <packaging>jar</packaging> <properties> <java.version>1.8</java.version> </properties> <dependencies> <!-- 單元測試 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.6</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.45</version> </dependency> <!--日誌相關--> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.25</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.25</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version><!-- May, 2019 --> <configuration> <source>${java.version}</source> <target>${java.version}</target> <encoding>UTF-8</encoding> </configuration> </plugin> </plugins> </build> </project>
注:首先須要安裝mysql軟件,而且記下root管理員的密碼。而後再安裝Navicat這個有圖形界面的MySQL客戶端工具,此處命令行代碼的錄入建議用文本編輯器 Notepad++。
SQL語句學習,推薦看 《MYSQL必知必會》。
經過執行下面的SQL語句建立一個名爲 testmybatis的數據庫,而後再建立一個名爲country的表並插入一些簡單的數據。
CREATE DATABASE testmybatis DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; -- mysql語句單行註釋使用 "-- " 注意,--後跟有一個空格 use testmybatis; -- 表頭的字符串用` `括起來 CREATE TABLE `country`( `id` int NOT NULL AUTO_INCREMENT , `countryname` varchar(255) NULL , `countrycode` varchar(255) NULL , PRIMARY KEY (`id`) ); -- 表的字符串內容用' '括起來,格式使用同MATLAB insert country (`countryname`,`countrycode`) values ('中國','CN'),('美國','US'),('俄羅斯','RU'), ('英國','GB'),('法國','FR');
首先點擊【鏈接】彈出窗體 肯定->建立了一個名爲‘MyBatis從入門到精通’的【鏈接】->右鍵單擊選擇【打開鏈接】->右鍵菜單選擇【命令列界面】->輸入上述SQL語句並回車獲得結果以下:
咱們檢查一下 數據庫testmybatis 表country的內容以下圖所示:
除XML方式外,在後面介紹MyBatis集成Spring會使用spring bean方式進行配置。
若是是SpringBoot開發構建微服務項目,還能夠經過Java編碼方式進行配置。
本節使用XML形式進行配置,首先在 src/main/resources 下面建立 mybatis-config.xml配置文件。
也能夠叫作 SqlMapConfig.xml(對文件名沒有強制要求,但公司內部通常有默認的標準約定)。
<?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> <settings> <!--配置日誌輸出接口--> <setting name="logImpl" value="LOG4J"/> <!--其餘 mybatis配置--> <setting name=" mapUnderscoreToCamelCase" value="true"/> </settings> <!--存儲查詢結果實體類包的全路徑--> <typeAliases> <package name="cn.bjut.simple.model"/> </typeAliases> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"> <property name="" value=""/> </transactionManager> <dataSource type="UNPOOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/testmybatis?serverTimezone=Asia/Shanghai"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> <mappers> <mapper resource="cn/bjut/simple/mapper/CountryMapper.xml"/> <mapper resource="cn/bjut/simple/mapper/UserMapper.xml"/> <mapper resource="cn/bjut/simple/mapper/RoleMapper.xml"/> <mapper resource="cn/bjut/simple/mapper/PrivilegeMapper.xml"/> <mapper resource="cn/bjut/simple/mapper/UserRoleMapper.xml"/> <mapper resource="cn/bjut/simple/mapper/RolePrivilegeMapper.xml"/> <!--<package name="cn.bjut.example.mapper"/>--> </mappers> </configuration>
MyBatis是一個 結果映射框架 ,這裏建立的實體類是一個數據值對象(Data Value Object)。在實際應用中,一個表通常會對應一個實體。
package cn.bjut.simple.model; public class Country { //實體類的成員變量 private Long id; private String countryname; private String countrycode; //Alt+Insert 生成get/set方法 public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getCountryname() { return countryname; } public void setCountryname(String countryname) { this.countryname = countryname; } public String getCountrycode() { return countrycode; } public void setCountrycode(String countrycode) { this.countrycode = countrycode; } @Override public String toString() { return "Country{" + "id=" + id + ", countryname='" + countryname + '\'' + ", countrycode='" + countrycode + '\'' + '}'; } }
在 src/main/resources 目錄下面建立 cn/bjut/simple/mapper 目錄,再在該目錄下面建立 CountryMapper.xml文件,添加以下內容。
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > <mapper namespace="cn.bjut.simple.mapper.CountryMapper"> <select id="selectAll" resultType="Country"> select id,countryname,countrycode from country </select> </mapper>
SQL定義在 CountryMapper.xml文件中,裏面的配置做用以下。
建立好實體和Mapper.xml後,接下來要有針對性地配置 Log4j ,讓MyBatis在執行數據庫操做時將有關信息輸出到控制檯。
在 src/main/resources 中添加 log4j.properties配置文件,輸入以下內容。
#全局配置 log4j.rootLogger=ERROR, stdout #MyBatis 日誌配置 log4j.logger.cn.bjut.simple.mapper=TRACE #控制檯輸出配置 log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
在MyBatis的日誌實現中,所謂的包名其實是XML配置中 namespace 屬性值的一部分。因爲namespace屬性值必須和接口全限定類名相同(只有這樣框架才能自動建立接口的實現類)。
MyBatis日誌的 最低級別是 TRACE ,在這個日誌級別下,會輸出執行SQL過程當中的詳細信息,這個級別特別適合 開發時使用。
首先在 src/test/java 中建立 cn.bjut.simple.mapper 包 ,而後建立 CountryMapperTest1測試類 ,代碼以下。
package cn.bjut.simple.mapper; import java.io.IOException; import java.io.Reader; import java.util.List; import cn.bjut.simple.model.Country; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.BeforeClass; import org.junit.Test; public class CountryMapperTest1 { //靜態成員方法只能訪問靜態成員變量 private static SqlSessionFactory sqlSessionFactory; @BeforeClass public static void init(){ try { Reader reader = Resources.getResourceAsReader("mybatis-config.xml"); sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); reader.close(); } catch (IOException ignore) { ignore.printStackTrace(); } } @Test public void testSelectAll(){ SqlSession sqlSession = sqlSessionFactory.openSession(); try { List<Country> countryList = sqlSession.selectList("selectAll"); //直接調用在this類裏定義的私有成員方法 this.printCountryList(countryList); } finally { sqlSession.close(); } } private void printCountryList(List<Country> countryList){ for(Country country : countryList){ System.out.printf("%-4d%4s%4s\n",country.getId(), country.getCountryname(), country.getCountrycode()); } } }
調用這個類裏定義的私有成員方法時,能夠省略this關鍵字。
這樣就獲得了最後的查詢結果 countryList ,簡單將結果輸出到控制檯。最後必定不要忘記關閉 SqlSession 。不然致使數據庫鏈接數過多,形成系統崩潰。
1. Junit 入門使用教程 https://www.cnblogs.com/ysocean/p/6889906.html#_label2
2. log4j 日誌框架使用 https://blog.csdn.net/king_kgh/article/details/80430002
3. slf4j學習小結 https://imshare.iteye.com/blog/772770
4. MyBatis從入門到精通 https://mybatis3.github.io/downloads.html
=========================
end