一、新建工作空间
在现有的工作空间下新建文件夹,这里命名为:springboot-demo

选择新建的工作空间
多个项目的工作空间尽量隔离,避免混乱

二、配置eclipse
1.配置jdk
注意只能选择jdk,不能选择jre
选择自己项目的版本

2.配置Maven
点击菜单栏window➡preferences➡Maven➡Installations
我这里目录选择的是:D:\Software\maven\apache-maven-3.9.9


选择对应目录下面的settings.xml、toolchains.xml

三、安装STS插件方式创建
1.安装Spring Tools插件
- 打开Eclipse,点击菜单栏 Help → Eclipse Marketplace...
- 在搜索框中输入
Spring Tools - 找到 Spring Tools (aka Spring Tool Suite) 5.0.1.RELEASE ,点击 Install
- 安装插件导向窗口完成后,在eclipse右下角将会出现安装插件的进度,
- 等插件安装完成后重启eclipse生效




2.创建Spring Boot项目
1、点击 File → New → Other...
2、展开 Spring Boot 目录,选择 Spring Starter Project ,点击 Next

这里选择的Java Version是17,因为Spring Tools 5不支持更低的版本,后面可以修改
| 字段 | 说明 | 示例 | 备注 |
|---|---|---|---|
| Name | 项目名称 | springboot-demo | 起个名字 |
| Type | 项目类型 | Maven | |
| Packaging | 打包方式 | Jar | |
| Java Version | Java版本 | 17/21 | |
| Group | 组织ID | com.example | 企业开发替换为实际的组织名 |
| Artifact | 项目名 | demo | |
| Package | 包名 | com.example.demo | 会自动创建包 |

选择需要的依赖
| 依赖名称 | 核心作用 | 适用场景 | 新手备注 |
|---|---|---|---|
| Spring Web | 提供Spring MVC核心功能,内置Tomcat容器,支持开发RESTful接口、Web请求处理 | 所有Web/接口类Spring Boot项目 | 必选依赖(开发后端接口的基础) |
| Spring Boot DevTools | 实现项目热部署(修改代码无需重启应用),提升开发效率 | 本地开发阶段 | 仅开发环境用,生产环境会自动禁用 |
| Lombok | 简化Java代码(如用@Data替代get/set方法、@Slf4j简化日志) | 所有想简化代码的Java项目 | 可选,需在IDE中安装Lombok插件才能生效 |
| Oracle Driver | 提供Oracle数据库的JDBC驱动,实现Java程序连接Oracle数据库 | 项目需操作Oracle数据库时 | 需配合数据库连接配置(application.yml) |
| Spring Data JPA | 封装JPA(持久层规范),简化数据库CRUD操作(无需手写SQL) | 需操作数据库且想简化持久层代码 | 依赖数据库驱动(如oracle Driver)才能使用 |

3.项目的目录结构

