Skip to content
steiner edited this page Nov 4, 2025 · 1 revision

这个项目该怎么设计

orm.png

1. 描述表结构

2. 数据表的操作

3. 查询操作

4. 复杂查询

5. 事务

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL,
    password VARCHAR(50) NOT NULL,
    email VARCHAR(100),
    age INT,
    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

我们首先要解决的问题,是如何去描述一个 表的结构
我们需要描述

  1. 表的字段
  2. 表的键,比如主键,外建,联合主键
  3. 表的限制,比如 check 限制

并通过 类型系统 ,为每种字段 规定 可以注入的数据,同时规定 从各种字段中 读取到的数据类型

我们 假想 有这样一个数据表对象 Users

class UsersTable extends IntIdTable("users") {
    public CharacterVaryingColumn name = characterVarying("username", 50);
    public CharacterVaryingColumn password = characterVarying("password", 50);
    public CharacterVaryingColumn email = characterVarying("email", 100).nullable();

    public IntColumn age = integer("age").nullable();
    public TimestampColumn createTime = timestamp("create_time");
}

获取其对象 Users 后,我们要对它进行数据插入操作(暂时先不考虑 事务 这个东西)

Users.insert(statement -> {
    statement.set(Users.name, "张三");
    statement.set(Users.password, "zhangsan123");
    statement.set(Users.email, "zhangsan@example.com");
    statement.set(Users.age, 25);
});

Users.insert(statement -> {
    statement.set(Users.name, "李四");
    statement.set(Users.password, "lisi456");
    statement.set(Users.email, "lisi@example.com");
    statement.set(Users.age, 30);
});

Users.insert(statement -> {
    statement.set(Users.name, "王五");
    statement.set(Users.password, "wangwu789");
    statement.set(Users.email, "wangwu@example.com");
    statement.set(Users.age, 28);
});

然后我们查看插入后的数据

Users.selectAll()
    .stream()
    .forEach(resultRow -> {
        for (Column<?> column: Users.columns) { // 遍历每一字段,打印
            System.out.println(resultRow.get(column));
        }
    });

设计目标

我们用以下步骤去实现这个项目

  1. 描述表的结构
    • 描述字段
    • 描述 键
    • 设置 默认值
  2. 查询数据
    • 字段选择
    • 查询子句
  3. 描述数据库的部分操作
    • 创建表
    • 修改表
    • 删除表
  4. 插入/修改 数据
    • 引入 事务
    • 插入 语句
    • 修改 语句

Clone this wiki locally