# SpringBoot2 多模塊項目中MyBatis如何使用
## 一、多模塊項目基礎概念
### 1.1 什么是多模塊項目
多模塊項目(Multi-Module Project)是通過Maven或Gradle構建工具將一個大型項目拆分為多個相互關聯的子模塊的工程結構。每個模塊可以獨立編譯、測試和打包,同時保持項目間的依賴關系。
**典型的多模塊結構:**
parent-project(父工程) ├── pom.xml ├── module-common(公共模塊) ├── module-dao(數據訪問層) ├── module-service(業務邏輯層) └── module-web(Web表現層)
### 1.2 多模塊的優勢
1. **代碼復用**:公共代碼可提取到獨立模塊
2. **職責分離**:各層模塊職責明確
3. **構建效率**:可單獨編譯修改的模塊
4. **依賴管理**:統一管理依賴版本
## 二、創建SpringBoot多模塊項目
### 2.1 初始化父工程
```xml
<!-- parent pom.xml -->
<groupId>com.example</groupId>
<artifactId>multi-module-demo</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging>
<modules>
<module>module-common</module>
<module>module-dao</module>
<module>module-service</module>
<module>module-web</module>
</modules>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.3</version>
<relativePath/>
</parent>
在module-dao
中引入:
<dependencies>
<!-- MyBatis Starter -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
<!-- 數據庫驅動 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
application.yml
配置示例:
spring:
datasource:
url: jdbc:mysql://localhost:3306/demo?useSSL=false
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
mapper-locations: classpath:mapper/*.xml
type-aliases-package: com.example.model
確保依賴傳遞:
<!-- module-service/pom.xml -->
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>module-dao</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
方案1:主模塊添加掃描注解
@SpringBootApplication(scanBasePackages = "com.example")
@MapperScan("com.example.dao")
public class WebApplication {
public static void main(String[] args) {
SpringApplication.run(WebApplication.class, args);
}
}
方案2:每個模塊單獨配置
// 在dao模塊配置類
@Configuration
@MapperScan("com.example.dao")
public class MyBatisConfig {}
推薦結構:
module-dao
├── src/main/java
│ └── com/example/dao
└── src/main/resources
└── mapper
└── UserMapper.xml
配置示例:
mybatis:
mapper-locations: classpath*:mapper/**/*.xml
@Configuration
@MapperScan(basePackages = "com.example.db1.dao",
sqlSessionFactoryRef = "db1SqlSessionFactory")
public class Db1DataSourceConfig {
@Bean
@ConfigurationProperties("spring.datasource.db1")
public DataSource db1DataSource() {
return DataSourceBuilder.create().build();
}
@Bean
public SqlSessionFactory db1SqlSessionFactory() throws Exception {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(db1DataSource());
return factoryBean.getObject();
}
}
實現AbstractRoutingDataSource:
public class DynamicDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return DataSourceContextHolder.getDataSourceType();
}
}
@MappedTypes(Enum.class)
@MappedJdbcTypes(JdbcType.VARCHAR)
public class EnumTypeHandler<E extends Enum<E>>
extends BaseTypeHandler<E> {
private Class<E> type;
public EnumTypeHandler(Class<E> type) {
this.type = type;
}
// 實現抽象方法...
}
multi-module-demo
├── module-common
│ ├── 通用工具類
│ └── 基礎DTO
├── module-dao
│ ├── entity
│ ├── mapper
│ └── repository
├── module-service
│ ├── service
│ └── impl
└── module-web
├── controller
├── dto
└── config
mybatis.configuration.cache-enabled=true
SqlSessionTemplate
問題1:Mapper接口無法注入
- 檢查@MapperScan
包路徑是否正確
- 確認mapper接口有@Mapper
注解或XML對應
問題2:XML映射未生效
- 檢查mapper-locations
配置
- 確認XML文件名與接口名一致
問題3:多模塊事務失效
- 確保@Transactional
注解在公共模塊
- 主模塊添加@EnableTransactionManagement
實體類:
// module-dao/src/main/java/com/example/entity/User.java
@Data
public class User {
private Long id;
private String username;
private LocalDateTime createTime;
}
Mapper接口:
@Mapper
public interface UserMapper {
@Select("SELECT * FROM user WHERE id = #{id}")
User selectById(Long id);
@Insert("INSERT INTO user(username) VALUES(#{username})")
@Options(useGeneratedKeys = true, keyProperty = "id")
int insert(User user);
}
Service實現:
// module-service/src/main/java/com/example/service/impl/UserServiceImpl.java
@Service
@RequiredArgsConstructor
public class UserServiceImpl implements UserService {
private final UserMapper userMapper;
@Override
@Transactional
public Long createUser(String username) {
User user = new User();
user.setUsername(username);
userMapper.insert(user);
return user.getId();
}
}
在SpringBoot2多模塊項目中使用MyBatis需要注意: 1. 模塊劃分:清晰界定各模塊職責 2. 依賴管理:統一管理MyBatis相關依賴版本 3. 掃描配置:正確處理跨模塊的組件掃描 4. 資源文件:合理規劃XML映射文件位置 5. 事務管理:確??缒K事務生效
通過本文介紹的方式,可以構建出結構清晰、易于維護的SpringBoot多模塊MyBatis應用。實際開發中應根據項目規模靈活調整模塊劃分方案。
提示:本文基于SpringBoot 2.7.x和MyBatis 3.5.x版本,不同版本配置可能存在差異 “`
該文章包含約2700字,采用Markdown格式編寫,涵蓋了從多模塊項目創建到MyBatis集成的完整流程,包含代碼示例、配置建議和常見問題解決方案。文章結構清晰,適合作為技術文檔參考。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。