Skip to content
Leo的技术分享
Go back

Spring Boot MyBatis 学习教程

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

参考资料


Share this post on:

Previous Post
Spring Boot Druid 使用教程
Next Post
编译防火墙—— C++ 的 Pimpl惯用法解析