Spring Boot整合MyBatis+MySQL实战指南(Java 1.8 + 单元测试)

发布于:2025-07-13 ⋅ 阅读:(18) ⋅ 点赞:(0)

一、环境准备

  • 开发工具:IntelliJ IDEA 2023.1 + JDK 1.8.0_382+ Maven3.6.3
  • 数据库:MySQL 8.0.21
  • 依赖版本
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.12</version>
    </parent>
    
    <dependencies>
        <!-- Web支持 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        
        <!-- MyBatis支持 -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.3.0</version>
        </dependency>
        
        <!-- MySQL驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.21</version>
        </dependency>
        
        <!-- 测试支持 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    

二、项目结构

src/main/java
└─com.shuanglibi.demo
    ├─controller
    ├─service
    ├─mapper
    ├─entity
    └─DemoApplication.java
src/main/resources
    ├─application.yml
    └─mapper
        └─UserMapper.xml
src/test/java
    └─com.shuanglibi.demo
        └─service
            └─UserServiceTest.java

三、核心代码实现

1. 配置文件 application.yml

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8
    username: root
    password: xxxxxx
    driver-class-name: com.mysql.cj.jdbc.Driver

mybatis:
  mapper-locations: classpath:mapper/*.xml
  type-aliases-package: com.shuanglibi.demo.entity
  configuration:
    map-underscore-to-camel-case: true

2. 实体类 User.java

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private Long id;
    private String name;
    private Integer age;
    private LocalDateTime createTime;
}

3. Mapper接口 UserMapper.java

@Mapper
public interface UserMapper {
    @Select("SELECT * FROM user WHERE id = #{id}")
    User findById(Long id);

    @Insert("INSERT INTO user(name, age, create_time) VALUES(#{name}, #{age}, NOW())")
    @Options(useGeneratedKeys = true, keyProperty = "id")
    int insert(User user);

    @Update("UPDATE user SET name=#{name}, age=#{age} WHERE id=#{id}")
    int update(User user);

    @Delete("DELETE FROM user WHERE id=#{id}")
    int delete(Long id);
}

4. Service层 UserService.java

@Service
@RequiredArgsConstructor
public class UserService {
    private final UserMapper userMapper;

    public User getUserById(Long id) {
        return userMapper.findById(id);
    }

    public int createUser(User user) {
        return userMapper.insert(user);
    }

    public int updateUser(User user) {
        return userMapper.update(user);
    }

    public int deleteUser(Long id) {
        return userMapper.delete(id);
    }
}

四、单元测试实现(JUnit 5)

1. 测试基类配置

@SpringBootTest
@Transactional
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
public class BaseTest {
    @Autowired
    protected UserService userService;
    
    @Autowired
    protected UserMapper userMapper;
}

2. 完整测试类 UserServiceTest.java

class UserServiceTest extends BaseTest {
    
    @Test
    void testCRUD() {
        // 创建测试
        User newUser = new User(null, "张三", 25, null);
        int insertResult = userService.createUser(newUser);
        assertEquals(1, insertResult);
        assertNotNull(newUser.getId());

        // 查询测试
        User fetchedUser = userService.getUserById(newUser.getId());
        assertEquals("张三", fetchedUser.getName());
        assertEquals(25, fetchedUser.getAge());

        // 更新测试
        fetchedUser.setAge(26);
        int updateResult = userService.updateUser(fetchedUser);
        assertEquals(1, updateResult);
        
        User updatedUser = userService.getUserById(fetchedUser.getId());
        assertEquals(26, updatedUser.getAge());

        // 删除测试
        int deleteResult = userService.deleteUser(newUser.getId());
        assertEquals(1, deleteResult);
        
        User deletedUser = userService.getUserById(newUser.getId());
        assertNull(deletedUser);
    }
}

五、关键问题解决方案

1. 数据库连接问题

# 如果出现时区错误,在连接URL中添加:
spring.datasource.url: jdbc:mysql://localhost:3306/testdb?serverTimezone=Asia/Shanghai

2. MyBatis注解与XML配置选择

  • 简单SQL使用注解方式
  • 复杂SQL推荐XML配置(resources/mapper/UserMapper.xml):
<?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.shuanglibi.demo.mapper.UserMapper">
    <select id="findByName" resultType="User">
        SELECT * FROM user WHERE name = #{name}
    </select>
</mapper>

3. 事务管理配置

@Configuration
@EnableTransactionManagement
public class MyBatisConfig {
    // 可自定义事务管理器
}

六、运行与验证

  1. 启动测试类执行所有测试方法
  2. 查看控制台输出:
2023-10-20 14:30:22.123  INFO 12345 --- [           main] c.e.d.s.UserServiceTest                  : Started UserServiceTest in 2.345 seconds
2023-10-20 14:30:22.456  INFO 12345 --- [           main] o.s.t.c.transaction.TransactionContext   : Began transaction...

七、扩展建议

  1. 添加分页查询:使用PageHelper插件
  2. 集成Swagger文档:
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-boot-starter</artifactId>
    <version>3.0.0</version>
</dependency>
  1. 使用MyBatis Generator自动生成代码:
<plugin>
    <groupId>org.mybatis.generator</groupId>
    <artifactId>mybatis-generator-maven-plugin</artifactId>
    <version>1.4.2</version>
</plugin>

文章亮点

  1. 完整覆盖Spring Boot 2.x + MyBatis整合流程
  2. 提供可直接运行的测试代码
  3. 包含常见问题解决方案
  4. 遵循Java 1.8语法规范
  5. 使用现代测试框架(JUnit 5 + Spring Boot Test)

建议读者在实际操作时注意:
6. 提前创建好testdb数据库
7. 保持MySQL服务正常运行
8. 根据实际情况修改数据库连接参数
9. 使用Postman进行接口验证(配合Controller层)

源码在此,插去直接可以用,记得耐心点等待依赖下载完再启动。 (Spring Boot整合MyBatis+MySQL源码


网站公告

今日签到

点亮在社区的每一天
去签到