快速开始

本指南将帮助你在 5 分钟内快速上手 Unabo 框架。

环境要求

  • JDK 8 或更高版本
  • Maven 或 Gradle
  • 数据库驱动(根据需要选择)

添加依赖

Maven

<dependency>
    <groupId>online.sanen</groupId>
    <artifactId>unabo</artifactId>
    <version>1.2.4</version>
</dependency>

<!-- 数据库驱动(根据需要选择) -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.33</version>
</dependency>

<!-- 连接池(可选) -->
<dependency>
    <groupId>com.zaxxer</groupId>
    <artifactId>HikariCP</artifactId>
    <version>4.0.3</version>
</dependency>

Gradle

implementation 'online.sanen:unabo:1.2.4'

// 数据库驱动
implementation 'mysql:mysql-connector-java:8.0.33'

// 连接池(可选)
implementation 'com.zaxxer:HikariCP:4.0.3'

创建 Bootstrap 实例

Bootstrap 是 Unabo 的入口类,所有数据库操作都通过它进行。

方式一:使用 SQLite(最简单)

import online.sanen.unabo.api.Bootstrap;
import online.sanen.unabo.api.structure.enums.DriverOption;
import online.sanen.unabo.sql.factory.Unabo;

public class QuickStart {
    public static void main(String[] args) {
        // 创建 Bootstrap 实例
        Bootstrap bootstrap = Unabo.load(configuration -> {
            configuration.setUrl("jdbc:sqlite:test.db");
            configuration.setDriverOption(DriverOption.SQLITE);
        });

        // 打印所有表名
        System.out.println("Tables: " + bootstrap.dataInformation().getTablesAndViews());

        // 关闭连接
        bootstrap.close();
    }
}

方式二:使用 MySQL

import online.sanen.unabo.api.Bootstrap;
import online.sanen.unabo.api.structure.enums.DriverOption;
import online.sanen.unabo.api.structure.enums.DatasourceType;
import online.sanen.unabo.sql.factory.Unabo;

public class QuickStart {
    public static void main(String[] args) {
        // 创建 Bootstrap 实例
        Bootstrap bootstrap = Unabo.load("mysql", configuration -> {
            configuration.setUrl("jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC");
            configuration.setDriverOption(DriverOption.MYSQL_CJ);
            configuration.setUsername("root");
            configuration.setPassword("password");
            configuration.setDatasourceType(Configuration.DatasourceType.HikariCP);
        });

        // 使用 Bootstrap 进行数据库操作
        // ...

        // 关闭连接
        bootstrap.close();
    }
}

方式三:使用 try-with-resources(推荐)

import online.sanen.unabo.api.Bootstrap;
import online.sanen.unabo.api.structure.enums.DriverOption;
import online.sanen.unabo.sql.factory.Unabo;

public class QuickStart {
    public static void main(String[] args) {
        // 使用 try-with-resources 自动关闭连接
        try (Bootstrap bootstrap = Unabo.load(configuration -> {
            configuration.setUrl("jdbc:sqlite:test.db");
            configuration.setDriverOption(DriverOption.SQLITE);
        })) {
            // 数据库操作
            // ...
        } // 自动调用 bootstrap.close()
    }
}

TIP

建议在生产环境中使用 try-with-resources 方式,确保资源正确释放。

创建表

使用 Map 创建表

import java.util.HashMap;
import java.util.Map;

// 准备表结构
Map<String, Object> userSchema = new HashMap<>();
userSchema.put("id", 1);
userSchema.put("name", "张三");
userSchema.put("age", 18);

// 创建表
bootstrap.queryMap("user", userSchema)
    .setPrimary("id")  // 设置主键
    .create();

// 控制台输出:
// CREATE TABLE `user` (`age` integer,`name` text ,`id` integer NOT NULL AUTO_INCREMENT,PRIMARY KEY (`id`))

使用实体类创建表

import online.sanen.unabo.template.jpa.Table;
import online.sanen.unabo.template.jpa.Id;
import lombok.Data;

@Data
@Table(name = "user")
public class User {
    @Id
    private Integer id;
    private String name;
    private Integer age;
}

// 创建表
bootstrap.query(new User()).createTable();

插入数据

插入单条记录

// 使用 Map
Map<String, Object> user = new HashMap<>();
user.put("name", "李四");
user.put("age", 20);

bootstrap.queryMap("user", user).insert();

// 使用实体类
User user = new User();
user.setName("王五");
user.setAge(22);

bootstrap.query(user).insert();

批量插入