springboot-demo
├── src/ # 源代码根目录
│ ├── main/ # 主代码
│ │ ├── java/ # Java 源代码
│ │ │ └── com/example/demo/ # 包结构
│ │ │ └── SpringbootDemoApplication.java # 主启动类
│ │ └── resources/ # 资源文件
│ │ ├── static/ # 静态资源 (CSS/JS/图片)
│ │ ├── templates/ # 模板文件 (Thymeleaf等)
│ │ └── application.properties # 配置文件
│ │
│ └── test/ # 测试代码
│ └── java/ # 测试 Java 代码
│
├── target/ # 编译输出目录 (自动生成)
│ ├── generated-sources/ # 生成的源代码
│ └── generated-test-sources/ # 生成的测试代码
│
├── HELP.md # 项目帮助文档
├── mvnw # Maven Wrapper (Linux/Mac)
├── mvnw.cmd # Maven Wrapper (Windows)
└── pom.xml # Maven 配置文件 ⭐
4.pom文件报错和修改版本
将【xsi:schemaLocation】的地址从https修改为http
否则pom文件会有报错
bash
#修改前
xsi:schemaLocation="https://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
#修改后
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
因为 Spring Tools 5最低只能使用Java17,因此如果Java版本较低的话,需要修改版本
如果是正常版本则不需要修改,我这里是jdk11,因此需要修改
xml
<!-- 1. 降级Spring Boot父工程到2.7.18(唯一适配JDK 11的稳定版) -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.18</version> <!-- 把默认的3.x改成2.7.18 -->
<relativePath/>
</parent>
<!-- 2. 强制指定编译用JDK 11 -->
<properties>
<java.version>11</java.version> <!-- 把17改成11 -->
<maven.compiler.source>11</maven.compiler.source> <!-- 新增:编译源码用11 -->
<maven.compiler.target>11</maven.compiler.target> <!-- 新增:编译产物适配11 -->
</properties>
修改完之后重启下eclipse,不然可能会pom文件报错
5.pom文件添加依赖
这是我使用的pom文件,可以按需添加依赖
xml
<?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
http://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>2.7.8</version>
<relativePath/>
</parent>
<groupId>com.example</groupId>
<artifactId>springboot-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot-demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>11</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<lombok.version>1.18.24</lombok.version>
</properties>
<dependencies>
<!-- Spring Boot Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring Boot JDBC -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- Spring Boot DevTools -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<!-- MyBatis-Plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.1</version>
</dependency>
<!-- Oracle 驱动 -->
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
</dependency>
<!-- Oracle 国际化支持(解决字符集问题) -->
<dependency>
<groupId>com.oracle.database.nls</groupId>
<artifactId>orai18n</artifactId>
</dependency>
<!-- Lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<optional>true</optional>
</dependency>
<!-- Test -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
<!-- Spring Boot 打包插件-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
6.修改application配置文件
修改application.properties为application.yml格式
yml
# 服务器配置
server:
port: 8080
# Spring 应用配置
spring:
application:
name: demo
# 数据源配置(Oracle)
datasource:
driver-class-name: oracle.jdbc.OracleDriver
url: jdbc:oracle:thin:@127.0.0.0:1521:orcl
username: root
password: 123456
# 连接池配置
hikari:
minimum-idle: 5
maximum-pool-size: 20
idle-timeout: 30000
connection-timeout: 30000
max-lifetime: 1800000
# 日志配置
logging:
level:
root: INFO
com.example.demo: DEBUG
com.example.demo.mapper: DEBUG
com.baomidou.mybatisplus: DEBUG
pattern:
console: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %clr(%-5level){FATAL=red, ERROR=red, WARN=yellow, INFO=green, DEBUG=blue, TRACE=blue} %clr(%logger{50}){cyan} - %clr(%msg){white}%n"
# MyBatis-Plus 配置
mybatis-plus:
mapper-locations: classpath:/mapper/**/*.xml
type-aliases-package: com.example.demo.entity
global-config:
banner: false
db-config:
id-type: ASSIGN_ID
logic-delete-field: deleted
logic-delete-value: 1
logic-not-delete-value: 0
configuration:
map-underscore-to-camel-case: true
cache-enabled: false
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
四、写测试程序
1.新建基本的包
| 包 | 作用 |
|---|---|
| controller | 此目录主要是存放**Controllerde ,比如:UserController.java,也有的项目是把action放在controller目录下,有的是把UserController.java放在action目录下 |
| service | 这里分接口和实现类,接口在service目录下,接口实现类在service/impl目录下 |
| mapper | 持久层,Mybatis使用,操作数据库 |
| entity | 就是数据库表的实体对象 |
| param | 分为request和response。放的是请求参数和相应参数UserQueryRequest、BaseResponse等 |
| util | 通常是一些工具类,比如说:DateUtil.java、自定义的StringUtil.java |
| interrupt | 项目统一拦截处理,比如:登录信息,统一异常处理 |
| exception | 自定义异常,异常错误码 |
| config | 配置读取相关,比如RedisConfig.java |


新建之后空白的包目录

