全網首例全棧實踐(五)Spring Boot 集成Mybatis

一、概述

我們的Spring Boot後續項目使用的都是MySQL。Spring Boot連接MySQL的方式包括JDBC,Spring JPA,Hibeirnate,Mybatis等,本文主要帶大家實踐Mybatis的集成。

MyBatis 前身是apache的一個開源項目iBatis,2010年由apache software foundation 遷移到了google code,更名為MyBatis,在2013年11月遷移到Github。

MyBatis是支持普通SQL查詢,存儲過程和高級映射的優秀持久層框架。MyBatis 消除了幾乎所有的JDBC代碼和參數的手工設置以及結果集的檢索。MyBatis 使用簡單的XML或註解用於配置和原始映射,將接口和Java的POJOs(Plain Ordinary Java Objects,普通的Java對象)映射成數據庫中的記錄。

二、創建數據庫和表

MySQL的安裝參考之前的文章,全網首例全棧實踐(一)Mac安裝使用MySQL。

使用workbench或命令行創建數據庫test。

create database test;

如果是命令行:

use test;

如果使用工具直接連接到數據庫,然後創建表user,輸入:

DROP TABLE IF EXISTS `user`;

CREATE TABLE `user1` (

`id` int(**11**) NOT NULL AUTO_INCREMENT,

`name` varchar(**255**) DEFAULT NULL,

`password` varchar(**255**) DEFAULT NULL,

`email` varchar(**255**) DEFAULT NULL,

`phone` varchar(**100**) DEFAULT NULL,

`register_time` datetime DEFAULT NULL,

`login_time` datetime DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=**1**DEFAULT CHARSET=utf8;

user表包含的字段有id(記錄id),name(姓名),password(密碼),phone(手機號碼),register_time(註冊時間),login_time(登錄時間)。

三、MySQL、MyBatis配置

yml文件配置:

#開發配置
spring:
profiles: dev
#數據庫配置
datasource:
url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
username: root
password: xxx
driver-class-name: com.mysql.jdbc.Driver

pom文件配置:

 

<dependency>
<groupid>mysql/<groupid>
<artifactid>mysql-connector-java/<artifactid>
<scope>runtime/<scope>
/<dependency>

<dependency>
<groupid>org.mybatis.spring.boot/<groupid>
<artifactid>mybatis-spring-boot-starter/<artifactid>
<version>1.3.2/<version>
/<dependency>

四、MyBatis目錄設置

MyBatis 強大之處在於它的映射語句,由於它的異常強大,映射器的XML 文件就顯得相對簡單。因此在集成MyBatis後,我們的項目結構設置如下。


全網首例全棧實踐(五)Spring Boot 集成Mybatis


src目錄下分別新建entity實體和mapper層,mapper本質上相當於傳統的dao層,只是dao層用MyBatis的特性實現。resources目錄下新建mapping目錄,該目錄下即是MyBatis的XML實現,每個xml文件對應mapper目錄下的一個文件。

五、MyBatis XML映射文件

MyBatis 是針對SQL 構建的,SQL 映射文件有很少的幾個頂級元素。

  • cache – 給定命名空間的緩存配置。

  • cache-ref – 其他命名空間緩存配置的引用。

  • resultMap – 是最複雜也是最強大的元素,用來描述如何從數據庫結果集中來加載對象。

  • parameterMap – 已廢棄!老式風格的參數映射。內聯參數是首選,這個元素可能在將來被移除,這裡不會記錄。

  • sql – 可被其他語句引用的可重用語句塊。

  • insert – 映射插入語句

  • update – 映射更新語句

  • delete – 映射刪除語句

  • select – 映射查詢語句

接下來我們舉幾個經常使用的例子來說明映射語句如何使用。

  1. select

查詢語句是MyBatis 中最常用的元素之一,使用示例如下:

<select>
SELECT * FROM PERSON WHERE ID = #{id}
/<select>

這個語句被稱作selectPerson,接受一個int(或Integer)類型的參數,並返回一個HashMap 類型的對象,其中的鍵是列名,值便是結果行中的對應值。

注意參數符號:

#{id}

這就告訴MyBatis 創建一個預處理語句參數,通過JDBC,這樣的一個參數在SQL 中會由一個“?”來標識,並被傳遞到一個新的預處理語句中。

select元素有很多屬性可供配置:

<select> id="selectPerson"
parameterType="int"
parameterMap="deprecated"
resultType="hashmap"
resultMap="personResultMap"
flushCache="false"
useCache="true"
timeout="10000"
fetchSize="256"
statementType="PREPARED"
resultSetType="FORWARD_ONLY">
id
在命名空間中唯一的標識符,可以被用來引用這條語句。
parameterType
將會傳入這條語句的參數類的完全限定名或別名。這個屬性是可選的,因為 MyBatis 可以通過 TypeHandler 推斷出具體傳入語句的參數,默認值為 unset。
parameterMap
這是引用外部 parameterMap 的已經被廢棄的方法。使用內聯參數映射和 parameterType 屬性。
resultType
從這條語句中返回的期望類型的類的完全限定名或別名。注意如果是集合情形,那應該是集合可以包含的類型,而不能是集合本身。使用 resultType 或 resultMap,但不能同時使用。

resultMap
外部 resultMap 的命名引用。結果集的映射是 MyBatis 最強大的特性,對其有一個很好的理解的話,許多複雜映射的情形都能迎刃而解。使用 resultMap 或 resultType,但不能同時使用。
flushCache
將其設置為 true,任何時候只要語句被調用,都會導致本地緩存和二級緩存都會被清空,默認值:false。
useCache
將其設置為 true,將會導致本條語句的結果被二級緩存,默認值:對 select 元素為 true。
timeout
這個設置是在拋出異常之前,驅動程序等待數據庫返回請求結果的秒數。默認值為 unset(依賴驅動)。
fetchSize
這是嘗試影響驅動程序每次批量返回的結果行數和這個設置值相等。默認值為 unset(依賴驅動)。
statementType
STATEMENT,PREPARED 或 CALLABLE 的一個。這會讓 MyBatis 分別使用 Statement,PreparedStatement 或 CallableStatement,默認值:PREPARED。
resultSetType
FORWARD_ONLY,SCROLL_SENSITIVE 或 SCROLL_INSENSITIVE 中的一個,默認值為 unset (依賴驅動)。
databaseId
如果配置了 databaseIdProvider,MyBatis 會加載所有的不帶 databaseId 或匹配當前 databaseId 的語句;如果帶或者不帶的語句都有,則不帶的會被忽略。
resultOrdered
這個設置僅針對嵌套結果 select 語句適用:如果為 true,就是假設包含了嵌套結果集或是分組了,這樣的話當返回一個主結果行的時候,就不會發生有對前面結果集的引用的情況。這就使得在獲取嵌套的結果集的時候不至於導致內存不夠用。默認值:false。

resultSets
這個設置僅對多結果集的情況適用,它將列出語句執行後返回的結果集並每個結果集給一個名稱,名稱是逗號分隔的。
/<select>
  1. insert,update和delete

示例如下:

<insert>
insert into Author (id,username,password,email,bio)
values (#{id},#{username},#{password},#{email},#{bio})
/<insert>

<update>
update Author set
username = #{username},
password = #{password},
email = #{email},
bio = #{bio}
where id = #{id}
/<update>

<delete>
delete from Author where id = #{id}
/<delete>

屬性配置包括如下:

<insert> id="insertAuthor"
parameterType="domain.blog.Author"
flushCache="true"
statementType="PREPARED"
keyProperty=""
keyColumn=""
useGeneratedKeys=""
timeout="20">

<update> id="updateAuthor"
parameterType="domain.blog.Author"

flushCache="true"
statementType="PREPARED"
timeout="20">

<delete> id="deleteAuthor"
parameterType="domain.blog.Author"
flushCache="true"
statementType="PREPARED"
timeout="20">
id
命名空間中的唯一標識符,可被用來代表這條語句。
parameterType
將要傳入語句的參數的完全限定類名或別名。這個屬性是可選的,因為 MyBatis 可以通過 TypeHandler 推斷出具體傳入語句的參數,默認值為 unset。
parameterMap
這是引用外部 parameterMap 的已經被廢棄的方法。使用內聯參數映射和 parameterType 屬性。
flushCache
將其設置為 true,任何時候只要語句被調用,都會導致本地緩存和二級緩存都會被清空,默認值:true(對應插入、更新和刪除語句)。
timeout
這個設置是在拋出異常之前,驅動程序等待數據庫返回請求結果的秒數。默認值為 unset(依賴驅動)。
statementType
STATEMENT,PREPARED 或 CALLABLE 的一個。這會讓 MyBatis 分別使用 Statement,PreparedStatement 或 CallableStatement,默認值:PREPARED。
useGeneratedKeys
(僅對 insert 和 update 有用)這會令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法來取出由數據庫內部生成的主鍵(比如:像 MySQL 和 SQL Server 這樣的關係數據庫管理系統的自動遞增字段),默認值:false。

keyProperty
(僅對 insert 和 update 有用)唯一標記一個屬性,MyBatis 會通過 getGeneratedKeys 的返回值或者通過 insert 語句的 selectKey 子元素設置它的鍵值,默認:unset。如果希望得到多個生成的列,也可以是逗號分隔的屬性名稱列表。
keyColumn
(僅對 insert 和 update 有用)通過生成的鍵值設置表中的列名,這個設置僅在某些數據庫(像 PostgreSQL)是必須的,當主鍵列不是表中的第一列的時候需要設置。如果希望得到多個生成的列,也可以是逗號分隔的屬性名稱列表。
databaseId
如果配置了 databaseIdProvider,MyBatis 會加載所有的不帶 databaseId 或匹配當前 databaseId 的語句;如果帶或者不帶的語句都有,則不帶的會被忽略。

/<delete>/<update>/<insert>

MyBatis的集成就講到這裡,具體的使用我們放在之後用戶的註冊、登錄等接口創建過程中細講。


分享到:


相關文章: