You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用TypeScript ES6类与模块连接OracleDB?

可行的Oracle数据库连接TypeScript ES6类实现方案

当然有成熟的实现方式!结合你已经开始的代码结构,我来给你一套完整的、符合TypeScript规范的Oracle数据库连接类实现,同时适配Jasmine测试框架:

1. 完善ConnectionDAO类实现

首先我们补全类的核心方法,包括连接初始化、SQL执行、连接关闭,同时利用TypeScript的类型系统保证类型安全:

import * as oracledb from 'oracledb';

// 定义数据库连接配置类型
type DbConfig = {
  user: string;
  password: string;
  connectString: string; // 格式通常为 "host:port/service_name"
};

export class ConnectionDAO {
  // 明确类型定义,避免any
  private conn: oracledb.Connection | null = null;
  private result: oracledb.Result<any> | null = null;
  private readonly dbConfig: DbConfig;

  // 构造函数传入连接配置,增强灵活性
  constructor(config: DbConfig) {
    this.dbConfig = config;
  }

  /**
   * 初始化数据库连接
   */
  async connect(): Promise<void> {
    try {
      this.conn = await oracledb.getConnection(this.dbConfig);
      console.log('Oracle数据库连接成功');
    } catch (err) {
      console.error('连接失败:', err);
      throw err; // 抛出错误让调用方处理
    }
  }

  /**
   * 执行SQL查询
   * @param sql 要执行的SQL语句
   * @param binds 绑定参数(可选)
   */
  async executeQuery(sql: string, binds?: any[]): Promise<oracledb.Result<any>> {
    if (!this.conn) {
      throw new Error('请先调用connect()初始化连接');
    }

    try {
      this.result = await this.conn.execute(sql, binds, {
        outFormat: oracledb.OUT_FORMAT_OBJECT // 返回对象格式的结果,更易处理
      });
      return this.result;
    } catch (err) {
      console.error('SQL执行失败:', err);
      throw err;
    }
  }

  /**
   * 执行SQL更新(INSERT/UPDATE/DELETE)
   * @param sql 要执行的SQL语句
   * @param binds 绑定参数(可选)
   */
  async executeUpdate(sql: string, binds?: any[]): Promise<number> {
    if (!this.conn) {
      throw new Error('请先调用connect()初始化连接');
    }

    try {
      const result = await this.conn.execute(sql, binds, {
        autoCommit: true // 自动提交事务,根据业务需求调整
      });
      return result.rowsAffected || 0;
    } catch (err) {
      console.error('SQL更新失败:', err);
      throw err;
    }
  }

  /**
   * 关闭数据库连接
   */
  async close(): Promise<void> {
    if (this.conn) {
      try {
        await this.conn.close();
        this.conn = null;
        console.log('数据库连接已关闭');
      } catch (err) {
        console.error('关闭连接失败:', err);
        throw err;
      }
    }
  }
}

2. 使用示例

你可以在业务代码中这样使用这个类:

// 初始化连接配置
const dbConfig: DbConfig = {
  user: '你的用户名',
  password: '你的密码',
  connectString: 'localhost:1521/ORCL' // 根据你的Oracle实例调整
};

async function main() {
  const dao = new ConnectionDAO(dbConfig);
  try {
    await dao.connect();
    // 执行查询
    const queryResult = await dao.executeQuery('SELECT * FROM YOUR_TABLE WHERE ID = :id', [1]);
    console.log('查询结果:', queryResult.rows);
    // 执行更新
    const updateCount = await dao.executeUpdate('UPDATE YOUR_TABLE SET NAME = :name WHERE ID = :id', ['新名称', 1]);
    console.log('更新行数:', updateCount);
  } catch (err) {
    console.error('操作失败:', err);
  } finally {
    // 无论成功失败都关闭连接
    await dao.close();
  }
}

main();

3. Jasmine测试用例示例

针对这个类编写测试,验证连接、查询、关闭的核心功能:

import { ConnectionDAO } from './ConnectionDAO';

describe('ConnectionDAO', () => {
  let dao: ConnectionDAO;
  const testConfig = {
    user: '测试用户名',
    password: '测试密码',
    connectString: 'localhost:1521/ORCL'
  };

  beforeEach(() => {
    dao = new ConnectionDAO(testConfig);
  });

  afterEach(async () => {
    // 测试后确保连接关闭
    await dao.close();
  });

  it('应该成功建立数据库连接', async () => {
    await expectAsync(dao.connect()).toBeResolved();
  });

  it('执行查询应该返回有效结果', async () => {
    await dao.connect();
    const result = await dao.executeQuery('SELECT 1 AS TEST_COLUMN FROM DUAL');
    expect(result.rows.length).toBeGreaterThan(0);
    expect(result.rows[0].TEST_COLUMN).toBe(1);
  });

  it('未连接时执行查询应该抛出错误', async () => {
    await expectAsync(dao.executeQuery('SELECT * FROM DUAL')).toBeRejectedWithError('请先调用connect()初始化连接');
  });
});

注意事项

  • 连接池优化:如果你的应用需要频繁连接数据库,建议使用oracledb.createPool()来创建连接池,而不是每次创建单个连接,这样能提升性能和稳定性。
  • 事务处理:如果需要手动控制事务,可以使用this.conn.beginTransaction()、this.conn.commit()和this.conn.rollback()方法。
  • 类型安全:尽量避免使用any类型,你可以为查询结果定义具体的接口,比如interface YourTable { id: number; name: string; },然后在executeQuery中返回Promise<oracledb.Result<YourTable>>。

内容的提问来源于stack exchange,提问作者Murali

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:12:28