本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 验证

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