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 {
          @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 项目目录结构上的主要区别:

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月落霜满天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值