// 批量插入 Map
List<Map<String, Object>> users = new ArrayList<>();
for (int i = 0; i < 100; i++) {
    Map<String, Object> user = new HashMap<>();
    user.put("name", "用户" + i);
    user.put("age", 18 + i % 30);
    users.add(user);
}

bootstrap.queryMap("user", users).insert();

// 批量插入实体
List<User> users = new ArrayList<>();
for (int i = 0; i < 100; i++) {
    User user = new User();
    user.setName("用户" + i);
    user.setAge(18 + i % 30);
    users.add(user);
}

bootstrap.query(users).insert();

TIP

批量操作性能远高于循环单次操作,建议在插入大量数据时使用批量插入。

查询数据

查询所有记录

// 返回 Map 列表
List<Map<String, Object>> users = bootstrap.queryTable("user").maps();

// 返回实体列表
List<User> users = bootstrap.queryTable("user").list(User.class);

条件查询

import online.sanen.unabo.api.condition.C;

// 查询单条记录
Optional<Map<String, Object>> user = bootstrap.queryTable("user")
    .addCondition(C.eq("id", 1))
    .unique();

// 多条件查询
List<User> users = bootstrap.queryTable("user")
    .addCondition(C.gt("age", 20))
    .addCondition(C.like("name", "张%"))
    .sort(Sorts.DESC, "id")
    .list(User.class);

分页查询

import com.mhdt.structure.Page;

int currentPage = 1;
int pageSize = 10;

Page page = new Page(currentPage, pageSize);
int total = bootstrap.queryTable("user").count();
page.setCount(total);

List<User> users = bootstrap.queryTable("user")
    .limit(page.skip(), pageSize)
    .sort(Sorts.DESC, "id")
    .list(User.class);

更新数据

// 先查询
Optional<User> optional = bootstrap.queryTable("user")
    .addCondition(C.eq("id", 1))
    .unique(User.class);

if (optional.isPresent()) {
    User user = optional.get();
    user.setName("张三丰");
    user.setAge(30);

    // 更新指定字段
    bootstrap.query(user)
        .setFields("name", "age")
        .update();
}

删除数据

// 根据条件删除
bootstrap.queryTable("user")
    .addCondition(C.eq("id", 1))
    .delete();

// 批量删除
bootstrap.queryTable("user")
    .addCondition(C.lt("age", 18))
    .delete();

完整示例

import online.sanen.unabo.api.Bootstrap;
import online.sanen.unabo.api.condition.C;
import online.sanen.unabo.api.structure.enums.DriverOption;
import online.sanen.unabo.api.structure.enums.Sorts;
import online.sanen.unabo.sql.factory.Unabo;
import java.util.*;

public class CompleteExample {
    public static void main(String[] args) {
        // 1. 创建 Bootstrap
        try (Bootstrap bootstrap = Unabo.load(configuration -> {
            configuration.setUrl("jdbc:sqlite:demo.db");
            configuration.setDriverOption(DriverOption.SQLITE);
            configuration.setIsShowSql(true);  // 显示 SQL
        })) {

            // 2. 创建表
            Map<String, Object> schema = new HashMap<>();
            schema.put("id", 1);
            schema.put("name", "");
            schema.put("age", 0);
            bootstrap.queryMap("user", schema).setPrimary("id").create();

            // 3. 插入数据
            Map<String, Object> user = new HashMap<>();
            user.put("name", "张三");
            user.put("age", 25);
            bootstrap.queryMap("user", user).insert();

            // 4. 查询数据
            List<Map<String, Object>> users = bootstrap.queryTable("user")
                .addCondition(C.gt("age", 20))
                .sort(Sorts.DESC, "id")
                .maps();

            System.out.println("用户列表: " + users);

            // 5. 更新数据
            bootstrap.queryTable("user")
                .addCondition(C.eq("name", "张三"))
                .update(Collections.singletonMap("age", 26));

            // 6. 删除数据
            bootstrap.queryTable("user")
                .addCondition(C.eq("name", "张三"))
                .delete();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

下一步

常见问题

Q: 如何关闭 SQL 日志?

A: 设置 configuration.setIsShowSql(false)

Q: 如何连接到其他数据库?

A: 修改 DriverOption 和连接 URL,支持 MySQL、PostgreSQL、Oracle、SQL Server 等

Q: 如何处理事务?

A: 参考 事务管理 文档

Q: 支持 MongoDB 吗?

A: 支持!使用 Unabo.nosql.load() 创建 MongoDB 实例,参考 MongoDB 操作 文档

获取帮助