以下是润色后的文档内容:

使用 ApiTable 连接 SQLite

入门示例

创建数据表并插入数据

SQLite 是一种轻量级嵌入式数据库。使用 Navicat Premium 可以轻松创建 SQLite 数据库,数据库文件将保存在本地。

以下是一个创建表并插入数据的示例:

CREATE TABLE "student" (
  "id" integer NOT NULL,
  "name" text NOT NULL,
  "grade" text NOT NULL,
  PRIMARY KEY ("id")
);

INSERT INTO "student" VALUES (1, '沈', '一年级');

11.1.2. 整合 SQLite

在项目中整合 SQLite,首先需要添加以下依赖:

<!-- https://central.sonatype.com/artifact/com.litongjava/api-table -->
<dependency>
  <groupId>com.litongjava</groupId>
  <artifactId>api-table</artifactId>
  <version>${api-table.version}</version>
</dependency>

<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>druid</artifactId>
  <version>1.1.23</version>
</dependency>

<!-- sqlite-jdbc -->
<dependency>
  <groupId>org.xerial</groupId>
  <artifactId>sqlite-jdbc</artifactId>
  <version>3.7.2</version>
</dependency>

app.properties 配置文件中添加以下配置:

# SQLite 数据库配置
jdbc.driverClass=org.sqlite.JDBC
jdbc.url=jdbc:sqlite:D:/sqlite/student.db
jdbc.user=
jdbc.pswd=
jdbc.showSql=true
jdbc.validationQuery=select 1

配置类的创建

以下是配置 SQLite 数据源和 ActiveRecord 插件的示例代码:

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

import javax.sql.DataSource;

import com.alibaba.druid.pool.DruidDataSource;
import com.jfinal.template.Engine;
import com.jfinal.template.source.ClassPathSourceFactory;
import com.litongjava.db.activerecord.ActiveRecordPlugin;
import com.litongjava.db.activerecord.OrderedFieldContainerFactory;
import com.litongjava.db.activerecord.dialect.Sqlite3Dialect;
import com.litongjava.db.hikaricp.DsContainer;
import com.litongjava.jfinal.aop.annotation.AConfiguration;
import com.litongjava.jfinal.aop.annotation.AInitialization;
import com.litongjava.tio.boot.server.TioBootServer;
import com.litongjava.tio.utils.environment.EnvUtils;

import lombok.extern.slf4j.Slf4j;

@AConfiguration
@Slf4j
public class DbConfig {

  public DataSource dataSource() {
    String jdbcUrl = EnvUtils.get("jdbc.url");
    String jdbcUser = EnvUtils.get("jdbc.user");
    String jdbcPswd = EnvUtils.get("jdbc.pswd");
    String jdbcValidationQuery = EnvUtils.get("jdbc.validationQuery");
    log.info("jdbcUrl:{}", jdbcUrl);

    // 检查并创建 SQLite 数据库路径
    try {
      if (jdbcUrl != null && jdbcUrl.startsWith("jdbc:sqlite:")) {
        String dbPath = jdbcUrl.substring("jdbc:sqlite:".length());
        Path path = Paths.get(dbPath).getParent();
        if (path != null && !Files.exists(path)) {
          Files.createDirectories(path);
          log.info("已创建 SQLite 数据库目录: {}", path);
        }
      }
    } catch (IOException e) {
      log.error("创建 SQLite 数据库目录失败", e);
      throw new RuntimeException(e);
    }

    // 创建数据源
    DruidDataSource druidDataSource = new DruidDataSource();
    druidDataSource.setUrl(jdbcUrl);
    druidDataSource.setUsername(jdbcUser);
    druidDataSource.setPassword(jdbcPswd);
    druidDataSource.setValidationQuery(jdbcValidationQuery);

    // 保存数据源
    DsContainer.setDataSource(druidDataSource);

    // 关闭服务器时关闭数据源
    TioBootServer.me().addDestroyMethod(druidDataSource::close);
    return druidDataSource;
  }

  @AInitialization
  public void activeRecordPlugin() {
    boolean dev = EnvUtils.isDev();
    boolean jdbcShowSql = EnvUtils.getBoolean("jdbc.showSql", false);

    // 创建 ActiveRecord 插件
    ActiveRecordPlugin arp = new ActiveRecordPlugin(dataSource());
    arp.setDialect(new Sqlite3Dialect());
    arp.setContainerFactory(new OrderedFieldContainerFactory());
    arp.setShowSql(jdbcShowSql);

    if (dev) {
      arp.setDevMode(true);
    }

    // 配置模板引擎
    Engine engine = arp.getEngine();
    engine.setSourceFactory(new ClassPathSourceFactory());
    engine.setCompressorOn(' ');
    engine.setCompressorOn('\n');

    // 启动插件
    arp.start();

    // 关闭服务器时关闭插件
    TioBootServer.me().addDestroyMethod(arp::stop);
  }
}

启动类的创建

以下是启动类的示例代码:

import com.litongjava.hotswap.wrapper.tio.boot.TioApplicationWrapper;
import com.litongjava.jfinal.aop.annotation.AComponentScan;

@AComponentScan
public class TioBootSqlLiteApp {

  public static void main(String[] args) {
    long start = System.currentTimeMillis();
    TioApplicationWrapper.run(TioBootSqlLiteApp.class, args);
    long end = System.currentTimeMillis();
    System.out.println((end - start) + "ms");
  }
}

创建 Controller

以下是一个简单的 Controller,用于从数据库中检索数据并返回:

import java.util.List;

import com.litongjava.data.model.DbJsonBean;
import com.litongjava.data.services.DbJsonService;
import com.litongjava.jfinal.aop.annotation.AAutowired;
import com.litongjava.jfinal.plugin.activerecord.Record;
import com.litongjava.tio.http.server.annotation.RequestPath;

@RequestPath("/api")
public class TestController {

  @AAutowired
  private DbJsonService dbJsonService;

  @RequestPath("/list")
  public DbJsonBean<List<Record>> list() {
    return dbJsonService.listAll("student");
  }
}

访问测试

启动应用后,访问以下 URL 来测试数据库连接和数据查询功能:

测试代码可在 GitHub 上找到:

自动创建数据库和表

SQLite 会自动创建数据库文件,但不会创建不存在的目录。在上面的 DbConfig 类的 dataSource 方法中,已经包含了创建目录的逻辑。除此之外,我们还需要手动编写创建表的代码。

以下是一个示例代码,用于在数据库中自动创建表:

import java.net.URL;
import java.util.List;

import com.litongjava.db.activerecord.Db;
import com.litongjava.tio.utils.hutool.FileUtil;
import com.litongjava.tio.utils.hutool.ResourceUtil;

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class DbTables {

  public static void init() {
    String tableName = "tio_boot_admin_system_users";

    String sql = "SELECT name FROM sqlite_master WHERE type='table' AND name=?";
    List<String> tables = Db.queryListString(sql, tableName);
    if (tables.isEmpty()) {
      URL url = ResourceUtil.getResource("sql/tio_boot_admin_system_users.sql");
      StringBuilder stringBuilder = FileUtil.readURLAsString(url);
      int update = Db.update(stringBuilder.toString());
      log.info("已创建表: {}, 影响行数: {}", tableName, update);
    }
  }
}

tio_boot_admin_system_users.sql 文件是实际执行的 SQL 文件,用于创建所需的数据库表。