2.编写Controller示例
在 src/main/java 下创建Controller类:

java
package com.example.demo.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
log.info("测试日志打印");
return "Hello Spring Boot!";
}
}
3.运行项目
1、右键点击 SpringbootDemoApplication.java
2、选择 Run As → Spring Boot App
3、控制台显示 Started DemoApplication 表示启动成功
3、浏览器访问:http://localhost:8080/hello
5、显示: Hello Spring Boot!代表调用成功


五、调用数据库
1.创建测试表
这里是Oracle数据库
sql
-- 创建用户表
CREATE TABLE SYS_USER (
ID NUMBER(19) NOT NULL,
USERNAME VARCHAR2(50) NOT NULL,
EMAIL VARCHAR2(100),
CREATE_TIME DATE DEFAULT SYSDATE,
UPDATE_TIME DATE DEFAULT SYSDATE,
DELETED NUMBER(1) DEFAULT 0,
CONSTRAINT PK_SYS_USER PRIMARY KEY (ID)
);
-- 插入测试数据
INSERT INTO SYS_USER (ID, USERNAME, EMAIL) VALUES (1, 'admin', 'admin@example.com');
INSERT INTO SYS_USER (ID, USERNAME, EMAIL) VALUES (2, 'user1', 'user1@example.com');
COMMIT;
2.MybatisPlus配置文件
配置的分页查询逻辑
MySQL 分页插件会自动拼接 LIMIT ? OFFSET ? 语法;
Oracle 则会拼接基于 ROWNUM 的嵌套查询语法。
java
package com.example.demo.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MybatisPlusConfig {
/**
* 分页插件配置
* Oracle 数据库需要指定 DbType.ORACLE
* 不同的数据库分页语法不同,DbType.ORACLE制定分页语法为Orcale
* Mysql可以写为:DbType.MYSQL
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 添加分页拦截器,指定 Oracle 数据库类型
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.ORACLE));
return interceptor;
}
}
3.entity实体类
java
package com.example.demo.entity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
@Data
@TableName("SYS_USER") // Oracle 表名通常大写
public class User implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键 (Oracle 序列生成)
*/
@TableId(type = IdType.ASSIGN_ID)
private Long id;
/**
* 用户名
*/
@TableField("USERNAME")
private String username;
/**
* 邮箱
*/
@TableField("EMAIL")
private String email;
/**
* 创建时间
*/
@TableField(value = "CREATE_TIME", fill = FieldFill.INSERT)
private LocalDateTime createTime;
/**
* 更新时间
*/
@TableField(value = "UPDATE_TIME", fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
/**
* 逻辑删除 (0-未删除,1-已删除)
*/
@TableLogic
@TableField("DELETED")
private Integer deleted;
}
4.mapper接口
java
package com.example.demo.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.entity.User;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface UserMapper extends BaseMapper<User> {
// 继承 BaseMapper 后,无需编写即可使用 CRUD 方法
// 如需自定义 SQL,可在此添加方法
}
5.service服务
service接口
java
package com.example.demo.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.example.demo.entity.User;
public interface UserService extends IService<User> {
// 继承 IService 后,无需编写即可使用 CRUD 方法
}
service实现类
java
package com.example.demo.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import com.example.demo.service.UserService;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
// 继承 ServiceImpl 后,无需编写即可使用 CRUD 方法
}
6.controller控制类
java
package com.example.demo.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.demo.entity.User;
import com.example.demo.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@Slf4j
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
/**
* 查询所有用户
*/
@GetMapping
public List<User> list() {
log.info("查询所有用户");
return userService.list();
}
/**
* 根据 ID 查询
*/
@GetMapping("/{id}")
public User getById(@PathVariable Long id) {
return userService.getById(id);
}
/**
* 新增用户
*/
@PostMapping
public boolean save(@RequestBody User user) {
return userService.save(user);
}
/**
* 更新用户
*/
@PutMapping
public boolean update(@RequestBody User user) {
return userService.updateById(user);
}
/**
* 删除用户
*/
@DeleteMapping("/{id}")
public boolean remove(@PathVariable Long id) {
return userService.removeById(id);
}
/**
* 分页查询 (Oracle 分页)
*/
@GetMapping("/page")
public Page<User> page(
@RequestParam(defaultValue = "1") Integer current,
@RequestParam(defaultValue = "10") Integer size) {
Page<User> page = new Page<>(current, size);
return userService.page(page);
}
/**
* 条件查询
*/
@GetMapping("/search")
public List<User> search(@RequestParam String username) {
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.like("USERNAME", username);
return userService.list(wrapper);
}
}
7.启动类
java
package com.example.demo;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.example.demo.mapper") // 扫描 Mapper 接口
public class SpringbootDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootDemoApplication.class, args);
}
}
8.接口测试
bash
# 查询所有用户
http://localhost:8080/users
# 分页查询
http://localhost:8080/users/page?current=1&size=1


