Node中使用Mysql

mysql2

在Node的代码中执行SQL语句借助于mysql2

  • 更快/更好的性能;
  • Prepared Statement(预编译语句):
    • 提高性能:将创建的语句模块发送给MySQL,然后MySQL编译(解析、优化、转换)语句模块,并且存储它但是不执行,之后我们在真正执行时会给?提供实际的参数才会执行;就算多次执行,也只会编译一次,所以性能是更高的;
    • 防止SQL注入:之后传入的值不会像模块引擎那样就编译,那么一些SQL注入的内容不会被执行;or 1 = 1不会被执行;

基本使用

  • 1.创建数据库连接
1
2
3
4
5
6
7
8

const connection =mysql2.createConnection({
host:'localhost',
port: 3306,
database: 'coderhub',
user: 'root',
password: 'coderhyp888.'
});
  • 2.执行sql语句
1
2
3
4
5
6
const statement = `
SELECT * FROM products;
`
connection.query(statement,(err,results,fields)=>{
console.log(results);
})

Prepared Statement 预编译语句

  • 提高性能:将创建的语句模块发送给MySQL,然后MySQL编译(解析、优化、转换)语句模块,并且存储它但是不执行,之后我们在真正执行时会给?提供实际的参数才会执行;就算多次执行,也只会编译一次,所以性能是更高的;
  • 防止SQL注入:之后传入的值不会像模块引擎那样就编译,那么一些SQL注入的内容不会被执行;or 1 = 1不会被执行;
  • 如果再次执行该语句,它将会从LRU(Least Recently Used) Cache中获取获取,省略了编译statement的时间来提高性能。

Connection Pools 连接池

  • 连接池可以在需要的时候自动创建连接,并且创建的连接不会被销毁,会放到连接池中,后续可以继续使用
  • 我们可以在创建连接池的时候设置LIMIT,也就是最大创建个数;
1
2
3
4
5
6
7
8
const connection =mysql2.createPool({
host:'localhost',
port: 3306,
database: 'coderhub',
user: 'root',
password: 'coderhyp888.',
connectionLimit: 10
});
1
2
3
4
5
6
7
//2 使用
const statement2= `
SELECT * FROM products WHERE price>? AND score > ?;
`
connection.execute(statement2,[6000,8],(err,result)=>{
console.log(result);
})

promise方式

1
2
3
4
5
6
7
8
const statement2= `
SELECT * FROM products WHERE price>? AND score > ?;
`
connection.promise().execute(statement2,[6000,8]).then(([result])=>{
console.log(result);
}).catch(err=>{
console.log(err);
})

ORM 对象关系映射

Node当中的ORM我们通常使用的是 sequelize;

  • Sequelize是用于Postgres,MySQL,MariaDB,SQLite和Microsoft SQL Server的基于Node.js 的 ORM
  • 它支持非常多的功能

Sequelize的使用

Sequelize的连接数据库:

  • 第一步:创建一个Sequelize的对象,并且指定数据库、用户名、密码、数据库类型、主机地址等;
  • 第二步:测试连接是否成功