以下是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)
<!-- 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)
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 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 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)
package com.example.mapper;import com.example.entity.User;public interface UserMapper {User selectById(Long id); // 对应XML中的SQL
}
7. Mapper XML(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.example.mapper.UserMapper"><select id="selectById" resultType="com.example.entity.User">SELECT * FROM user WHERE id = #{id}</select>
</mapper>
8. Service层(UserService.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 {@Autowiredprivate UserMapper userMapper;public User getUser(Long id) {return userMapper.selectById(id);}
}
9. 测试类(UserTest.java)
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class UserTest {@Testpublic 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)
<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)
// 与Spring示例相同
4. 配置文件(application.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.Drivermybatis.mapper-locations=classpath:mapper/*.xml
mybatis.type-aliases-package=com.example.entity
5. 启动类(Application.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)
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)
// 与Spring示例相同
8. Service层(UserService.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 {@Autowiredprivate UserMapper userMapper;public User getUser(Long id) {return userMapper.selectById(id);}
}
9. 测试类(UserTest.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 {@Autowiredprivate UserService userService;@Testpublic 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保留了对复杂场景的完全控制能力。