Spring Boot 项目目录结构
JPA 方式的 Spring Boot 项目目录结构
Spring Boot 项目通常有一个特定的目录结构,这有助于组织代码并提高项目的可维护性。以下是一个典型的 Spring Boot 项目的目录结构示例:
src
├── main
│ ├── java
│ │ └── com
│ │ └── example
│ │ └── demo
│ │ ├── controller
│ │ │ └── UserController.java
│ │ ├── service
│ │ │ ├── UserService.java
│ │ │ └── impl
│ │ │ └── UserServiceImpl.java
│ │ ├── repository
│ │ │ └── UserRepository.java
│ │ ├── entity
│ │ │ └── User.java
│ │ └── DemoApplication.java
│ └── resources
│ ├── application.properties
│ ├── static
│ │ └── css
│ │ └── js
│ └── templates
└── test
└── java
└── com
└── example
└── demo
└── DemoApplicationTests.java
各目录及文件说明:
src/main/java
这是存放 Java 源代码的主要目录。通常按照包名进行组织,例如 com.example.demo
。
-
controller
包:
此包用于存放控制器类,这些类负责处理 HTTP 请求并返回响应。例如,UserController.java
可能会处理与用户相关的请求。package com.example.demo.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class UserController { @GetMapping("/users") public String getUsers() { return "List of users"; } }
-
service
包:
这里存放服务接口和服务实现类。服务层主要负责处理业务逻辑。-
UserService.java
是服务接口:package com.example.demo.service; public interface UserService { String getUsers(); }
-
impl
子包中的UserServiceImpl.java
是服务实现类:package com.example.demo.service.impl; import com.example.demo.service.UserService; import org.springframework.stereotype.Service; @Service public class UserServiceImpl implements UserService { @Override public String getUsers() { return "List of users from service"; } }
-
-
repository
包:
该包存放数据访问层的接口,通常使用 Spring Data JPA。UserRepository.java
可以用来操作数据库中的用户数据。package com.example.demo.repository; import com.example.demo.entity.User; import org.springframework.data.jpa.repository.JpaRepository; public interface UserRepository extends JpaRepository<User, Long> { }
-
entity
包:
此包存放实体类,对应数据库中的表。User.java
就是一个实体类。package com.example.demo.entity; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @Entity // 表示这是一个JPA实体类,JPA是一种规范,SPring Data JPA是Spring对JPA的实现,是一种持久化框架,和mybaits类似,但mybaits不是基于JPA的,@Entity只能在JPA框架下使用 public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; // Getters and setters public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
-
DemoApplication.java
:
这是 Spring Boot 应用的主类,包含main
方法,用于启动应用。package com.example.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
src/main/resources
该目录存放应用的资源文件。
-
application.properties
:
这是 Spring Boot 的配置文件,用于配置应用的各种属性,如数据库连接信息、服务器端口等。 -
static
目录:
存放静态资源,如 CSS、JavaScript 和图片等。 -
templates
目录:
用于存放模板文件,如 Thymeleaf 或 Freemarker 模板。
src/test/java
此目录存放测试代码,DemoApplicationTests.java
可以用来编写单元测试和集成测试。
package com.example.demo;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class DemoApplicationTests {
@Test
void contextLoads() {
}
}
这种目录结构有助于将不同功能的代码分离,提高代码的可维护性和可扩展性。
MyBatis 方式的 Spring Boot 项目目录结构
当使用 MyBatis 作为数据访问层框架时,Spring Boot 项目的目录结构会有所不同。以下是一个基于 MyBatis 的典型 Spring Boot 项目目录结构示例:
src
├── main
│ ├── java
│ │ └── com
│ │ └── example
│ │ └── demo
│ │ ├── controller
│ │ │ └── UserController.java
│ │ ├── service
│ │ │ ├── UserService.java
│ │ │ └── impl
│ │ │ └── UserServiceImpl.java
│ │ ├── mapper
│ │ │ └── UserMapper.java
│ │ ├── model
│ │ │ └── User.java
│ │ ├── config
│ │ │ └── MyBatisConfig.java
│ │ └── DemoApplication.java
│ └── resources
│ ├── application.properties
│ ├── mapper
│ │ └── UserMapper.xml
│ ├── static
│ │ └── css
│ │ └── js
│ └── templates
└── test
└── java
└── com
└── example
└── demo
└── DemoApplicationTests.java
MyBatis 特有的目录及文件说明:
src/main/java
-
mapper
包:
此包用于存放 MyBatis 的 Mapper 接口,这些接口定义了数据库操作方法。例如,UserMapper.java
:package com.example.demo.mapper; import com.example.demo.model.User; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Select; import java.util.List; @Mapper public interface UserMapper { @Select("SELECT * FROM users") List<User> findAll(); // 也可以使用XML方式定义SQL User findById(Long id); int insert(User user); int update(User user); int deleteById(Long id); }
-
model
包:
在 MyBatis 项目中,实体类通常放在 model 包(有时也称为 entity 或 domain)中。User.java
是一个简单的实体类:package com.example.demo.model; public class User { private Long id; private String name; // Getters and setters public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
-
config
包:
用于存放配置类,例如 MyBatis 的配置类MyBatisConfig.java
:package com.example.demo.config; import org.mybatis.spring.annotation.MapperScan; import org.springframework.context.annotation.Configuration; @Configuration @MapperScan("com.example.demo.mapper") public class MyBatisConfig { // 可以添加自定义的MyBatis配置 }
-
service
包:
服务层与 JPA 项目类似,但会调用 mapper 而非 repository:package com.example.demo.service.impl; import com.example.demo.mapper.UserMapper; import com.example.demo.model.User; import com.example.demo.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @Service public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; @Override public List<User> getAllUsers() { return userMapper.findAll(); } @Override public User getUserById(Long id) { return userMapper.findById(id); } // 其他业务方法 }
src/main/resources
-
mapper
目录:
存放 MyBatis 的 XML 映射文件,用于定义复杂的 SQL 语句。UserMapper.xml
对应UserMapper.java
接口:<?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.demo.mapper.UserMapper"> <select id="findById" resultType="com.example.demo.model.User"> SELECT * FROM users WHERE id = #{id} </select> <insert id="insert" parameterType="com.example.demo.model.User" useGeneratedKeys="true" keyProperty="id"> INSERT INTO users (name) VALUES (#{name}) </insert> <update id="update" parameterType="com.example.demo.model.User"> UPDATE users SET name = #{name} WHERE id = #{id} </update> <delete id="deleteById"> DELETE FROM users WHERE id = #{id} </delete> </mapper>
-
application.properties
:
需要添加 MyBatis 相关配置,例如:# 数据库连接 spring.datasource.url=jdbc:mysql://localhost:3306/demo spring.datasource.username=root spring.datasource.password=password spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # MyBatis配置 mybatis.mapper-locations=classpath:mapper/*.xml mybatis.type-aliases-package=com.example.demo.model mybatis.configuration.map-underscore-to-camel-case=true
总结
MyBatis 与 JPA 在 Spring Boot 项目目录结构上的主要区别:
- MyBatis 使用 mapper 包代替 JPA 的 repository 包
- XML 映射文件存放在 resources/mapper 目录下
- 实体类通常不需要 JPA 特定的注解,更加简洁
- 项目通常会有专门的 MyBatis 配置类
- 需要在 application.properties 中添加 MyBatis 特定的配置项
两种方式各有优缺点,MyBatis 提供了更多对 SQL 的控制,适合复杂查询场景,而 JPA 则更适合简单 CRUD 操作,提供了更高层次的抽象。