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

一起來學 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)

分享創造快樂