一、环境准备
-
开发工具:IntelliJ IDEA 2023.1 + JDK 1.8.0_382+ Maven3.6.3
-
数据库:MySQL 8.0.21
-
依赖版本 :
xml<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
yaml
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
java
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private Long id;
private String name;
private Integer age;
private LocalDateTime createTime;
}
3. Mapper接口 UserMapper.java
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
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. 测试基类配置
java
@SpringBootTest
@Transactional
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
public class BaseTest {
@Autowired
protected UserService userService;
@Autowired
protected UserMapper userMapper;
}
2. 完整测试类 UserServiceTest.java
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. 数据库连接问题
yaml
# 如果出现时区错误,在连接URL中添加:
spring.datasource.url: jdbc:mysql://localhost:3306/testdb?serverTimezone=Asia/Shanghai
2. MyBatis注解与XML配置选择
- 简单SQL使用注解方式
- 复杂SQL推荐XML配置(resources/mapper/UserMapper.xml):
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. 事务管理配置
java
@Configuration
@EnableTransactionManagement
public class MyBatisConfig {
// 可自定义事务管理器
}
六、运行与验证
-
启动测试类执行所有测试方法
-
查看控制台输出:
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...
七、扩展建议
- 添加分页查询:使用PageHelper插件
- 集成Swagger文档:
xml
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>
- 使用MyBatis Generator自动生成代码:
xml
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.4.2</version>
</plugin>
文章亮点:
- 完整覆盖Spring Boot 2.x + MyBatis整合流程
- 提供可直接运行的测试代码
- 包含常见问题解决方案
- 遵循Java 1.8语法规范
- 使用现代测试框架(JUnit 5 + Spring Boot Test)
建议读者在实际操作时注意:
-
提前创建好testdb数据库
-
保持MySQL服务正常运行
-
根据实际情况修改数据库连接参数
-
使用Postman进行接口验证(配合Controller层)
源码在此,插去直接可以用,记得耐心点等待依赖下载完再启动。 (Spring Boot整合MyBatis+MySQL源码)