以下是Spring和Spring Boot集成MyBatis的完整对比示例,包含从项目创建到测试的全流程代码:
一、Spring集成MyBatis示例
1. 项目结构
spring-mybatis-demo/
├── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com.example/
│ │ │ ├── config/
│ │ │ ├── mapper/
│ │ │ ├── service/
│ │ │ └── web/
│ │ └── resources/
│ │ ├── mybatis-config.xml
│ │ ├── applicationContext.xml
│ │ └── mapper/
│ │ └── UserMapper.xml
│ └── test/
│ └── java/
│ └── com.example/
│ └── UserTest.java
├── pom.xml
└── schema.sql
2. Maven依赖(pom.xml)
xml
<!-- Spring核心 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.20</version>
</dependency>
<!-- MyBatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.10</version>
</dependency>
<!-- MyBatis-Spring整合 -->
<dependency>
<groupId>org.mybatis.spring</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>
<!-- 数据库驱动 -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.30</version>
</dependency>
<!-- 测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
3. 数据库表(schema.sql)
sql
CREATE TABLE user (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL
);
4. MyBatis全局配置(mybatis-config.xml)
xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
</configuration>
5. Spring配置(applicationContext.xml)
xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 数据源 -->
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource">
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
<!-- MyBatis工厂 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>
<!-- 扫描Mapper接口 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.example.mapper"/>
</bean>
</beans>
6. Mapper接口(UserMapper.java)
java
package com.example.mapper;
import com.example.entity.User;
public interface UserMapper {
User selectById(Long id); // 对应XML中的SQL
}
7. Mapper XML(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.example.mapper.UserMapper">
<select id="selectById" resultType="com.example.entity.User">
SELECT * FROM user WHERE id = #{id}
</select>
</mapper>
8. Service层(UserService.java)
java
package com.example.service;
import org.springframework.beans.factory.annotation.Autowired;
import com.example.mapper.UserMapper;
import com.example.entity.User;
public class UserService {
@Autowired
private UserMapper userMapper;
public User getUser(Long id) {
return userMapper.selectById(id);
}
}
9. 测试类(UserTest.java)
java
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class UserTest {
@Test
public void testGetUser() {
ApplicationContext context =
new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = context.getBean(UserService.class);
User user = userService.getUser(1L);
System.out.println(user.getName());
}
}
二、Spring Boot集成MyBatis示例
1. 项目结构
springboot-mybatis-demo/
├── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com.example/
│ │ │ ├── config/
│ │ │ ├── mapper/
│ │ │ ├── service/
│ │ │ └── Application.java
│ │ └── resources/
│ │ ├── application.properties
│ │ └── mapper/
│ │ └── UserMapper.xml
│ └── test/
│ └── java/
│ └── com.example/
│ └── UserTest.java
├── pom.xml
└── schema.sql
2. Maven依赖(pom.xml)
xml
<dependencies>
<!-- Spring Boot Starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- MyBatis Starter -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
<!-- 数据库驱动 -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.30</version>
</dependency>
<!-- 测试 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
3. 数据库表(schema.sql)
sql
// 与Spring示例相同
4. 配置文件(application.properties)
properties
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
mybatis.mapper-locations=classpath:mapper/*.xml
mybatis.type-aliases-package=com.example.entity
5. 启动类(Application.java)
java
package com.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication // 自动扫描组件
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
6. Mapper接口(UserMapper.java)
java
package com.example.mapper;
import org.apache.ibatis.annotations.Mapper; // 非必需,但显式标注
import com.example.entity.User;
@Mapper
public interface UserMapper {
User selectById(Long id);
}
7. Mapper XML(UserMapper.xml)
xml
// 与Spring示例相同
8. Service层(UserService.java)
java
package com.example.service;
import org.springframework.beans.factory.annotation.Autowired;
import com.example.mapper.UserMapper;
import com.example.entity.User;
@Service // Spring Boot自动扫描组件
public class UserService {
@Autowired
private UserMapper userMapper;
public User getUser(Long id) {
return userMapper.selectById(id);
}
}
9. 测试类(UserTest.java)
java
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class UserTest {
@Autowired
private UserService userService;
@Test
public void testGetUser() {
User user = userService.getUser(1L);
System.out.println(user.getName());
}
}
三、核心差异对比表
特性 | Spring集成 | Spring Boot集成 |
---|---|---|
依赖管理 | 需显式声明所有依赖(如MyBatis、Spring模块) | 通过starter 自动引入依赖,减少配置 |
配置方式 | XML/Java Config手动配置Bean | 属性文件(application.properties )+ 注解 |
数据源配置 | 手动定义dataSource Bean |
通过spring.datasource 前缀自动配置 |
Mapper扫描 | 需MapperScannerConfigurer 配置 |
通过@Mapper 注解或mybatis.mapper-locations |
启动方式 | 需ClassPathXmlApplicationContext 加载配置 |
单一入口类加@SpringBootApplication 注解 |
测试框架 | 需JUnit4和Spring Test支持 | Spring Boot Test简化测试配置 |
环境兼容性 | 兼容传统Spring应用服务器(如Tomcat) | 内置嵌入式Tomcat,直接运行JAR |
代码量 | 配置复杂,需定义多个Bean | 配置简洁,依赖约定优于配置原则 |
扩展性 | 手动控制所有配置细节 | 通过@EnableAutoConfiguration 禁用自动配置 |
四、关键差异总结
- 依赖简化 :Spring Boot通过
starter
自动管理依赖版本,避免冲突。 - 配置自动化 :Spring Boot的
application.properties
替代了大量XML配置,如数据源和Mapper扫描。 - 启动便捷性 :Spring Boot通过
@SpringBootApplication
简化了应用启动流程。 - 测试效率 :Spring Boot的测试框架(如
@SpringBootTest
)减少了测试代码的复杂性。 - 开发模式:Spring Boot遵循"约定优于配置",适合快速开发;Spring保留了对复杂场景的完全控制能力。