作為一個自學Java的自動化專業211大學本科生,在學習和實踐過程中”趟了不少雷“,所以有志於建立一個適合同樣有熱情學習Java技術的參考“排雷手冊”。 最近在讀劉增輝老師所著的《MyBatis從入門到精通》一書,很有收穫,於是將自己學習的過程以博客形式輸出,如有錯誤,歡迎指正! 第1章 MyBat ...
作為一個自學Java的自動化專業211大學本科生,在學習和實踐過程中”趟了不少雷“,所以有志於建立一個適合同樣有熱情學習Java技術的參考“排雷手冊”。
最近在讀劉增輝老師所著的《MyBatis從入門到精通》一書,很有收穫,於是將自己學習的過程以博客形式輸出,如有錯誤,歡迎指正!
第1章 MyBatis入門
1.1 MyBatis簡介
MyBatis是一款支持自定義SQL查詢、存儲過程和高級映射的持久層框架。消除了幾乎所有JDBC代碼和參數的手動設置以及結果集的檢索。MyBatis可以使用XML或註解進行配置和映射。MyBatis通過將參數映射到配置的SQL形成最終執行的SQL語句,最後將執行的SQL的結果映射成Java對象返回。
與其他的ORM(對象關係映射)框架不同,MyBatis並沒有將Java對象與資料庫表關聯起來,而是將Java方法與SQL語句關聯。
1.2 創建Maven項目
Maven是一個項目構建和管理工具。目前市面上很多陳舊的Java參考書還停留在講如何使用Eclipse開發工具,不過據我觀察IT培訓班的視頻都更新在使用IDEA。
因此我們要新建個Maven項目,使用IntelliJ IDEA 2018.3.6 x64新建Maven項目的過程如下:
+ Create New Project
註:JDK1.8u211 是需要用戶安裝並配置好環境變數,相關教程請參考其他博客的介紹。
我們新建完的Maven項目結構如下圖所示:
預設生成的pom.xml文件其內容如下所示:
<?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> </project>
以上是Maven項目的基本配置信息,我們還需要為它添加一些常用配置。
首先,設置源代碼編碼方式為UTF-8,配置如下。
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties>
接著,設置編譯源代碼的JDK版本,本人使用的是JDK 1.8,配置如下。
<build> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build>
還需要在配置文件pom.xml中添加一些依賴才能使接下來的工作順利進行。
這裡要添加最重要的MyBatis依賴、接著還需要添加會用到的 JUnit、mysql、Log4j驅動的依賴。
註:各種依賴的version要和自己電腦安裝的實際情況一致!
可以通過 http://search.maven.org/ 來查找依賴坐標。
MyBatis 下載地址: https://mybatis3.github.io/downloads.html
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文件內容如下。
1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 5 <modelVersion>4.0.0</modelVersion> 6 7 <groupId>cn.bjut.mybatis</groupId> 8 <artifactId>example</artifactId> 9 <version>0.1-SNAPSHOT</version> 10 11 <properties> 12 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 13 <java.version>1.8</java.version> 14 </properties> 15 16 <build> 17 <plugins> 18 <plugin> 19 <artifactId>maven-compiler-plugin</artifactId> 20 <configuration> 21 <source>${java.version}</source> 22 <target>${java.version}</target> 23 </configuration> 24 </plugin> 25 </plugins> 26 </build> 27 28 <dependencies> 29 <dependency> 30 <groupId>junit</groupId> 31 <artifactId>junit</artifactId> 32 <version>4.12</version> 33 <scope>test</scope> 34 </dependency> 35 <dependency> 36 <groupId>org.mybatis</groupId> 37 <artifactId>mybatis</artifactId> 38 <version>3.3.0</version> 39 </dependency> 40 <dependency> 41 <groupId>mysql</groupId> 42 <artifactId>mysql-connector-java</artifactId> 43 <version>5.1.38</version> 44 </dependency> 45 <dependency> 46 <groupId>org.slf4j</groupId> 47 <artifactId>slf4j-api</artifactId> 48 <version>1.7.12</version> 49 </dependency> 50 <dependency> 51 <groupId>org.slf4j</groupId> 52 <artifactId>slf4j-log4j12</artifactId> 53 <version>1.7.12</version> 54 </dependency> 55 <dependency> 56 <groupId>log4j</groupId> 57 <artifactId>log4j</artifactId> 58 <version>1.2.17</version> 59 </dependency> 60 </dependencies> 61 62 63 </project>
當對Maven的配置進行修改後,還需要來(一些操作技巧)來更新外部依賴的jar包。
完成上述步驟後,MyBatis的基本開發環境就已經準備好了。
1.3 簡單配置讓MyBatis跑起來
1.3.1 準備資料庫
註:首先需要安裝mysql軟體,並且記下root管理員的密碼。然後再安裝Navicat這個有圖形界面的MySQL客戶端工具,此處命令行代碼的錄入建議用文本編輯器 Notepad++。
SQL語句學習,推薦看 《MYSQL必知必會》。通過執行下麵的SQL語句創建一個名為 mybatis的資料庫,然後再創建一個名為country的表並插入一些簡單的數據。
CREATE DATABASE mybatis DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; -- mysql語句單行註釋使用 "-- " 註意,--後跟有一個空格 use mybatis; -- 表頭的字元串用` `括起來 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語句並回車得到結果如下:
我們檢查一下 資料庫mybatis 表 的內容如下圖所示
1.3.2 配置MyBatis
使用XML形式進行配置,首先在 src/main/resources下麵創建 mybatis-config.xml配置文件。
1 <?xml version="1.0" encoding="UTF-8" ?>
2 <!DOCTYPE configuration
3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
4 "http://mybatis.org/dtd/mybatis-3-config.dtd">
5 <configuration>
6 <settings>
7 <setting name="logImpl" value="LOG4J"/>
8 </settings>
9
10 <typeAliases>
11 <package name="cn.bjut.example.model"/>
12 </typeAliases>
13
14 <environments default="development">
15 <environment id="development">
16 <transactionManager type="JDBC">
17 <property name="" value=""/>
18 </transactionManager>
19 <dataSource type="UNPOOLED">
20 <property name="driver" value="com.mysql.jdbc.Driver"/>
21 <property name="url" value="jdbc:mysql://192.168.16.137:3306/mybatis"/>
22 <property name="username" value="root"/>
23 <property name="password" value=""/>
24 </dataSource>
25 </environment>
26 </environments>
27
28 <mappers>
29 <mapper resource="cn/bjut/example/mapper/CountryMapper.xml"/>
30 </mappers>
31 </configuration>
- <settings>中的logImpl屬性配置 指定使用LOG4J輸出日誌。
- <typeAliases>在MyBatis中需要頻繁用到類的全限定名稱,為了方便使用,我們配置了 cn.bjut.example.model包,這樣後在使用類的時候不需要寫包名的部分,只使用Country即可。
- <environments>環境配置中主要配置了資料庫連接,資料庫的url為: jdbc:mysql://localhost:3306/mybatis 使用的本機MySQL中的mybatis資料庫。
- <mappers>中配置了一個 包含完整類路徑的 CountryMapper.xml ,這是一個MyBatis的SQL語句和映射配置文件。
1.3.3 創建實體類和Mapper.xml文件
MyBatis是一個 結果映射框架 ,這裡創建的實體類是一個數據值對象(Data Value Object)。在實際應用中,一個表一般會對應一個實體。
根據MyBatis官方的習慣,一般用Mapper作為XML和介面類名的尾碼。通常稱XML為Mapper.xml文件,稱介面為Mapper介面。
- 在src/main/java 下創建一個基礎的包 cn.bjut.example ,在這個包下麵再創建model包。
- 根據資料庫表 country ,在model包下創建實體類Country ,代碼如下。
1 package tk.mybatis.simple.model; 2 3 public class Country { 4 private Long id; 5 private String countryname; 6 private String countrycode; 7 8 public Long getId() { 9 return id; 10 } 11 12 public void setId(Long id) { 13 this.id = id; 14 } 15 16 public String getCountryname() { 17 return countryname; 18 } 19 20 public void setCountryname(String countryname) { 21 this.countryname = countryname; 22 } 23 24 public String getCountrycode() { 25 return countrycode; 26 } 27 28 public void setCountrycode(String countrycode) { 29 this.countrycode = countrycode; 30 } 31 32 }
在 src/main/resources 下麵創建 cn/bjut/mybatis/example/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="tk.mybatis.simple.mapper.CountryMapper">
<select id="selectAll" resultType="Country">
select id,countryname,countrycode from country
</select>
</mapper>
SQL定義在 CountryMapper.xml文件中,裡面的配置作用如下。
- <mapper>: XML的根元素,屬性namespace定義了當前XML的命名空間。
- <select>元素: 我們所定義的一個 SELECT查詢。
- id屬性: 定義了當前SELECT查詢的 唯一 一個id。
- resultType: 定義了當前查詢的返回值類型,此處就是指 實體類Country。
創建好實體和Mapper.xml後,接下來要有針對性地配置 Log4j ,讓MyBatis在執行資料庫操作時將有關信息輸出到控制台。
1.3.4 配置Log4j以便查看MyBatis操作資料庫的過程
在 src/main/resources 中添加 log4j.properties配置文件,輸入如下內容。
1 #\u5168\u5C40\u914D\u7F6E
2 log4j.rootLogger=ERROR, stdout
3
4 #MyBatis \u65E5\u5FD7\u914D\u7F6E
5 log4j.logger.cn.bjut.example.mapper=TRACE 6
7 #\u63A7\u5236\u53F0\u8F93\u51FA\u914D\u7F6E
8 log4j.appender.stdout=org.apache.log4j.ConsoleAppender
9 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
10 log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
在MyBatis的日誌實現中,所謂的包名實際上是XML配置中 namespace 屬性值的一部分。由於namespace屬性值必須和介面全限定類名相同,因此才會真正對應到Java中的包。
MyBatis日誌的 最低級別是 TRACE ,在這個日誌級別下,會輸出執行SQL過程中的詳細信息,這個級別適合 開發時使用。
配置好Log4j,接下來就可以編寫 測試代碼讓MyBatis跑起來了。
1.3.5 編寫測試代碼 讓MyBatis跑起來
首先在 src/test/java 中創建 cn.bjut.example.mapper 包 ,然後創建 CountryMapperTest測試類 ,代碼如下。
1 package tk.mybatis.simple.mapper;
2
3 import java.io.IOException;
4 import java.io.Reader;
5 import java.util.List;
6
7 import org.apache.ibatis.io.Resources;
8 import org.apache.ibatis.session.SqlSession;
9 import org.apache.ibatis.session.SqlSessionFactory;
10 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
11 import org.junit.BeforeClass;
12 import org.junit.Test;
13
14 import tk.mybatis.simple.model.Country;
15
16 public class CountryMapperTest {
17
18 private static SqlSessionFactory sqlSessionFactory;
19
20 @BeforeClass
21 public static void init(){
22 try {
23 Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
24 sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
25 reader.close();
26 } catch (IOException ignore) {
27 ignore.printStackTrace();
28 }
29 }
30
31 @Test
32 public void testSelectAll(){
33 SqlSession sqlSession = sqlSessionFactory.openSession();
34 try {
35 List<Country> countryList = sqlSession.selectList("selectAll");
36 printCountryList(countryList);
37 } finally {
38 sqlSession.close();
39 }
40 }
41
42 private void printCountryList(List<Country> countryList){
43 for(Country country : countryList){
44 System.out.printf("%-4d%4s%4s\n",country.getId(), country.getCountryname(), country.getCountrycode());
45 }
46 }
47 }
5. 參考
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