SpringBoot-Build-MyBatis


本blog的出现是为了能够分享个人所学的相关知识,检验自身学习成果。内容会和其他技术存在部分关联,如有任何描述错误或者说明有误的地方,还望指出。

一、简介

SpringBoot中使用Mybatis之前,先搭建基本的SpringBoot项目,然后引入mybatis-spring-boot-starter和数据库驱动(本文使用MySql)的依赖。也可以添加druid的依赖。

二、环境及依赖

1)JDK:1.8
2)IDE:IDEA
3)maven依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>2.4.0</version>
</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>
    <version>8.0.19</version>
</dependency>
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.16</version>
    <optional>true</optional>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.20</version>
</dependency>

三、实践

1. 新建表,此处自己随意新建一个表。只需要几个字段即可。随便插入两条数据。

CREATE TABLE `t_user` (
  `id` varchar(300) NOT NULL,
  `username` varchar(300) DEFAULT NULL,
  `password` varchar(300) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

INSERT INTO `mybatis`.`t_user`(`id`, `username`, `password`) VALUES ('a3fa40d2-978d-4945-b506-077762e99c24', 'user1', '68a45fe6-abd0-4b17-8809-2ba3026e9718');
INSERT INTO `mybatis`.`t_user`(`id`, `username`, `password`) VALUES ('ad2b8b5c-5b5b-4247-aadf-80032b4e570f', 'user2', 'ba511205-e163-4194-9ffe-3e42465c1790');

2. 新建Model

项目里添加了lombok的依赖,可以免去getter/setter、构造函数等。用起来比较方便,有兴趣的可以去了解一下。

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class User implements Serializable {
    private String id;
    private String username;
    private String password;
}

3. Controller,对外暴露的接口

package com.windh.mybatis.controller;

import com.windh.mybatis.model.UserModel;
import com.windh.mybatis.service.IUserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@Slf4j
// 这里注意一下,@RestController可以写入一个值,但这个值不是用来定义RequestMapping的value的,而是定义controller在spring容器里的名字
@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private IUserService userServiceImpl;

    @GetMapping("/{id}")
    public UserModel getUser(@PathVariable("id") String id) {
        UserModel userModel = userServiceImpl.queryUserById(id);
        log.info("query user info is :{}", userModel);
        return userModel;
    }
}

4. Service

// 接口
import com.windh.mybatis.model.UserModel;

public interface IUserService {
    UserModel queryUserById(String id);
}

// impl
import com.windh.mybatis.mapper.user.UserMapper;
import com.windh.mybatis.model.UserModel;
import com.windh.mybatis.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service(value = "userServiceImpl")
public class UserServiceImpl implements IUserService {
    @Autowired
    private UserMapper userMapper;

    @Override
    public UserModel queryUserById(String id) {
        return userMapper.queryUserById(id);
    }
}

5. Dao-Mybatis接口

import com.windh.mybatis.model.UserModel;
import org.apache.ibatis.annotations.Param;

public interface UserMapper {
    UserModel queryUserById(@Param("id") String id);
}
6)Dao-MybatisXml
<?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.windh.mybatis.mapper.user.UserMapper">
    <select id = "queryUserById" resultType="com.windh.mybatis.model.UserModel">
        select * from  mybatis.t_user where id=#{id}
    </select>
</mapper>

7. Dao-Mybatis接口扫描路径

在SpringBoot入口类添加注解,指定接口包。此处mapperscan的路径越精细越好,对于注入一个接口的多个实现时可以过滤掉非dao层的接口。

@MapperScan("com.windh.mybatis.mapper")

8. Dao-MybatisXml扫描路径

其实xml扫描是有很多细节需要注意的。根据项目情况定义扫描路径,分一下两种情况。

(1)xml文件放在resources内.

本文就是用这种方式的。将xml文件放在resources/mapper中。yaml文件中添加mapper-locations配置,指定xml路径。

mybatis:
  mapper-locations: mapper/**/*.xml  
(2)xml文件放在和“Dao-Mybatis接口”放在同一目录下

此时,我们不需要配置mapper-locations了。但是SpringBoot会无法扫描java目录下的xml文件,需要在pom文件中添加如下build.resources配置。

<build>
    <resources>
        <!-- 编译 src/main/java 目录下的 mapper 文件 -->
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.xml</include>
            </includes>
            <filtering>false</filtering>
        </resource>
    </resources>
</build>

9. 入口类

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

@MapperScan("com.windh.mybatis.mapper")
@SpringBootApplication
public class MybatisApplication {

    public static void main(String[] args) {
        SpringApplication.run(MybatisApplication.class, args);
    }
}

10. yaml文件

spring:
  datasource:
    username: {username}
    password: {password}
    url: jdbc:mysql://{ip}:{port}/{dbName}?useUnicode=true&characterEncoding=UTF-8
    driver-class-name: com.mysql.cj.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource
    
mybatis:
  mapper-locations: mapper/**/*.xml

11. 验证

访问 http://localhost:8080/user/a3fa40d2-978d-4945-b506-077762e99c24 验证

SpringBoot中搭建MyBatis-1.png

Mybatis在SSM框架总是必须掌握的。很多配置需要重点关注。关于pom中引入了druid,此处提供相关文章链
接,可以简单了解。



 上一篇
SpringBoot-Quartz SpringBoot-Quartz
本文的出现是为了能够分享个人所学的相关知识,检验自身学习成果。内容会和其他技术存在部分关联,如有任何描述错误或者说明有误的地方,还望各位大佬指出。 1. 背景Quartz(Job Scheduler),一个比较流行的定时任务框架。搜索
2020-06-28
下一篇 
SpringBoot-Build SpringBoot-Build
本文的出现是为了能够分享个人所学的相关知识,检验自身学习成果。内容会和其他技术存在部分关联,如有任何描述错误或者说明有误的地方,还望各位大佬指出。 1. 背景SpringBoot是微服务基础,此文讲述搭建SpringBoot方式。 2
2020-05-27
  目录