课程概述

从零开始搭建一个完整的 Java 后端项目,包含数据库操作、RESTful API、前端页面和打包部署。全程不依赖任何框架,只使用 JDK 内置 API。

课程目录

  1. 环境配置
  2. 项目结构
  3. 类与对象
  4. 集合与业务逻辑
  5. 数据库操作
  6. 控制台交互
  7. HTTP API
  8. 前端页面
  9. 打包部署

1. 环境配置

  • JDK 17 (Amazon Corretto 17.0.19 LTS)
  • VS Code + Extension Pack for Java
  • 配置 settings.json 指定 JDK 路径和第三方库

2. 项目结构

Java 项目采用 Maven 标准目录布局,以下是最终的项目结构:

java-project/
├── lib/                              # 第三方 jar 包
│   ├── sqlite-jdbc-3.45.3.0.jar      # SQLite 数据库驱动
│   ├── json-20231013.jar             # JSON 解析库
│   └── slf4j-*.jar                   # 日志库
├── src/main/java/com/example/
│   ├── Main.java                     # 控制台交互入口
│   ├── user/
│   │   ├── User.java                 # 用户实体类
│   │   ├── UserRepository.java       # 数据库操作层
│   │   └── DatabaseUtil.java         # 数据库连接工具
│   └── server/
│       ├── ApiServer.java            # HTTP 服务入口
│       ├── UserController.java       # 用户 CRUD API
│       ├── LoginController.java      # 登录 API
│       └── StaticFileHandler.java    # 静态文件托管
├── src/main/resources/static/
│   └── index.html                    # 前端页面
├── build/                            # 编译产物
├── user-management.jar               # 可独立运行的 jar 包
┌── MANIFEST.MF                       # jar 清单文件
└── .vscode/settings.json             # VS Code 配置

包名规范

  • 包名 = 域名反写,如 com.example.user
  • 目录结构 = 包名对应路径
  • src/main/java — Java 源代码
  • src/main/resources — 配置文件/静态资源

3. 类与对象

public class User {
    private int id;              // private 封装
    private String username;
    private String password;
    private String email;

    public User() {}              // 无参构造

    public User(int id, String username, String password, String email) {
        this.id = id;             // this 指向当前实例
        this.username = username;
    }

    public int getId() { return id; }          // Getter
    public void setId(int id) { this.id = id; } // Setter
}

核心概念:

  • package — 声明包名,必须与目录路径一致
  • public class — 类名与文件名一致
  • private 字段 + public getter/setter = 封装
  • this — 指向当前对象实例

4. 集合与业务逻辑

第一阶段使用 ArrayList 在内存中模拟数据库,实现增删改查:

public class UserRepository {
    private List<User> users = new ArrayList<>();

    public User addUser(...)              // 新增
    public List<User> findAll()           // 查询所有
    public User findById(int id)          // 根据 ID 查询
    public boolean updateUser(...)        // 修改
    public boolean deleteById(int id)     // 删除
    public User login(String, String)     // 登录鉴权
}

5. 数据库操作

使用 SQLite + JDBC — 轻量级嵌入式数据库,无需安装服务端。

DatabaseUtil

public class DatabaseUtil {
    private static final String URL = "jdbc:sqlite:user.db";

    public static Connection getConnection() throws Exception {
        Class.forName("org.sqlite.JDBC");
        return DriverManager.getConnection(URL);
    }

    public static void initDatabase() {
        // CREATE TABLE IF NOT EXISTS users (...)
    }
}

PreparedStatement — 防 SQL 注入

String sql = "INSERT INTO users (username, password, email) VALUES (?, ?, ?)";
PreparedStatement stmt = conn.prepareStatement(sql);
stmt.setString(1, username);  // 参数化查询
stmt.setString(2, password);
stmt.executeUpdate();

try-with-resources

try (Connection conn = getConnection();
     PreparedStatement stmt = conn.prepareStatement(sql)) {
    // 使用后自动关闭 conn 和 stmt
}

6. 控制台交互

使用 Scanner 实现菜单循环:

Scanner scanner = new Scanner(System.in);
while (true) {
    System.out.println("1. 添加用户  2. 查看所有  ...  0. 退出");
    int choice = scanner.nextInt();
    scanner.nextLine();
    switch (choice) {
        case 1: addUser(repo, scanner); break;
        // ...
    }
}

7. HTTP API

使用 JDK 内置 HttpServer,无需任何框架:

HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0);
server.createContext("/api/users", new UserController());
server.createContext("/api/login", new LoginController());
server.start();

RESTful 接口列表

方法路径功能
GET/api/users获取所有用户
GET/api/users/{id}获取单个用户
POST/api/users新增用户
PUT/api/users/{id}修改用户
DELETE/api/users/{id}删除用户
POST/api/login用户登录

JsonUtil — JSON 数据交换

// 解析请求
String body = readBody(exchange);
JSONObject json = new JSONObject(body);
String username = json.getString("username");

// 返回 JSON
JSONObject obj = new JSONObject();
obj.put("id", user.getId());
obj.put("username", user.getUsername());
return obj.toString();

8. 前端页面

纯 HTML + CSS + JavaScript,通过 fetch API 调用后端:

const API = "/api";

async function loadUsers() {
    const res = await fetch(API + "/users");
    const users = await res.json();
    // 渲染表格
}

async function addUser() {
    const res = await fetch(API + "/users", {
        method: "POST",
        headers: { "Content-Type": "application/json" },
        body: JSON.stringify({ username, password, email })
    });
}

9. 打包部署

打包为 jar

# 编译
javac -cp "lib/*" -d build src/main/java/com/example/**/*.java

# 复制静态资源
cp -r src/main/resources/static build/static

# 打包
jar -cfm user-management.jar MANIFEST.MF -C build .

MANIFEST.MF

Manifest-Version: 1.0
Main-Class: com.example.server.ApiServer
Class-Path: lib/sqlite-jdbc-3.45.3.0.jar lib/json-20231013.jar ...

服务器部署

# 本地运行
java -jar user-management.jar

# 服务器部署
scp user-management.jar root@server:/app/
scp -r lib root@server:/app/
ssh root@server "java -jar /app/user-management.jar &"

课程路线图

环境配置 (JDK 17 + VS Code)
    ↓
Java 基础 (类、对象、封装)
    ↓
内存存储版用户管理 (ArrayList)
    ↓
SQLite 数据库持久化 (JDBC)
    ↓
控制台交互菜单 (Scanner)
    ↓
RESTful HTTP API (HttpServer)
    ↓
前端页面 (HTML + fetch API)
    ↓
打包部署 (jar 包 → 服务器)

课程成果

完成本课程后,你已具备以下能力:

  • Java 环境配置与开发工具使用
  • 面向对象编程(类、封装、构造方法)
  • 集合框架与业务逻辑实现
  • SQLite 数据库 + JDBC 操作(增删改查)
  • RESTful API 设计(GET/POST/PUT/DELETE)
  • JSON 数据交换
  • 前后端分离开发
  • 项目打包与服务器部署
  • 不依赖任何框架,纯 JDK 内置 API