首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Spring MVC + MyBatis + MySQL 實戰項目環境搭建:STS、JDK 8、Maven 多模塊最佳實踐

     編輯:Java 綜合教學

技術棧版本鎖定(可升級至現代版本)

組件原文版本建議現代版本說明
IDESpring Tool Suite (STS)IntelliJ IDEA 2024.xSTS 已停止獨立發佈,功能整合進 IDEA 插件
JDK1.817 / 21 (LTS)長期支援、性能更強、語法更現代
Spring4.x (隱含)Spring Boot 3.2+ / Spring Framework 6.xBoot 3 基線 JDK 17,自動配置極大簡化 XML
MyBatis3.4.xMyBatis 3.5+ / MyBatis-Plus 3.5+Plus 提供 CRUD 封裝、分頁、代碼生成
MySQL5.58.0 / 8.4 LTSCBO 優化器、窗口函數、JSON、CTE
構建工具Maven 3.3+Maven 3.9+ / Gradle 8.xGradle 配置更簡潔、增量構建更快

現代化專案結構(Maven 多模塊)

parent-project (pom, packaging=pom)
├── common-module          # 通用工具、常量、異常、DTO
├── domain-module          # 實體、VO、Repository 接口
├── infrastructure-module  # MyBatis Mapper、配置、第三方適配
├── application-module     # Service 實現、事務邊界、業務編排
└── web-module             # Controller、配置、啟動類 (Spring Boot)

核心依賴管理

<!-- parent/pom.xml -->
<properties>
    <java.version>17</java.version>
    <spring-boot.version>3.2.5</spring-boot.version>
    <mybatis-plus.version>3.5.5</mybatis-plus.version>
    <mysql.version>8.0.33</mysql.version>
</properties>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>${spring-boot.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

關鍵配置類

@Configuration
@MapperScan("com.example.infrastructure.mapper")
public class MyBatisConfig {
    @Bean
    public DataSource dataSource(@Value("${spring.datasource.url}") String url,
                                 @Value("${spring.datasource.username}") String user,
                                 @Value("${spring.datasource.password}") String pass) {
        HikariDataSource ds = new HikariDataSource();
        ds.setJdbcUrl(url); ds.setUsername(user); ds.setPassword(pass);
        ds.setMaximumPoolSize(20);
        return ds;
    }

    @Bean
    public SqlSessionFactory sqlSessionFactory(DataSource ds) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(ds);
        bean.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources("classpath*:mapper/**/*.xml"));
        bean.setTypeAliasesPackage("com.example.domain.entity");
        return bean.getObject();
    }
}

application.yml 範例

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/demo?useSSL=false&serverTimezone=Asia/Shanghai
    username: root
    password: 123456
  servlet:
    multipart:
      max-file-size: 10MB
      max-request-size: 50MB

mybatis-plus:
  configuration:
    map-underscore-to-camel-case: true
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  global-config:
    db-config:
      id-type: ASSIGN_ID  # 雪花算法 ID
      logic-delete-field: deleted
      logic-delete-value: 1
      logic-not-delete-value: 0

實體與 Mapper 範例

// domain/entity/User.java
@Data @TableName("sys_user")
public class User {
    @TableId(type = IdType.ASSIGN_ID)
    private Long id;
    private String username;
    private String password;
    private Integer status;
    private LocalDateTime createTime;
}

// infrastructure/mapper/UserMapper.java
@Mapper
public interface UserMapper extends BaseMapper {
    @Select("SELECT * FROM sys_user WHERE username = #{username}")
    User findByUsername(String username);
}

// infrastructure/mapper/UserMapper.xml (可選,複雜 SQL)
<mapper namespace="com.example.infrastructure.mapper.UserMapper">
    <resultMap id="UserMap" type="com.example.domain.entity.User">
        <id property="id" column="id"/>
        <result property="username" column="username"/>
        <result property="createTime" column="create_time"/>
    </resultMap>
</mapper>

Service 與 Controller

@Service @RequiredArgsConstructor @Transactional
public class UserService {
    private final UserMapper userMapper;
    private final PasswordEncoder passwordEncoder;

    public Long register(String username, String rawPassword) {
        if (userMapper.findByUsername(username) != null) throw new BizException("用戶已存在");
        User user = new User();
        user.setUsername(username);
        user.setPassword(passwordEncoder.encode(rawPassword));
        user.setStatus(1);
        user.setCreateTime(LocalDateTime.now());
        userMapper.insert(user);
        return user.getId();
    }
}

@RestController @RequestMapping("/api/users") @RequiredArgsConstructor
public class UserController {
    private final UserService userService;

    @PostMapping("/register")
    public R register(@RequestBody @Valid RegisterDTO dto) {
        return R.ok(userService.register(dto.getUsername(), dto.getPassword()));
    }
}

啟動類與驗證

@SpringBootApplication
@EnableTransactionManagement
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

運行後訪問 https://localhost:8080/api/users/register 測試。

避坑指南

問題原因解決
Mapper 掃描失效包路徑不匹配@MapperScan 基礎包精確到 mapper 所在層
下劃線轉駝峰失效配置錯誤mybatis-plus.configuration.map-underscore-to-camel-case=true
事務不生效方法非 public / 同類內調用 / 異常被吞public 方法、AOP 代理調用、rollbackFor=Exception.class
ID 衝突/重複自增 ID 分庫分表雪花算法 ASSIGN_ID 或 UUID

總結

現代 Spring Boot + MyBatis-Plus 專案**零 XML 配置、約定優於配置、啟動極快**。本文提供從依賴管理、分層架構、核心配置到業務代碼的完整最佳實踐模板,可直接作為新專案脚手架。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved