一塊兒來學SpringBoot | 第七篇:整合Mybatis

SpringBoot 是爲了簡化 Spring 應用的建立、運行、調試、部署等一系列問題而誕生的產物, 自動裝配的特性讓咱們能夠更好的關注業務自己而不是外部的XML配置,咱們只需遵循規範,引入相關的依賴就能夠輕易的搭建出一個 WEB 工程

MyBatis 是一款優秀的持久層框架,它支持定製化 SQL、存儲過程以及高級映射,幾乎避免了全部的 JDBC 代碼和手動設置參數以及獲取結果集,使用簡單的 XML 或註解來配置和映射原生信息,將接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java對象)映射成數據庫中的記錄,在國內可謂是佔據了半壁江山......html

<!-- more -->java

ORM對比圖

如下針對Spring JDBC Spring Data JpaMybatis三款框架作了個粗略的對比。通常應用的性能瓶頸並非在於ORM,因此這三個框架技術選型應該考慮項目的場景團隊的技能掌握狀況開發週期(開發效率)...mysql

框架對比 Spring JDBC Spring Data Jpa Mybatis
性能 性能最好 性能最差 居中
代碼量
學習成本 居中
推薦指數 ❤❤❤ ❤❤❤❤❤ ❤❤❤❤❤
我的觀點

拋開學習成本而言,對於業務簡單的中小型項目中使用Spring Data Jpa 開發無異因而最快速的。可是鑑於國內市場環境而言,掌握Mybatis無異因而佳的選擇,低學習成本和動態SQL解耦的特色使得更容易被人們所接受。對於業務複雜且對性能要求較高的項目來講Mybatis每每能更好的勝任,能夠本身進行SQL優化,同時更讓我喜歡的是Mybatis分頁插件通用Mapper(單表CURD無需本身手寫)有了這兩款插件的支持,還有什麼理由拒絕Mybatisgit

導入依賴

pom.xml 中添加 Mybatis 的依賴包mybatis-spring-boot-starter,該包擁有自動裝配的特色github

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.3.2</version>
</dependency>
<!-- MYSQL包 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- 默認就內嵌了Tomcat 容器,如須要更換容器也極其簡單-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 測試包,當咱們使用 mvn package 的時候該包並不會被打入,由於它的生命週期只在 test 以內-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

鏈接數據庫

SpringDataJpaSpring JDBC同樣,須要在application.properties中添加數據源的配置,同時也須要添加對mybatis的配置web

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的映射能夠省略掉了spring

注意事項

因爲 mybatis.mapper-locations=classpath:com/battcn/mapper/*.xml配置的在java package中,而Spring Boot默認只打入java package -> *.java,因此咱們須要給pom.xml文件添加以下內容sql

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
        </resource>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.xml</include>
            </includes>
            <filtering>true</filtering>
        </resource>
    </resources>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

具體編碼

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

表結構

建立一張 t_user 的表apache

CREATE TABLE `t_user` (
  `id` int(8) NOT NULL AUTO_INCREMENT COMMENT '主鍵自增',
  `username` varchar(50) NOT NULL COMMENT '用戶名',
  `password` varchar(50) NOT 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 操做:演示兩種方式
 * <p>第一種是基於mybatis3.x版本後提供的註解方式<p/>
 * <p>第二種是早期寫法,將SQL寫在 XML 中<p/>
 *
 * @author Levin
 * @since 2018/5/7 0007
 */
@Mapper
public interface UserMapper {

    /**
     * 根據用戶名查詢用戶結果集
     *
     * @param username 用戶名
     * @return 查詢結果
     */
    @Select("SELECT * FROM t_user WHERE username = #{username}")
    List<User> findByUsername(@Param("username") String username);


    /**
     * 保存用戶信息
     *
     * @param user 用戶信息
     * @return 成功 1 失敗 0
     */
    int insert(User user);
}
UserMapper 映射文件
<?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.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<User> u1 = userMapper.findByUsername("u1");
        log.info("[根據用戶名查詢] - [{}]", u1);
    }
}

總結

更多Mybatis的騷操做,請參考官方文檔

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

說點什麼

  • 我的QQ:1837307557
  • battcn開源羣(適合新手):391619659
  • 微信公衆號(歡迎調戲):battcn

公衆號

我的博客:http://blog.battcn.com/

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

相關文章
相關標籤/搜索