A MySQL database connection implementation for the @ticatec/node-common-library
framework, providing connection pooling, transaction management, and async/await support.
中文文档 | English
- 🔄 Transaction Management: Full support for BEGIN, COMMIT, and ROLLBACK operations
- 🏊 Connection Pooling: Built-in MySQL connection pooling with mysql2
- ⚡ Async/Await Support: Promise-based API for modern JavaScript/TypeScript
- 🛡️ Type Safety: Full TypeScript support with proper type definitions
- 🔍 Query Operations: Support for SELECT, INSERT, UPDATE, DELETE operations
- 📊 Result Mapping: Automatic field mapping and camelCase conversion
- 🏗️ Extensible Design: Clean interface implementation following DBConnection pattern
npm install @ticatec/mysql-common-library
Make sure to install the required peer dependencies:
npm install mysql2 @ticatec/node-common-library
import { initializeMySQL } from '@ticatec/mysql-common-library';
const dbFactory = initializeMySQL({
host: 'localhost',
user: 'root',
password: 'your_password',
database: 'your_database',
port: 3306,
waitForConnections: true,
connectionLimit: 10,
queueLimit: 0
});
async function performDatabaseOperations() {
const connection = await dbFactory.createDBConnection();
try {
// Begin transaction
await connection.beginTransaction();
// Fetch data
const users = await connection.fetchData(
'SELECT * FROM users WHERE status = ?',
['active']
);
console.log('Active users:', users.rows);
// Insert record
await connection.insertRecord(
'INSERT INTO users (name, email, status) VALUES (?, ?, ?)',
['John Doe', 'john@example.com', 'active']
);
// Update record
const affectedRows = await connection.executeUpdate(
'UPDATE users SET last_login = NOW() WHERE email = ?',
['john@example.com']
);
console.log(`Updated ${affectedRows} rows`);
// Commit transaction
await connection.commit();
} catch (error) {
// Rollback on error
await connection.rollback();
console.error('Transaction failed:', error);
throw error;
} finally {
// Always close connection
await connection.close();
}
}
Creates a MySQL database factory with connection pooling.
Parameters:
config
: MySQL connection configuration object (mysql2 PoolOptions)
Returns: DBFactory
instance
Factory class that implements the DBFactory
interface.
createDBConnection(): Promise<DBConnection>
- Creates a new database connection from the pool
Database connection class that implements the DBConnection
interface.
beginTransaction(): Promise<void>
- Starts a database transactioncommit(): Promise<void>
- Commits the current transactionrollback(): Promise<void>
- Rolls back the current transactionclose(): Promise<void>
- Releases the connection back to the pool
fetchData(sql: string, params?: any[]): Promise<{rows: any[], fields: any[]}>
- Executes SELECT queriesexecuteUpdate(sql: string, params: any[]): Promise<number>
- Executes UPDATE/DELETE queries, returns affected row countinsertRecord(sql: string, params: any[]): Promise<any>
- Executes INSERT queriesupdateRecord(sql: string, params: any[]): Promise<any>
- Executes UPDATE queries with result datadeleteRecord(sql: string, params: any[]): Promise<number>
- Executes DELETE queries
getFields(result: any): Field[]
- Extracts field metadata from query resultsgetRowSet(result: any): any[]
- Extracts row data from query resultsgetAffectRows(result: any): number
- Gets the number of affected rowsgetFirstRow(result: any): any | null
- Gets the first row from query results
The config
parameter accepts all mysql2 PoolOptions. Common options include:
interface MySQLConfig {
host?: string; // Database host (default: 'localhost')
port?: number; // Database port (default: 3306)
user?: string; // Database username
password?: string; // Database password
database?: string; // Database name
connectionLimit?: number; // Maximum connections in pool (default: 10)
queueLimit?: number; // Maximum queued requests (default: 0)
acquireTimeout?: number; // Connection acquisition timeout (ms)
timeout?: number; // Query timeout (ms)
reconnect?: boolean; // Auto-reconnect on connection loss
ssl?: any; // SSL configuration
}
The library includes built-in error handling:
try {
const connection = await dbFactory.createDBConnection();
await connection.beginTransaction();
// Your database operations here
await connection.commit();
} catch (error) {
if (connection) {
await connection.rollback(); // Automatic rollback on error
}
console.error('Database operation failed:', error);
} finally {
if (connection) {
await connection.close(); // Always clean up connections
}
}
-
Insert/Update Return Values: The
insertRecord
andupdateRecord
methods currently callgetFirstRow()
, but INSERT/UPDATE operations typically don't return row data. Consider usingexecuteUpdate()
for these operations instead. -
Type Safety: Some internal methods use
any
types. Consider adding more specific type definitions for better type safety. -
Result Structure: The
getRowSet
andgetFirstRow
methods make assumptions about result structure that may not always match the actual mysql2 response format.
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature
) - Commit your changes (
git commit -m 'Add some amazing feature'
) - Push to the branch (
git push origin feature/amazing-feature
) - Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.
- 📧 Email: huili.f@gmail.com
- 🐛 Issues: GitHub Issues
- 📖 Documentation: GitHub Repository
- @ticatec/node-common-library - Core framework library
- mysql2 - MySQL client for Node.js