以下是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保留了對復雜場景的完全控制能力。