MyBatis系列(一):MyBatis入門

申城異鄉人發表於2019-06-28

1. MyBatis簡介

​ 2001年,Clinton Begin發起了一個名為iBATIS的開源專案,最初側重於密碼軟體的研發,後來發展成為一款基於Java的持久層框架。

​ 2004年,Clinton將iBATIS的名字和原始碼捐贈給了Apache軟體基金會。

​ 2010年,核心開發團隊決定離開Apache軟體基金會,並且將iBATIS改名為MyBatis。

​ MyBatis是一款優秀的支援自定義SQL查詢、儲存過程和高階對映的持久層框架,消除了幾乎所有的JDBC程式碼和引數的手動設定以及結果集的檢索。MyBatis可以使用XML或註解進行配置和對映,MyBatis通過將引數對映到配置的SQL形成最終執行的SQL語句,最後將執行SQL的結果對映成Java物件返回。

​ 與其他的ORM(物件關係對映)框架不同,MyBatis並沒有將Java物件與資料庫表關聯起來,而是將Java方法與SQL語句關聯。

說明:以上內容瞭解下即可,因為按我的風格,特別不喜歡純理論純文字的東西,看過我以往部落格的讀者可能有這個意識,我更喜歡具體程式碼實戰,比如如何使用一個新技術,某一段程式碼是為了解決什麼問題……

2. 建立Maven專案

關於Maven的相關內容,大家可以參考我之前的部落格Spring入門(四):使用Maven管理Spring專案

我一直認為,理解一門技術最好的方式,是通過一個具體的例子,比如Hello World,哈哈。

所以,首先我們要新建個Maven專案,使用IDEA新建Maven專案的方法如下所示:

MyBatis系列(一):MyBatis入門

MyBatis系列(一):MyBatis入門

MyBatis系列(一):MyBatis入門

剛新建完的Maven專案結構如下所示:

MyBatis系列(一):MyBatis入門

預設生成的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>com.zwwhnly</groupId>
    <artifactId>mybatis-action</artifactId>
    <version>1.0-SNAPSHOT</version>
    
</project>
複製程式碼

MyBatis系列(一):MyBatis入門

首先,我們設定原始碼的編碼方式為UTF-8:

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
複製程式碼

接著,設定編譯原始碼的JDK版本,這裡暫時用1.6,可根據自己的實際需要修改,比如修改成1.8:

<build>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.6</source>
                <target>1.6</target>
            </configuration>
        </plugin>
    </plugins>
</build>
複製程式碼

然後,新增重要的MyBatis的依賴座標和mysql驅動的依賴座標:

<dependencies>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.3.0</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.38</version>
    </dependency>
    
</dependencies>
複製程式碼

最後,新增下用到的Log4j、JUnit的依賴座標,最終的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>com.zwwhnly</groupId>
    <artifactId>mybatis-action</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.3.0</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.38</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.12</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.12</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
複製程式碼

在IDEA中,如果沒有特殊配置過,修改完pom檔案,需要手動匯入下,否則是下圖這樣的情況:

MyBatis系列(一):MyBatis入門

怎麼手動匯入呢?點選下IDEA右下角提示的Import Changes即可。

MyBatis系列(一):MyBatis入門

MyBatis系列(一):MyBatis入門

至此,Maven專案建立完畢。

3. 簡單示例

3.1 資料準備

首先執行如下語句建立資料庫mybatis_action_db:

CREATE DATABASE mybatis_action_db DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
複製程式碼

然後執行如下語句建立表country,並新增一些資料:

use mybatis_action_db;

CREATE TABLE country
(
  id          INT          NOT NULL AUTO_INCREMENT,
  countryname VARCHAR(255) NULL,
  countrycode VARCHAR(255) NULL,
  PRIMARY KEY (id)
);

INSERT country(countryname, countrycode)
VALUES ('中國', 'CN'),
       ('美國', 'US'),
       ('俄羅斯', 'RU'),
       ('英國', 'GB'),
       ('法國', 'FR');
複製程式碼

3.2 配置MyBatis

首先在src/main/resources目錄下建立mybatis-config.xml配置檔案,為了後續更快速的建立mybatis-config.xml檔案,我們可以按照如下步驟新增模版:

MyBatis系列(一):MyBatis入門

MyBatis系列(一):MyBatis入門
MyBatis系列(一):MyBatis入門
MyBatis系列(一):MyBatis入門

MyBatis系列(一):MyBatis入門

然後輸入如下內容:

