在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; }
}
  1. 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_ADMINFROM 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>

三、核心逻辑梳理

  1. 用户登录时
    Spring Security 会调用 UserDetailsServiceImplloadUserByUsername 方法,该方法通过 UserMapper.selectByUsername 查询数据库中的用户信息。

  2. 角色查询
    拿到用户信息后,再通过 UserMapper.selectRolesByUserId 查询该用户的角色,最终转换为 Spring Security 可识别的权限信息。

  3. MyBatis 作用
    UserMapper 接口定义查询方法,UserMapper.xml 实现具体 SQL,两者通过 命名空间 + 方法名 关联,Spring 会自动创建 UserMapper 的实现类并注入到 UserDetailsServiceImpl 中。
    \

在spring boot中添加使用mybatis

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!