六、服务器部署
1.安装jdk
我这里的环境是Ubuntu 24
项目使用的是JDK11
在Ubuntu 24上使用docker安装JDK11
bash
apt-cache search java11
sudo apt-get install openjdk-11-jdk
java -version

2.打包
| 序号 | 选项 | 图标 | 用途说明 | 适用场景 |
|---|---|---|---|---|
| 1 | Java Application | 🟦 | 运行普通的 Java 类(含 main 方法) | 测试工具类、独立程序 |
| 2 | JUnit Test | 🟩 | 运行 JUnit 单元测试 | 执行测试用例、验证代码 |
| 3 | Maven build... | 🟥 | 执行自定义的 Maven 命令 | 需要指定特定 Maven 目标时 |
| 4 | Maven clean | 🟥 | 执行 mvn clean |
清理 target 目录,重新构建前 |
| 5 | Maven generate-sources | 🟥 | 执行 mvn generate-sources |
生成代码(如 Lombok、Protobuf) |
| 6 | Maven install | 🟥 | 执行 mvn install |
构建并安装到本地仓库 |
| 7 | Maven test | 🟥 | 执行 mvn test |
运行项目所有单元测试 |
| 8 | Maven verify | 🟥 | 执行 mvn verify |
验证构建完整性(含测试) |
| 9 | Spring Boot App | 🟢 | 运行 Spring Boot 应用 | 启动 Spring Boot 项目 ⭐ |
| 10 | Spring DevTools Client | 🟢 | 连接 DevTools 远程服务 | 开发时热部署调试 |
| 11 | Run Configurations... | ⚙️ | 打开运行配置管理界面 | 自定义/编辑运行参数 |
项目根目录Run As

修改Goals为:clean package -DskipTests
这里路径是:
D:\Develop\eclipse workspace\springboot-demo\springboot-demo\target\springboot-demo-0.0.1-SNAPSHOT.ja

