1. 程式人生 > 其它 >Spring Boot MyBatis 學習教程

Spring Boot MyBatis 學習教程

技術標籤:JavaSpringBootMyBatisXMLMySQL

MyBatis 是一款優秀的持久層框架,它支援自定義 SQL,儲存過程以及高階對映。MyBatis 可以通過簡單的 XML 或註解來配置和對映原始型別、介面和 Java POJO(Plain Old Java Objects)為資料庫中的記錄。

本文講述如何在 Spring Boot 框架中基於 XML 方式使用 Mybatis。

建立 MySQL 資料表

本文采用 MySQL 資料庫作為資料來源,建立使用者表 user

CREATE TABLE `user`
(
    `id`     int(32)     NOT
NULL AUTO_INCREMENT, `name` varchar(32) NOT NULL, `passwd` varchar(50) NOT NULL, PRIMARY KEY (`id`) ) ENGINE = InnoDB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8;

插入一行資料:

insert into user (name, passwd) values ('leo', '123');
commit;

建立 Spring Boot 專案

本文采用 IntelliJ Idea 的 Spring Initializr 嚮導來建立 Spring Boot 專案,過程比較簡單,此處不再贅述。

建立後的 pom.xml 檔案如下:

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"
>
<modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.4.1</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>me.leehao</groupId> <artifactId>mybatisdemo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>mybatisdemo</name> <description>Demo project for Mybatis</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.4</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>

上面的依賴包括 MyBatis 和 MySQL 驅動的依賴。

另外,由於本文采用呼叫 Web 介面方式驗證 MyBatis 功能,故引入了 spring-boot-starter-web 依賴。

資料來源配置

MySQL 資料來源配置 application.yml 如下:

server:
  port: 6080

spring:
  datasource:
    username: root
    password: 12345678
    url: jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
    driver-class-name: com.mysql.cj.jdbc.Driver

mybatis:
  mapper-locations: classpath:mapping/*Mapper.xml
  type-aliases-package: me.leehao.mybatisdemo.entity

#showSql
logging:
  level:
    me:
      leehao:
        mybatisdemo:
          mapper : debug

上面採用了名稱為 mybatis 的 schema,且定義了 MyBatis 的 XML 對映檔案位置為 mapping 目錄下的 *Mapper.xml 檔案。

為方便除錯,我們將執行的 SQL 通過日誌打印出來。

定義 entity

定義資料庫實體類 User

package me.leehao.mybatisdemo.entity;

public class User {
    private Integer id;
    private String name;
    private String passwd;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPasswd() {
        return passwd;
    }

    public void setPasswd(String passwd) {
        this.passwd = passwd;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", passwd='" + passwd + '\'' +
                '}';
    }
}

定義 mapper 介面

建立好對應的實體類後,我們還需要為其建立對應的 mapper 介面和對應的 mapper XML 檔案,需要注意的是這兩類檔案都需要放置到指定的路徑下。其中的 mapper XML 檔案位置路徑已在上文的 application.yml 配置中進行了配置,mapper 介面會在下文的 Spring Boot 啟動主類中進行配置。

package me.leehao.mybatisdemo.mapper;

import me.leehao.mybatisdemo.entity.User;
import org.springframework.stereotype.Repository;

@Repository
public interface UserMapper {
    User QueryById(int id);
}

UserMapper 中定義了 QueryById 方法,具體的實現由下面的 mapper XML 進行實現。

UserMapper 介面新增 @Repository 註解是目的是為了避免在 UserService 中使用 UserMapper 出現 Could not autowire 的提示(雖然實際上不影響使用)。

定義 mapper XML

建立一個與 UserMapper.java 對應的 UserMapper.xml 檔案,裡面定義了 QueryById 使用的 SQL,且定義 resultType 返回型別為 User 實體類:

<?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="me.leehao.mybatisdemo.mapper.UserMapper">
    <select id="QueryById" resultType="me.leehao.mybatisdemo.entity.User">
        select * from user where id = #{id}
    </select>
</mapper>

定義 service

定義 UserService

package me.leehao.mybatisdemo.service;

import me.leehao.mybatisdemo.entity.User;
import me.leehao.mybatisdemo.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserService {
    @Autowired
    UserMapper userMapper;

    public User QueryById(int id){
        return userMapper.QueryById(id);
    }
}

UserService 裡面呼叫了 UserMapperQueryById 介面。

定義 controller

定義 UserController 介面:

package me.leehao.mybatisdemo.controller;

import me.leehao.mybatisdemo.entity.User;
import me.leehao.mybatisdemo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


@RestController
public class UserController {
    @Autowired
    private UserService userService;

    @RequestMapping("user/{id}")
    public String GetUser(@PathVariable int id){
        User user = userService.QueryById(id);
        if (user != null) {
            return user.toString();
        } else {
            return String.format("User(id: %s) not found", id);
        }
    }
}

UserController 中,定義了介面 user/{id},根據使用者 id 在資料庫中查詢使用者資訊。

定義啟動類

為在指定 mapper 介面的掃描路徑,在 Spring Boot 啟動主類中增加 @MapperScan("me.leehao.mybatisdemo.mapper") 的註解。

package me.leehao.mybatisdemo;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@MapperScan("me.leehao.mybatisdemo.mapper")
public class MybatisdemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(MybatisdemoApplication.class, args);
    }
}

執行

啟動 Spring Boot 後,訪問地址 http://localhost:6080/user/1 ,輸出:

User{id=1, name=‘leo’, passwd=‘123’}

附:原始碼

https://github.com/haozlee/learnmybatis

參考資料

  • https://mybatis.org/mybatis-3/zh/index.html
  • https://blog.csdn.net/iku5200/article/details/82856621
  • http://mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/
  • https://developer.ibm.com/zh/technologies/databases/tutorials/j-spring-boot-integrate-with-mybatis
  • https://www.cnblogs.com/ityouknow/p/6037431.html
  • https://blog.csdn.net/wqh0830/article/details/96109587
  • https://www.cnblogs.com/jhxxb/p/10484484.html