MyBatis從入門到精通(第1章):MyBatis入門

最近在知乎讀書複習劉增輝老師所著的《MyBatis從入門到精通》一書,頗有收穫,因而將本身學習的過程以博客形式輸出,若有錯誤,歡迎指正!知乎讀書能夠經過火狐瀏覽器另存頁面爲「網頁,所有」的方式永久保存你借閱的電子書。html

做爲一個正在自學Java的自動化專業本科生,在學習和實踐過程當中」趟了很多雷「,「走了很多彎路」。這本書首先是適合剛學完JavaSE知識後入門,不足之處是未能在整合過程當中集成spring框架測試。爲此我會將更新的IDEA版源碼給出。java


第1章  Mybatis入門

1.1  Mybatis簡介

MyBatis是一款支持自定義SQL查詢、存儲過程和高級映射的持久層框架。消除了幾乎全部JDBC代碼和參數的手動設置以及結果集的檢索。mysql

MyBatis可使用XML或註解進行配置和映射。它經過將參數映射到配置的SQL最終造成執行的SQL語句,最後將執行的SQL的結果映射成Java對象返回。git

與其餘的ORM(對象關係映射)框架不一樣,MyBatis並沒有將Java對象與數據庫表關聯起來,而是將Java方法與SQL語句關聯github

MyBatis 支持聲明式數據緩存 declarative data caching 。當一條 SQL 語句被標記爲「可緩存」後,首次執行它時從數據庫獲取的全部數據會被存儲在高速緩存中,後面再執行這條語句時就會從高速緩存中讀取結果,而不是再次命中數據庫spring

 


 

1.2  建立Maven項目

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>
example 的 pom.xml

 

1.3  簡單配置讓MyBatis跑起來

1.3.1  準備數據庫

注:首先須要安裝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的內容以下圖所示:

 1.3.2  配置MyBatis

除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>

 

  • <settings>中的logImpl屬性配置 指定使用LOG4J輸出日誌。
  • <typeAliases>在MyBatis中須要頻繁用到儲存查詢結果的JavaBeans的全限定名稱,爲了方便使用,咱們配置了 cn.bjut.simple.model包,這樣後在使用類的時候不須要寫包名的部分,只使用Country便可。
  • <environments>環境配置中主要配置了數據庫鏈接,數據庫的url爲:     jdbc:mysql://localhost:3306/mybatis   使用的本機MySQL中的mybatis數據庫。
      1. 若是使用本地數據庫要改的格式:              jdbc:mysql://localhost:3306/mybatis
      2. com.mysql.jdbc.Driver 會報錯應該改爲:  com.mysql.cj.jdbc.Driver
      3. 按照上述改完以後報錯顯示沒填寫默認時區修正方法:    <property name="url" value="jdbc:mysql://localhost:3306/mybatis?serverTimezone=Asia/Shanghai"/>
  • <mappers>中配置了一個 包含完整類路徑的 CountryMapper.xml  ,這是一個MyBatis的SQL語句的映射配置文件。

 

1.3.3  建立實體類和Mapper.xml文件

 MyBatis是一個 結果映射框架 ,這裏建立的實體類是一個數據值對象(Data Value Object)。在實際應用中,一個表通常會對應一個實體。

 

  • 在src/main/java 下建立一個基礎的包 cn.bjut.simple ,在這個包下面再建立model包。
  • 根據數據庫表 country ,在model包下建立實體類Country ,代碼以下。
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 + '\'' +
                '}';
    }
}
public class Country

 

     在  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的根元素,屬性namespace定義了當前XML的命名空間,同時也是該映射文件對應接口文件的全限定名稱
  • <select>元素: 咱們所定義的一個  SELECT查詢。
  • id屬性: 定義了當前SELECT查詢的 惟一 一個id。它就是接口中抽象方法的方法名
  • resultType: 定義了當前查詢的返回值類型,此處就是指 實體類Country。(前面配置了實體類別名掃描包,不然要寫成cn.bjut.simple.model.Country)

建立好實體和Mapper.xml後,接下來要有針對性地配置 Log4j ,讓MyBatis在執行數據庫操做時將有關信息輸出到控制檯。

 

1.3.4   配置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過程當中的詳細信息,這個級別特別適合 開發時使用。

 

1.3.5  編寫測試代碼 讓MyBatis跑起來

首先在 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());
        }
    }
}
public class CountryMapperTest1

 

調用這個類裏定義的私有成員方法時,能夠省略this關鍵字。

 

  •  經過 Resources 工具類 將mybatis-config,xml配置文件讀入 Reader。
  •  再經過 SqlSessionFactoryBuilder 建造類使用Reader建立 SqlSessionFactory工廠對象。這個過程當中會讀取所有的Mapper.xml進行 具體 方法的解析。
  •  使用時經過 SqlSessionFactory工廠對象獲取一個 SqlSession。
  •  經過SqlSession的 selectList 方法查找到  CountryMapper.xml中id='selectAll'的方法,執行SQL查詢。
  •  MyBatis底層使用 JDBC執行SQL,獲取查詢結果集ResultSet後,根據 resultType的配置,將結果映射爲Country類型的集合,返回查詢結果。

這樣就獲得了最後的查詢結果 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 

相關文章
相關標籤/搜索