上传到服务器目录:/service/springboot-demo
3.新建项目目录
bash
sudo mkdir -p /service/springboot-demo
sudo chown $USER:$USER /service/springboot-demo
#新建生产配置文件
cd /service/springboot-demo
vim application-prod.yml
Jar 包外部的配置文件(如 jar 同目录/application.yml)优先级> Jar 包内部的配置文件(resources/application.yml)
配置合并规则
- 覆盖:外部配置中存在的项,会覆盖内部同名配置;
- 合并:外部配置中不存在的项,会沿用内部配置的内容;
- 新增:外部配置中新增的项,会被添加到最终配置中。
yml
server:
port: 8080
spring:
application:
name: demo
datasource:
driver-class-name: oracle.jdbc.OracleDriver
url: jdbc:oracle:thin:@172.28.70.65:1521:orcl
username: c##gaps
password: 123456
hikari:
minimum-idle: 5
maximum-pool-size: 20
logging:
level:
root: INFO
com.example.demo: INFO
4.新建启动和停止脚本
start.sh启动脚本
bash
#!/bin/bash
# SpringBoot 应用启动脚本
# 适配项目:springboot-demo
# ========== 仅需修改这两个配置项 ==========
APP_NAME="springboot-demo-0.0.1-SNAPSHOT.jar" # JAR包名称
APP_PATH="/service/springboot-demo" # JAR包所在目录
# ==========================================
# 生成日期字符串(格式:20260313)
DATE=$(date +"%Y%m%d")
# 日志文件名
LOG_FILE="${DATE}-demo.log"
# 日志目录(自动创建)
LOG_DIR="${APP_PATH}/logs"
# 切换到应用目录
cd "${APP_PATH}" || {
echo "错误:目录 ${APP_PATH} 不存在!"
exit 1
}
# 检查JAR包是否存在
if [ ! -f "${APP_NAME}" ]; then
echo "错误:JAR包 ${APP_NAME} 不存在!"
exit 1
fi
# 自动创建日志目录
if [ ! -d "${LOG_DIR}" ]; then
mkdir -p "${LOG_DIR}"
echo "日志目录已创建:${LOG_DIR}"
fi
# 启动应用(日志输出到日期格式的文件)
echo "正在启动 ${APP_NAME}..."
nohup java -jar -Xms512m -Xmx512m -Dfile.encoding=UTF-8 "${APP_NAME}" > "${LOG_DIR}/${LOG_FILE}" 2>&1 &
# 检查启动状态
sleep 2
PID=$(ps aux | grep "${APP_NAME}" | grep -v grep | awk '{print $2}')
if [ -n "${PID}" ]; then
echo "应用启动成功!进程ID:${PID}"
echo "日志文件:${LOG_DIR}/${LOG_FILE}"
else
echo "应用启动失败!请查看日志:${LOG_DIR}/${LOG_FILE}"
fi
stop.sh停止脚本
bash
#!/bin/bash
# SpringBoot 应用停止脚本
# 适配项目:springboot-demo
# ========== 仅需修改这个配置项 ==========
APP_NAME="springboot-demo-0.0.1-SNAPSHOT.jar" # JAR包名称
# ==========================================
# 查找应用进程ID(排除grep自身进程,避免误匹配)
PID=$(ps aux | grep -w "${APP_NAME}" | grep -v grep | awk '{print $2}')
# 判断进程是否存在并执行停止
if [ -n "${PID}" ]; then
echo "正在停止应用 ${APP_NAME}(进程ID:${PID})..."
# 先尝试正常停止(给应用释放资源的时间)
kill "${PID}"
sleep 3
# 检查进程是否还存在
if ps -p "${PID}" > /dev/null 2>&1; then
echo "应用未正常退出,强制停止..."
kill -9 "${PID}"
sleep 1
# 再次确认是否停止成功
if ! ps -p "${PID}" > /dev/null 2>&1; then
echo "应用已强制停止!"
else
echo "错误:应用强制停止失败!"
exit 1
fi
else
echo "应用已正常停止!"
fi
else
echo "应用 ${APP_NAME} 未运行,无需停止!"
fi
bash
#授予权限
chmod +x /service/springboot-demo/start.sh
chmod +x /service/springboot-demo/stop.sh
#启动
./start.sh
#停止
./stop.sh
5.脚本说明
bash
#这两段如果路径或者jar包名变了需要修改
APP_NAME="springboot-demo-0.0.1-SNAPSHOT.jar" # JAR包名称
APP_PATH="/service/springboot-demo" # JAR包所在目录
#日志路径
/service/springboot-demo/logs/20260313-demo.log
bash
#这段如果jar包名变了需要修改
APP_NAME="springboot-demo-0.0.1-SNAPSHOT.jar" # JAR包名称
6.访问测试
bash
# 查询所有用户
http://localhost:8080/users
# 分页查询
http://localhost:8080/users/page?current=1&size=1
# 查询所有用户
http://192.168.140.130:8080/users
# 分页查询
http://192.168.140.130:8080/users/page?current=1&size=1