You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Java配置搭建含JPA、MySQL、Tomcat的理想Spring MVC项目

搭建Java 17/21 + Spring MVC + JPA + MySQL + Tomcat项目指南

问题1:pom.xml文件编写及依赖说明

如果用Spring Boot(推荐搭配Spring MVC),pom.xml核心依赖如下,版本适配Java 17/21和Tomcat 10/11(Spring 6+基于Jakarta EE,兼容Tomcat 10+):

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.2.0</version> <!-- 适配Java 17/21,兼容Tomcat 10/11 -->
        <relativePath/>
    </parent>
    <groupId>com.example</groupId>
    <artifactId>spring-mvc-jpa-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging> <!-- 打包为WAR部署到外部Tomcat -->
    <properties>
        <java.version>17</java.version>
        <tomcat.version>10.1.16</tomcat.version> <!-- 或11.x版本 -->
    </properties>
    <dependencies>
        <!-- Spring MVC核心依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <!-- 排除内置Tomcat,使用外部Tomcat -->
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!-- Spring Data JPA(整合JPA+Hibernate) -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <!-- MySQL驱动 -->
        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <scope>runtime</scope>
        </dependency>
        <!-- 外部Tomcat依赖(编译时使用) -->
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-core</artifactId>
            <version>${tomcat.version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
            <version>${tomcat.version}</version>
            <scope>provided</scope>
        </dependency>
        <!-- JSP及JSTL依赖 -->
        <dependency>
            <groupId>jakarta.servlet.jsp.jstl</groupId>
            <artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
        </dependency>
        <dependency>
            <groupId>org.glassfish.web</groupId>
            <artifactId>jakarta.servlet.jsp.jstl</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <!-- Tomcat10+调试插件 -->
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat10-maven-plugin</artifactId>
                <version>3.0.0</version>
                <configuration>
                    <port>8080</port>
                    <path>/</path>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

如果是纯Spring MVC(非Spring Boot),需手动引入Spring Core、Spring Web MVC、Hibernate等依赖,配置繁琐,优先推荐Spring Boot。

问题2:Spring Initializr vs 从头搭建Maven Web应用

优先用Spring Initializr,理由:

  • 自动生成规范项目结构,避免手动处理依赖冲突
  • 一键勾选所需依赖(Web、JPA、MySQL),版本自动适配
  • 自带Java-based配置基础,无需手写XML
  • 支持直接选择Java版本、打包方式(WAR)

仅当需要高度自定义结构或依赖版本时,再考虑从头搭建。

问题3:项目结构最佳实践

遵循按功能分层的包结构,示例:

src/
├── main/
│   ├── java/
│   │   └── com/example/demo/
│   │       ├── config/          # Java配置类(JPA、MVC、CORS等)
│   │       ├── controller/      # 控制器(处理HTTP请求)
│   │       ├── dto/             # 数据传输对象
│   │       ├── entity/          # JPA实体类(映射数据库表)
│   │       ├── repository/      # JPA Repository接口(数据访问)
│   │       ├── service/         # 业务逻辑层
│   │       │   └── impl/        # 业务逻辑实现类
│   │       └── DemoApplication.java # Spring Boot启动类
│   └── resources/
│       ├── application.properties # 配置文件(数据库连接、MVC参数)
│       ├── static/             # 静态资源(CSS、JS、图片)
│       └── templates/           # 视图文件(JSP、Thymeleaf等)
└── test/
    └── java/                    # 测试类

配置技巧:

  • 数据库连接、JPA参数优先写在application.properties,比纯Java配置更易维护
  • 用MapStruct等工具类简化DTO与实体类的转换
  • 控制器只处理参数校验、调用服务层,不写业务逻辑

问题4:Java配置实现JPA连接MySQL

1. Spring Boot方式(推荐)

大部分配置通过application.properties完成,配合少量Java配置增强灵活性:

application.properties配置

# 数据库连接
spring.datasource.url=jdbc:mysql://localhost:3306/your_db_name?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
spring.datasource.username=root
spring.datasource.password=your_password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# JPA/Hibernate配置
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect

自定义Java配置(可选)

在config包下创建JPA配置类:

package com.example.demo.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@Configuration
@EnableJpaRepositories(basePackages = "com.example.demo.repository")
@EnableTransactionManagement
public class JpaConfig {
    // Spring Boot默认已自动配置核心Bean,无需手动编写
}

2. 纯Spring MVC方式

需手动配置核心Bean:

@Configuration
@EnableWebMvc
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "com.example.demo.repository")
@EntityScan(basePackages = "com.example.demo.entity")
public class AppConfig {

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/your_db_name?useSSL=false&serverTimezone=UTC");
        dataSource.setUsername("root");
        dataSource.setPassword("your_password");
        return dataSource;
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
        LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(dataSource());
        em.setPackagesToScan("com.example.demo.entity");
        JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        em.setJpaVendorAdapter(vendorAdapter);
        HashMap<String, Object> properties = new HashMap<>();
        properties.put("hibernate.hbm2ddl.auto", "update");
        properties.put("hibernate.show_sql", "true");
        properties.put("hibernate.dialect", "org.hibernate.dialect.MySQL8Dialect");
        em.setJpaPropertyMap(properties);
        return em;
    }

    @Bean
    public PlatformTransactionManager transactionManager(EntityManagerFactory emf) {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(emf);
        return transactionManager;
    }
}

问题5:Tomcat上运行步骤及常见错误解决

运行步骤

  1. 打包项目:在项目根目录执行mvn clean package,WAR包生成在target/目录
  2. 部署到Tomcat:将WAR包复制到Tomcat的webapps/目录
  3. 启动Tomcat:运行bin/startup.sh(Linux)或startup.bat(Windows)
  4. 访问项目:浏览器打开http://localhost:8080/[WAR包名称],若WAR包名为ROOT.war,直接访问http://localhost:8080

常见错误解决

  • no origin found:CORS跨域问题,添加CORS配置:
    @Configuration
    public class WebConfig implements WebMvcConfigurer {
        @Override
        public void addCorsMappings(CorsRegistry registry) {
            registry.addMapping("/**")
                    .allowedOrigins("http://localhost:3000") // 允许的前端域名
                    .allowedMethods("GET", "POST", "PUT", "DELETE")
                    .allowedHeaders("*")
                    .allowCredentials(true);
        }
    }
    
  • no mapping found for GET /...xyz.jsp:
    1. 检查控制器是否有正确的@GetMapping映射,比如访问/hello需对应@GetMapping("/hello")的方法
    2. 若用JSP视图,确保JSP放在src/main/webapp/WEB-INF/views/目录,控制器返回视图名称即可
    3. 查看Tomcat日志logs/catalina.out,定位具体部署错误

内容的提问来源于stack exchange,提问作者vivek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 17:31:07