1 前言
mysql2
是一个用于 Node.js 的 MySQL 客户端库,它提供了更快、更灵活的 MySQL 连接和查询功能。mysql2
是 mysql
库的升级版,保持了与 mysql
库的兼容性,并且提供了更多的特性和更好的性能。它是为了改善 mysql
模块的性能和错误处理而创建的,同时为开发者提供了更多的 API 选择。
1.1 特性与优势
- 性能改进
mysql2
使用了更高效的二进制协议,支持更高效的查询和数据传输。
- 由于采用了优化的 C++ 代码,
mysql2
在执行某些操作时比 mysql
更快。
- Promise 支持
mysql2
支持 Promise API,这使得它与现代 JavaScript 的 async/await 风格兼容。你可以使用 async/await
来处理异步操作,代码更加简洁易读。
- 预处理语句
- 支持预处理语句(Prepared Statements),可以防止 SQL 注入攻击,并提升性能,尤其是执行多次相同查询时。
- 支持 MySQL 和 MariaDB
mysql2
不仅支持 MySQL 服务器,也支持 MariaDB,因此对于两者都能兼容工作。
- 支持连接池
mysql2
提供了连接池功能,可以有效管理连接,避免创建新连接时的性能开销,适用于高并发应用。
- 流式查询(Streaming Queries)
mysql2
支持流式查询,可以在获取大量数据时提高性能,尤其是需要处理大量结果集的情况。
- 完整的字符集支持
- 支持多种字符集和排序规则,可以处理不同语言的数据。
2 安装
npm install mysql2
3 数据库

4 实例化配置
import mysql from 'mysql2/promise';
const pool = mysql.createPool({
host: '127.0.0.1',
user: 'root',
password: 'root',
database: 'cs_template',
waitForConnections: true,
connectionLimit: 10,
queueLimit: 0,
});
export default pool;
5 增删改查
5.1 单条数据查询
src/controller/MySqlController.ts
import { Request, Response } from 'express';
import { Route } from '../utils/route.decorator';
import ResponseUtil from "../utils/ResponseUtil";
import pool from '../db_client/mysql';
export class MySqlController {
@Route('get', '/getNoticeById/:id')
async getNoticeById(req: Request, res: Response) {
const { id } = req.params;
try {
const sql = 'SELECT * FROM notice WHERE n_id = ?';
const [ rows ] = await pool.execute(sql, [ id ]);
res.json({ message: '查询成功', user: rows });
} catch (err) {
console.error('查询用户数据失败:', err);
res.status(500).json({ message: '服务器错误' });
}
}
}

5.2 批量查询
@Route('get', '/findNoticeAll')
async mysqlTest(req: Request, res: Response) {
const user_id = 1;
let data = {};
try {
const sql = 'SELECT * FROM notice';
const [ rows ] = await pool.execute(sql);
res.json({ message: '查询成功', users: rows });
} catch (err) {
console.error('查询所有用户失败:', err);
res.status(500).json({ message: '服务器错误' });
}
}

