Database wrapper to help with connection creation and use of MyBatis, published as a GitHub package.
- Node.js (Please see
.nvmrc
for specific version) -
npm
(If using n or nvm, this will be automatically managed) - Security
- Git secrets
-
ScanRepo
- Unzip
repo-security-scanner_<version>_Darwin_<architercture>.tar.gz
and rename the executable inside the folder toscanrepo
- Add executable to path (usingecho $PATH
to find your path)
- Unzip
-
npm install
(ornpm i
)
If wishing to add new top level directories to the output, then they must be included in the files
array inside package.json
as well as included in the clean:temp
command.
In order to see the output of what will be published, run the following command:
npm publish --dry-run
There are two ways in which this package can/should be published:
- Upon merge into
main
branch, the package will be published via a GHA workflow.
MyBatisSession
is a utility class that integrates MyBatis mapping with MySQL, allowing for structured and efficient query execution. It supports query execution, result transformation, and silent error handling while providing debugging capabilities.
import { MyBatisSession } from "@dvsa/database-helpers";
import { createConnection } from "mysql2/promise";
To use MyBatis, you need a MySQL connection, a namespace, and mapper files.
async function initializeSession() {
const connection = await createConnection({
host: "localhost",
user: "root",
password: "password",
database: "test_db",
});
const session = new MyBatisSession(connection, "UserNamespace", ["./mappers/user.xml"], true);
return session;
}
async function fetchUsers() {
const session = await initializeSession();
const users = await session.query("getUsers", {});
console.log("Users:", users);
await session.end();
}
fetchUsers();
class User {
id!: number;
name!: string;
}
async function getUserById(id: number) {
const session = await initializeSession();
const user = await session.selectOne("getUserById", { id }, User);
console.log("User:", user);
await session.end();
}
getUserById(1);
async function getAllUsers() {
const session = await initializeSession();
const users = await session.selectList("getAllUsers", {}, User);
console.log("Users:", users);
await session.end();
}
getAllUsers();
If you want to execute a query and return an empty array on failure, use selectAndCatchSilently
.
async function getUsersSafely() {
const session = await initializeSession();
const users = await session.selectAndCatchSilently("getAllUsers", {}, User);
console.log("Users:", users);
await session.end();
}
getUsersSafely();
async function closeSession() {
const session = await initializeSession();
await session.end();
}
If debugMode
is enabled (true
), queries will be logged before execution.
*** Query for namespace: UserNamespace & mapperID: getUsers ***
SELECT * FROM users;
***
Errors will be thrown if:
- A query fails due to an invalid SQL statement or missing parameters.
- A MyBatis mapper file is incorrect.
- The MySQL connection is unavailable.
Using selectAndCatchSilently
, errors will be logged but return an empty array.
try {
const result = await session.query("invalidQuery", {});
} catch (error) {
console.error("Error executing query:", error);
}