<?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"/>
    </settings>

    <typeAliases>
        <package name="com.zwwhnly.mybatisaction.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/mybatis_action_db"/>
                <property name="username" value="root"/>
                <property name="password" value=""/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper resource="com/zwwhnly/mybatisaction/mapper/CountryMapper.xml"/>
    </mappers>
</configuration>
複製程式碼

配置簡單講解:

  • <settings>節點中的logImpl屬性配置指定使用LOG4J輸出日誌。
  • <typeAliases>元素下面配置了一個包名,通常確定一個類的時候需要使用類的全限定名稱,例如com.zwwhnly.mybatisaction.model.Country。在MyBatis中需要頻繁用到類的全限定名稱,為了方便使用,我們配置了com.zwwhnly.mybatisaction.model包,這樣配置後,在使用類的時候不需要寫包名的部分,只使用Country即可。
  • <environments>環境配置中主要配置了資料庫連線,如這裡我們使用的是本機MySql中的mybatis_action_db資料庫,使用者名稱為root,沒有密碼(大家可根據自己的實際情況修改資料庫及使用者名稱和密碼)。
  • <mappers>中配置了一個包含完整類路徑的CountryMapper.xml,這是一個MyBatis的Sql語句和對映配置檔案。

3.3 建立實體類和Mapper.xml檔案

在src/main/java下新建包:com.zwwhnly.mybatisaction,然後在這個包下再建立包:model。

在model包下建立資料庫表country表對應的實體類Country:

package com.zwwhnly.mybatisaction.model;

public class Country {
    private Integer id;

    private String countryname;

    private String countrycode;

    // 按Alt+Insert快捷鍵生成get和set方法
}
複製程式碼

在src/main/resources下建立目錄com/zwwhnly/simple/mapper目錄,然後在該目錄下建立CountryMapper.xml檔案,為了後續更快速的建立Mapper.xml檔案,我們可以參考上面的新增mybatis-config.xml模版的方法,這裡不再贅述。

最終的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="com.zwwhnly.mybatisaction.mapper.CountryMapper">
    <select id="selectAll" resultType="Country">
        SELECT id,countryname,countrycode from country
    </select>
</mapper>
複製程式碼

配置簡單講解:

  • mapper:XML的根元素,屬性namespace定義了當前XML的名稱空間。
  • select:我們所定義的一個Select查詢。
  • id屬性:定義了當前Select查詢的唯一id。
  • resultType:定義了當前查詢的返回值型別,此處就是指實體類Country,前面配置中提到的包名主要用於這裡,如果沒有設定包名,此處就需要寫成resultType="com.zwwhnly.mybatisaction.model.Country"。
  • SELECT id,countryname,countrycode from country:查詢Sql語句。

3.4 配置Log4j以便檢視MyBatis運算元據庫的過程

在src/main/resources下新建log4j.properties配置檔案,輸入如下內容:

log4j.rootLogger=ERROR, stdout
log4j.logger.com.zwwhnly.mybatisaction.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 
複製程式碼

3.5 編寫測試程式碼

在src/test/java下建立包:com.zwwhnly.mybatisaction.mapper,然後建立測試類CountryMapperTest類,程式碼如下:

package com.zwwhnly.mybatisaction.mapper;

import com.zwwhnly.mybatisaction.mapper.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;

import java.io.IOException;
import java.io.Reader;
import java.util.List;

public class CountryMapperTest {
    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 e) {
            e.printStackTrace();
        }
    }

    @Test
    public void testSelectAll() {
        SqlSession sqlSession = sqlSessionFactory.openSession();

        try {
            List<Country> countryList = sqlSession.selectList("selectAll");
            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());
        }
    }
}
複製程式碼

執行測試程式碼,輸出日誌如下:

DEBUG [main] - ==> Preparing: SELECT id,countryname,countrycode from country

DEBUG [main] - ==> Parameters:

TRACE [main] - <== Columns: id, countryname, countrycode

TRACE [main] - <== Row: 1, 中國, CN

TRACE [main] - <== Row: 2, 美國, US

TRACE [main] - <== Row: 3, 俄羅斯, RU

TRACE [main] - <== Row: 4, 英國, GB

TRACE [main] - <== Row: 5, 法國, FR

DEBUG [main] - <== Total: 5

1 中國 CN

2 美國 US

3 俄羅斯 RU

4 英國 GB

5 法國 FR

4. 原始碼及參考

原始碼地址:github.com/zwwhnly/myb…,歡迎下載。

劉增輝《MyBatis從入門到精通》

IntelliJ IDEA中建立xml檔案

相關文章