如何使用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
相关产品推荐
相关产品推荐

