在spring boot中添加使用mybatis
以下是完整的项目目录结构,重点标注了与 UserMapper
相关的文件位置:
src/
├── main/
│ ├── java/
│ │ └── com/
│ │ └── example/
│ │ ├── YourApplication.java // 项目入口类(带@SpringBootApplication)
│ │ ├── entity/ // 实体类包
│ │ │ └── SysUser.java // 用户实体类
│ │ ├── mapper/ // MyBatis Mapper接口包
│ │ │ └── UserMapper.java // Mapper接口(定义查询方法)
│ │ ├── service/ // 服务层
│ │ │ └── UserDetailsServiceImpl.java // 实现Spring Security的用户加载
│ │ └── config/ // 配置类包
│ │ └── SecurityConfig.java // Spring Security配置类
│ └── resources/
│ ├── application.yml // 项目配置文件(数据库、MyBatis等配置)
│ └── mybatis/
│ └── mapper/ // MyBatis XML映射文件存放目录
│ └── UserMapper.xml // UserMapper的SQL实现
└── pom.xml // Maven依赖配置文件
二、逐个文件说明(附代码)
1. 入口类:YourApplication.java
项目启动入口,需添加 @MapperScan
注解扫描 mapper
包(让 Spring 识别 MyBatis 接口):
package com.example;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.example.mapper") // 扫描Mapper接口所在的包
public class YourApplication {
public static void main(String[] args) {
SpringApplication.run(YourApplication.class, args);
}
}
2. 实体类:entity/SysUser.java
对应数据库 sys_user
表的实体:
package com.example.entity;
public class SysUser {
private Long id; // 对应数据库id字段
private String username; // 用户名(登录账号)
private String password; // 加密后的密码
private Integer enabled; // 账号状态:1=启用,0=禁用
// 必须添加getter和setter(MyBatis需要通过它们赋值)
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getUsername() { return username; }
public void setUsername(String username) { this.username = username; }
public String getPassword() { return password; }
public void setPassword(String password) { this.password = password; }
public Integer getEnabled() { return enabled; }
public void setEnabled(Integer enabled) { this.enabled = enabled; }
}
Mapper 接口:mapper/UserMapper.java
定义数据库查询方法(与 XML 映射文件对应):package com.example.mapper; import com.example.entity.SysUser; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.util.List; @Mapper // 标记为MyBatis映射接口(也可通过入口类@MapperScan替代) public interface UserMapper { /** * 根据用户名查询用户信息 * @param username 用户名 * @return 用户实体(包含id、password、enabled等) */ SysUser selectByUsername(@Param("username") String username); /** * 根据用户ID查询角色列表 * @param userId 用户ID * @return 角色名集合(如["ROLE_ADMIN", "ROLE_USER"]) */ List<String> selectRolesByUserId(@Param("userId") Long userId); }
4. MyBatis XML 映射:resources/mybatis/mapper/UserMapper.xml
实现 UserMapper
接口的 SQL 逻辑:
<?xml version="1.0" encoding="UTF-8"?>
<!-- 根据用户名查询用户 -->
<!-- id必须和接口中的方法名一致,resultType指定返回的实体类 -->
<select id="selectByUsername" resultType="com.example.entity.SysUser">
SELECT id, username, password, enabled
FROM sys_user -- 数据库表名
WHERE username = #{username} -- #{username}对应接口方法的@Param参数
</select>
<!-- 根据用户ID查询角色列表 -->
<!-- resultType指定返回的单个元素类型(这里是String) -->
<select id="selectRolesByUserId" resultType="java.lang.String">
SELECT r.role_name -- 角色名,需以ROLE_开头(如ROLE_ADMIN)
FROM sys_role r
INNER JOIN sys_user_role ur ON r.id = ur.role_id -- 关联用户-角色表
WHERE ur.user_id = #{userId} -- #{userId}对应接口方法的@Param参数
</select>
5. 配置文件:resources/application.yml
配置数据库连接和 MyBatis 路径:
# 服务器端口(可选,默认8080)
server:
port: 8080
# 数据库配置(以MySQL为例)
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/你的数据库名?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
username: 数据库用户名(如root)
password: 数据库密码
# MyBatis配置
mybatis:
# 告诉MyBatis去哪里找XML映射文件
mapper-locations: classpath:mybatis/mapper/*.xml
# 实体类的包路径(可选,配置后XML中resultType可简写类名)
type-aliases-package: com.example.entity
6. Maven 依赖: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>
<!-- 父工程:Spring Boot默认配置 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.1.3</version> <!-- 版本可根据需要修改 -->
<relativePath/>
</parent>
<groupId>com.example</groupId>
<artifactId>spring-security-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-security-demo</name>
<properties>
<java.version>17</java.version> <!-- JDK版本 -->
</properties>
<dependencies>
<!-- Spring Web(提供HTTP接口支持) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring Security(安全框架) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!-- MyBatis(数据库访问) -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>3.0.2</version>
</dependency>
<!-- MySQL驱动 -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<!-- 测试依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<!-- Spring Boot打包插件 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
三、核心逻辑梳理
用户登录时:
Spring Security 会调用UserDetailsServiceImpl
的loadUserByUsername
方法,该方法通过UserMapper.selectByUsername
查询数据库中的用户信息。角色查询:
拿到用户信息后,再通过UserMapper.selectRolesByUserId
查询该用户的角色,最终转换为 Spring Security 可识别的权限信息。MyBatis 作用:
UserMapper
接口定义查询方法,UserMapper.xml
实现具体 SQL,两者通过 命名空间 + 方法名 关联,Spring 会自动创建UserMapper
的实现类并注入到UserDetailsServiceImpl
中。
\
本作品采用《CC 协议》,转载必须注明作者和本文链接