歡迎光臨
每天分享高質量文章

一起來學 SpringBoot 2.x | 第七篇:整合 Mybatis

點選上方“芋道原始碼”,選擇“置頂公眾號”

技術文章第一時間送達!

原始碼精品專欄

 


摘要: 原創出處 http://blog.battcn.com/2018/05/09/springboot/v2-orm-mybatis/ 「唐亞峰」歡迎轉載,保留摘要,謝謝!

  • ORM對比圖

  • 匯入依賴

  • 連線資料庫

  • 註意註意

  • 具體編碼

    • 表結構

    • 物體類

    • 持久層

    • 測試

  • 總結

  • 說點什麼


SpringBoot 是為了簡化 Spring 應用的建立、執行、除錯、部署等一系列問題而誕生的產物,自動裝配的特性讓我們可以更好的關註業務本身而不是外部的XML配置,我們只需遵循規範,引入相關的依賴就可以輕易的搭建出一個 WEB 工程

MyBatis 是一款優秀的持久層框架,它支援定製化 SQL、儲存過程以及高階對映,幾乎避免了所有的 JDBC 程式碼和手動設定引數以及獲取結果集,使用簡單的 XML 或註解來配置和對映原生資訊,將介面和 Java 的 POJOs(Plain Old Java Objects,普通的 Java物件)對映成資料庫中的記錄,在國內可謂是佔據了半壁江山……

ORM對比圖

以下針對Spring JDBC、Spring Data Jpa、Mybatis三款框架做了個粗略的對比。一般應用的效能瓶頸並不是在於ORM,所以這三個框架技術選型應該考慮專案的場景、團隊的技能掌握情況、開發週期(開發效率)…

框架對比 Spring JDBC Spring Data Jpa Mybatis
效能 效能最好 效能最差 居中
程式碼量
學習成本 居中
推薦指數 ❤❤❤ ❤❤❤❤❤ ❤❤❤❤❤

個人觀點

拋開學習成本而言,對於業務簡單的中小型專案中使用Spring Data Jpa 開發無異於是最快速的。但是鑒於國內市場環境而言,掌握Mybatis無異於是佳的選擇,低學習成本和動態SQL解耦的特點使得更容易被人們所接受。對於業務複雜且對效能要求較高的專案來說Mybatis往往能更好的勝任,可以自己進行SQL最佳化,同時更讓我喜歡的是Mybatis分頁外掛與通用Mapper(單表CURD無需自己手寫)有了這兩款外掛的支援,還有什麼理由拒絕Mybatis

匯入依賴

在 pom.xml 中新增 Mybatis 的依賴包mybatis-spring-boot-starter,該包擁有自動裝配的特點

<dependency>
    <groupId>org.mybatis.spring.bootgroupId>


    <artifactId>mybatis-spring-boot-starterartifactId>
    <version>1.3.2version>
dependency>

<dependency>
    <groupId>mysqlgroupId>
    <artifactId>mysql-connector-javaartifactId>
dependency>

<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-webartifactId>
dependency>

<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-testartifactId>
    <scope>testscope>
dependency>

連線資料庫

SpringDataJpa、Spring JDBC一樣,需要在application.properties中新增資料源的配置,同時也需要新增對mybatis的配置

spring.datasource.url=jdbc:mysql://localhost:3306/chapter6?useUnicode=true&characterEncoding;=UTF-8&zeroDateTimeBehavior;=convertToNull&allowMultiQueries;=true&useSSL;=false
spring.datasource.password=root
spring.datasource.username=root
# 註意註意
mybatis.mapper-locations=classpath:com/battcn/mapper/*.xml
#mybatis.mapper-locations=classpath:mapper/*.xml        #這種方式需要自己在resources目錄下建立mapper目錄然後存放xml
mybatis.type-aliases-package=com.battcn.entity
# 駝峰命名規範 如:資料庫欄位是  order_id 那麼 物體欄位就要寫成 orderId
mybatis.configuration.map-underscore-to-camel-case=true

mybatis.configuration.map-underscore-to-camel-case是一個非常好的配置項,合理的命名規範可以讓我們省略很多不必要的麻煩,比如xx-mapper.xml中的resultMap的對映可以省略掉了

註意事項

由於 mybatis.mapper-locations=classpath:com/battcn/mapper/*.xml配置的在java package中,而Spring Boot預設只打入java package -> *.java,所以我們需要給pom.xml檔案新增如下內容

<build>
    <resources>
        <resource>
            <directory>src/main/resourcesdirectory>


        resource>
        <resource>
            <directory>src/main/javadirectory>
            <includes>
                <include>**/*.xmlinclude>
            includes>
            <filtering>truefiltering>
        resource>
    resources>
    <plugins>
        <plugin>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-maven-pluginartifactId>
        plugin>
    plugins>