5.3 插入数据
const sql = 'INSERT INTO users (name, age) VALUES (?, ?)';
const [result] = await pool.execute(sql, [name, age]);
5.4 更新数据
const sql = 'UPDATE users SET name = ?, age = ? WHERE id = ?';
const [result] = await pool.execute(sql, [name, age, id]);
<h2><a id="1__0"></a>1 前言</h2>
<p><code>mysql2</code> 是一个用于 Node.js 的 MySQL 客户端库,它提供了更快、更灵活的 MySQL 连接和查询功能。<code>mysql2</code> 是 <code>mysql</code> 库的升级版,保持了与 <code>mysql</code> 库的兼容性,并且提供了更多的特性和更好的性能。它是为了改善 <code>mysql</code> 模块的性能和错误处理而创建的,同时为开发者提供了更多的 API 选择。</p>
<h3><a id="11__4"></a>1.1 特性与优势</h3>
<ol>
<li><strong>性能改进</strong>
<ul>
<li><code>mysql2</code> 使用了更高效的二进制协议,支持更高效的查询和数据传输。</li>
<li>由于采用了优化的 C++ 代码,<code>mysql2</code> 在执行某些操作时比 <code>mysql</code> 更快。</li>
</ul>
</li>
<li><strong>Promise 支持</strong>
<ul>
<li><code>mysql2</code> 支持 Promise API,这使得它与现代 JavaScript 的 async/await 风格兼容。你可以使用 <code>async/await</code> 来处理异步操作,代码更加简洁易读。</li>
</ul>
</li>
<li><strong>预处理语句</strong>
<ul>
<li>支持预处理语句(Prepared Statements),可以防止 SQL 注入攻击,并提升性能,尤其是执行多次相同查询时。</li>
</ul>
</li>
<li><strong>支持 MySQL 和 MariaDB</strong>
<ul>
<li><code>mysql2</code> 不仅支持 MySQL 服务器,也支持 MariaDB,因此对于两者都能兼容工作。</li>
</ul>
</li>
<li><strong>支持连接池</strong>
<ul>
<li><code>mysql2</code> 提供了连接池功能,可以有效管理连接,避免创建新连接时的性能开销,适用于高并发应用。</li>
</ul>
</li>
<li><strong>流式查询(Streaming Queries)</strong>
<ul>
<li><code>mysql2</code> 支持流式查询,可以在获取大量数据时提高性能,尤其是需要处理大量结果集的情况。</li>
</ul>
</li>
<li><strong>完整的字符集支持</strong>
<ul>
<li>支持多种字符集和排序规则,可以处理不同语言的数据。</li>
</ul>
</li>
</ol>
<h2><a id="2__22"></a>2 安装</h2>
<pre><div class="hljs"><code class="lang-shell">npm install mysql2
</code></div></pre>
<h2><a id="3__28"></a>3 数据库</h2>
<p><img src="https://static.couragesteak.com/article/6e2ad61d7baafab4aa5ec84cafa2a7b9.png" alt="image.png" /></p>
<h2><a id="4__32"></a>4 实例化配置</h2>
<pre><div class="hljs"><code class="lang-tsx"><span class="hljs-keyword">import</span> mysql <span class="hljs-keyword">from</span> <span class="hljs-string">'mysql2/promise'</span>;
<span class="hljs-comment">// 创建 MySQL 数据库连接池</span>
<span class="hljs-keyword">const</span> pool = mysql.<span class="hljs-title function_">createPool</span>({
<span class="hljs-attr">host</span>: <span class="hljs-string">'127.0.0.1'</span>, <span class="hljs-comment">// MySQL 服务器地址</span>
<span class="hljs-attr">user</span>: <span class="hljs-string">'root'</span>, <span class="hljs-comment">// 数据库用户名</span>
<span class="hljs-attr">password</span>: <span class="hljs-string">'root'</span>,<span class="hljs-comment">// 数据库密码</span>
<span class="hljs-attr">database</span>: <span class="hljs-string">'cs_template'</span>, <span class="hljs-comment">// 数据库名称</span>
<span class="hljs-attr">waitForConnections</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">connectionLimit</span>: <span class="hljs-number">10</span>,
<span class="hljs-attr">queueLimit</span>: <span class="hljs-number">0</span>,
});
<span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> pool;
</code></div></pre>
<h2><a id="5__51"></a>5 增删改查</h2>
<h3><a id="51__53"></a>5.1 单条数据查询</h3>
<p><code>src/controller/MySqlController.ts</code></p>
<pre><div class="hljs"><code class="lang-tsx"><span class="hljs-keyword">import</span> { <span class="hljs-title class_">Request</span>, <span class="hljs-title class_">Response</span> } <span class="hljs-keyword">from</span> <span class="hljs-string">'express'</span>;
<span class="hljs-keyword">import</span> { <span class="hljs-title class_">Route</span> } <span class="hljs-keyword">from</span> <span class="hljs-string">'../utils/route.decorator'</span>;
<span class="hljs-keyword">import</span> <span class="hljs-title class_">ResponseUtil</span> <span class="hljs-keyword">from</span> <span class="hljs-string">"../utils/ResponseUtil"</span>;
<span class="hljs-keyword">import</span> pool <span class="hljs-keyword">from</span> <span class="hljs-string">'../db_client/mysql'</span>;
<span class="hljs-keyword">export</span> <span class="hljs-keyword">class</span> <span class="hljs-title class_">MySqlController</span> {
<span class="hljs-comment">// 根据id查询公告</span>
<span class="hljs-comment">// http://127.0.0.1:3000/api/v1//getNoticeById/1</span>
<span class="hljs-meta">@Route</span>(<span class="hljs-string">'get'</span>, <span class="hljs-string">'/getNoticeById/:id'</span>)
<span class="hljs-keyword">async</span> <span class="hljs-title function_">getNoticeById</span>(<span class="hljs-params">req: Request, res: Response</span>) {
<span class="hljs-keyword">const</span> { id } = req.<span class="hljs-property">params</span>;
<span class="hljs-keyword">try</span> {
<span class="hljs-keyword">const</span> sql = <span class="hljs-string">'SELECT * FROM notice WHERE n_id = ?'</span>;
<span class="hljs-keyword">const</span> [ rows ] = <span class="hljs-keyword">await</span> pool.<span class="hljs-title function_">execute</span>(sql, [ id ]);
res.<span class="hljs-title function_">json</span>({ <span class="hljs-attr">message</span>: <span class="hljs-string">'查询成功'</span>, <span class="hljs-attr">user</span>: rows });
} <span class="hljs-keyword">catch</span> (err) {
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">error</span>(<span class="hljs-string">'查询用户数据失败:'</span>, err);
res.<span class="hljs-title function_">status</span>(<span class="hljs-number">500</span>).<span class="hljs-title function_">json</span>({ <span class="hljs-attr">message</span>: <span class="hljs-string">'服务器错误'</span> });
}
}
}
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/8a1883433efec15dd44dd535727348f6.png" alt="image.png" /></p>
<h3><a id="52__85"></a>5.2 批量查询</h3>
<pre><div class="hljs"><code class="lang-tsx"><span class="hljs-comment">// 查询所有公告</span>
<span class="hljs-comment">// http://127.0.0.1:3000/api/v1/findNoticeAll</span>
<span class="hljs-meta">@Route</span>(<span class="hljs-string">'get'</span>, <span class="hljs-string">'/findNoticeAll'</span>)
<span class="hljs-keyword">async</span> <span class="hljs-title function_">mysqlTest</span>(<span class="hljs-params">req: Request, res: Response</span>) {
<span class="hljs-keyword">const</span> user_id = <span class="hljs-number">1</span>;
<span class="hljs-keyword">let</span> data = {};
<span class="hljs-keyword">try</span> {
<span class="hljs-keyword">const</span> sql = <span class="hljs-string">'SELECT * FROM notice'</span>;
<span class="hljs-keyword">const</span> [ rows ] = <span class="hljs-keyword">await</span> pool.<span class="hljs-title function_">execute</span>(sql);
res.<span class="hljs-title function_">json</span>({ <span class="hljs-attr">message</span>: <span class="hljs-string">'查询成功'</span>, <span class="hljs-attr">users</span>: rows });
} <span class="hljs-keyword">catch</span> (err) {
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">error</span>(<span class="hljs-string">'查询所有用户失败:'</span>, err);
res.<span class="hljs-title function_">status</span>(<span class="hljs-number">500</span>).<span class="hljs-title function_">json</span>({ <span class="hljs-attr">message</span>: <span class="hljs-string">'服务器错误'</span> });
}
}
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/9b790cc508a858f42c63e90c6a2e0e3e.png" alt="image.png" /></p>
<h3><a id="53__111"></a>5.3 插入数据</h3>
<pre><div class="hljs"><code class="lang-tsx"><span class="hljs-keyword">const</span> sql = <span class="hljs-string">'INSERT INTO users (name, age) VALUES (?, ?)'</span>;
<span class="hljs-keyword">const</span> [result] = <span class="hljs-keyword">await</span> pool.<span class="hljs-title function_">execute</span>(sql, [name, age]);
</code></div></pre>
<h3><a id="54__118"></a>5.4 更新数据</h3>
<pre><div class="hljs"><code class="lang-tsx"><span class="hljs-comment">// 使用 UPDATE SQL 语句更新用户数据</span>
<span class="hljs-keyword">const</span> sql = <span class="hljs-string">'UPDATE users SET name = ?, age = ? WHERE id = ?'</span>;
<span class="hljs-keyword">const</span> [result] = <span class="hljs-keyword">await</span> pool.<span class="hljs-title function_">execute</span>(sql, [name, age, id]);
</code></div></pre>
留言