当前位置: 首页 > java >正文

springBoot_项目目录结构

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 {@Overridepublic 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 setterspublic 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 {@Testvoid 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方式定义SQLUser 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 setterspublic 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 {@Autowiredprivate UserMapper userMapper;@Overridepublic List<User> getAllUsers() {return userMapper.findAll();}@Overridepublic 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 项目目录结构上的主要区别:

  1. MyBatis 使用 mapper 包代替 JPA 的 repository 包
  2. XML 映射文件存放在 resources/mapper 目录下
  3. 实体类通常不需要 JPA 特定的注解,更加简洁
  4. 项目通常会有专门的 MyBatis 配置类
  5. 需要在 application.properties 中添加 MyBatis 特定的配置项

两种方式各有优缺点,MyBatis 提供了更多对 SQL 的控制,适合复杂查询场景,而 JPA 则更适合简单 CRUD 操作,提供了更高层次的抽象。

http://www.xdnf.cn/news/1271.html

相关文章:

  • 刀客doc:快手磁力引擎副总裁冯超离职,王志强接管渠道业务
  • 仅追加KV数据库
  • C# 跨进程 临界区 互斥 进程锁
  • 航电系统之自动控制系统篇
  • 词语关系图谱模型
  • Python中__init__方法的深度解析:构造对象的艺术
  • Milvus(3):数据库、Collections说明
  • 将Ubuntu系统中已有的Python环境迁移到Anaconda的虚拟环境中
  • 物联网赋能玻璃制造业:实现设备智能管理与生产协同
  • C++ 哈希表
  • WebGL名词解释——裁剪空间
  • N8N MACOS本地部署流程避坑指南
  • CAN总线接口卡有什么优势
  • Linux 云服务器零基础指令扫盲
  • L1-6、Prompt 与上下文的关系[特殊字符]
  • Node.js技术原理分析系列8——将Node.js内置模块外置
  • CS61A:SCHEME LIST
  • 从零学会epoll的使用和原理
  • 「平方根的算法对决:二分查找 vs. 牛顿迭代法」
  • Spark 与 Hadoop:对比与联系
  • AI编程之Nodejs+MYSQL写一个爬虫系统
  • Python数据分析与机器学习实战:从数据到洞察的完整路径
  • vue中将elementUI和echarts转成pdf文件
  • 【DeepSeek 学习推理】Llumnix: Dynamic Scheduling for Large Language Model Serving实验部分
  • TM2SP-Net阅读
  • 日本电网的特点及分布地图
  • Linux 安装pm2并全局可用
  • Nginx常用命令,及常见错误
  • WHQL认证中Windows HCK与HLK的区别
  • 丙烯酸及酯:化学工业的“隐形支柱”与未来增长引擎