build>

具體編碼

完成基本配置後,接下來進行具體的編碼操作。

表結構

建立一張 t_user 的表

CREATE TABLE `t_user` (
  `id` int(8NOT NULL AUTO_INCREMENT COMMENT '主鍵自增',
  `username` varchar(50NOT NULL COMMENT '使用者名稱',
  `password` varchar(50NOT NULL COMMENT '密碼',
  PRIMARY KEY (`id`)
ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='使用者表';

物體類

package com.battcn.entity;

import java.io.Serializable;

/**
 * @author Levin
 * @since 2018/5/9 0007
 */

public class User implements Serializable {

    private static final long serialVersionUID = 8655851615465363473L;

    private Long id;
    private String username;
    private String password;
    // TODO  省略get set
}

持久層

這裡提供了兩種方式操作介面,第一種帶@Select註解的是Mybatis3.x提供的新特性,同理它還有@Update、@Delete、@Insert等等一系列註解,第二種就是傳統方式了,寫個介面對映,然後在XML中寫上我們的SQL陳述句…

UserMapper

package com.battcn.mapper;

import com.battcn.entity.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.util.List;

/**
 * t_user 操作:演示兩種方式
 * 

第一種是基於mybatis3.x版本後提供的註解方式


 * 

第二種是早期寫法,將SQL寫在 XML 中


 *
 * @author Levin
 * @since 2018/5/7 0007
 */
@Mapper
public interface UserMapper {

    /**
     * 根據使用者名稱查詢使用者結果集
     *
     * @param username 使用者名稱
     * @return 查詢結果
     */

    @Select("SELECT * FROM t_user WHERE username = #{username}")
    List findByUsername(@Param("username") String username);


    /**
     * 儲存使用者資訊
     *
     * @param user 使用者資訊
     * @return 成功 1 失敗 0
     */

    int insert(User user);
}

UserMapper 對映檔案


mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.battcn.mapper.UserMapper">

  <insert id="insert" parameterType="com.battcn.entity.User">
    INSERT INTO `t_user`(`username`,`password`) VALUES (#{username},#{password})
  insert>



mapper>

測試

完成資料訪問層介面後,最後編寫一個junit測試類來檢驗程式碼的正確性。

package com.battcn;

import com.battcn.entity.User;
import com.battcn.mapper.UserMapper;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.List;

/**
 * @author Levin
 */

@RunWith(SpringRunner.class)
@SpringBootTest
public class Chapter6ApplicationTests {

    private static final Logger log = LoggerFactory.getLogger(Chapter6ApplicationTests.class);

    @Autowired
    private UserMapper userMapper;

    @Test
    public void test1() throws Exception {
        final int row1 = userMapper.insert(new User("u1""p1"));
        log.info("[新增結果] - [{}]", row1);
        final int row2 = userMapper.insert(new User("u2""p2"));
        log.info("[新增結果] - [{}]", row2);
        final int row3 = userMapper.insert(new User("u1""p3"));
        log.info("[新增結果] - [{}]", row3);
        final List u1 = userMapper.findByUsername("u1");
        log.info("[根據使用者名稱查詢] - [{}]", u1);
    }
}

總結

更多Mybatis的騷操作,請參考官方檔案

目前很多大佬都寫過關於 SpringBoot 的教程了,如有雷同,請多多包涵,本教程基於最新的 spring-boot-starter-parent:2.0.1.RELEASE編寫,包括新版本的特性都會一起介紹…

說點什麼

全文程式碼:https://github.com/battcn/spring-boot2-learning/tree/master/chapter6

666. 彩蛋




如果你對 Dubbo 感興趣,歡迎加入我的知識星球一起交流。

知識星球

目前在知識星球(https://t.zsxq.com/2VbiaEu)更新瞭如下 Dubbo 原始碼解析如下:

01. 除錯環境搭建
02. 專案結構一覽
03. 配置 Configuration
04. 核心流程一覽

05. 拓展機制 SPI

06. 執行緒池

07. 服務暴露 Export

08. 服務取用 Refer

09. 註冊中心 Registry

10. 動態編譯 Compile

11. 動態代理 Proxy

12. 服務呼叫 Invoke

13. 呼叫特性 

14. 過濾器 Filter

15. NIO 伺服器

16. P2P 伺服器

17. HTTP 伺服器

18. 序列化 Serialization

19. 叢集容錯 Cluster

20. 優雅停機

21. 日誌適配

22. 狀態檢查

23. 監控中心 Monitor

24. 管理中心 Admin

25. 運維命令 QOS

26. 鏈路追蹤 Tracing


一共 60 篇++

贊(0)

分享創造快樂