MySql數據庫在NodeJS中簡單的基本操作


閱讀目錄

一:連接數據庫

const mysql = require('mysql');
/*
 createConnection方法創建一個表示與Mysql數據庫服務器之間連接的 Connection對象
*/
const connection = mysql.createConnection({
  host: 'localhost',
  port: 3306,
  database: 'my_db',
  user: 'root',
  password: '123456'
});
/*
 connection 對象被創建之后,可以使用該對象的 connect方法建立mysql數據庫服務器之間的連接
*/
connection.connect((err) => {
  if (err) {
    console.log('數據庫連接失敗');
  } else {
    console.log('數據庫連接成功');
    /*
     在不需要使用該數據庫的時候,可以使用 Connection對象的end方法或destory方法關閉數據庫之間的連接
    */
    connection.end((err1) => {
      if (err1) {
        console.log('關閉數據庫操作失敗');
      } else {
        console.log('關閉數據庫操作成功');
      }
    })
  }
});

上面的代碼保存到 app.js, 然后在命令行中運行 node app.js 即可看到如下連接成功的信息,如下圖所示:

2.1 數據庫新增和查詢數據

 在mysql模塊中,可以通過Connection對象的query方法統一執行數據的增加、刪除、查詢和修改等基本處理。基本方法如下:

connection.query(sql, [parameters], [callback]);

sql參數:必填參數,該值為一個字符串,用於指定需要用來執行的SQL表達式。
parameters:可選參數,該值為一個數組或一個對象。用於存放sql參數值字符串中使用到的所有參數值。
callback: 該參數為一個函數,用於指定執行數據的增加、刪除、查詢及修改操作結束時所需執行的回調函數。

一般是如下方法:

function (err, res) {
  
}

err參數指操作結果的時候錯誤對象。
res參數值為一個對象,代表操作從執行結果。

為了防止SQL注入攻擊,需要使用Connection對象的escape方法對所有用戶輸入數據進行 escape編碼處理,該方法使用如下所示:

connection.escape(data);

下面我們來實現數據庫新增和查詢操作。在新增操作之前,我們來看下我們的 my_db數據庫中的User表中目前有哪些數據,如下所示:

下面是新增和查詢數據的代碼如下:

const mysql = require('mysql');
/*
 createConnection方法創建一個表示與Mysql數據庫服務器之間連接的 Connection對象
*/
const connection = mysql.createConnection({
  host: 'localhost',
  port: 3306,
  database: 'my_db',
  user: 'root',
  password: '123456'
});

/*
 connection 對象被創建之后,可以使用該對象的 connect方法建立mysql數據庫服務器之間的連接
*/
connection.connect((err) => {
  if (err) {
    console.log('數據庫連接失敗');
  } else {
    console.log('數據庫連接成功');
    // 執行sql新增數據操作
    connection.query('INSERT INTO User SET ?', {
      UserName: 'aaa',
      Password: '123456789'
    }, (err, res) => {
      if (err) {
        console.log(err);
        console.log('插入數據失敗');
      } else {
        console.log('插入數據成功,我接着再查詢一遍');
        connection.query('SELECT * FROM ??', ['User'], (err1, res) => {
          console.log(err1)
          if (err1) {
            console.log('查詢數據失敗');
          } else {
            console.log(res);
          }
        })
      }
    })
  }
});

然后我們執行結果可以看到打印如下信息:

注意:如果代碼中有這句代碼的話 connection.end(); 在查詢的時候會報錯,比如查詢有這句代碼的時候,如下代碼:

connection.query('SELECT * FROM ??', ['User'], (err1, res) => {
  console.log(err1)
  if (err1) {
    console.log('查詢數據失敗');
  } else {
    console.log(res);
    connection.end(); // 有這句代碼的時候,查詢的時候會報錯;需要把這句代碼刪除掉
  }
})

報錯信息是如下:Error: Cannot enqueue Query after invoking quit.

如下圖所示:

但是如果我們插入的數據是中文的話,也會報錯的,保存信息如下:

ER_TRUNCATED_WRONG_VALUE_FOR_FIELD: Incorrect string value

這是因為中文字符編碼的問題,具體解決辦法可以看這篇文章.

2.2 獲取該數據的主鍵值

在一個具有自增主鍵字段的數據表中插入一條數據后,我們可以在回調函數中使用 res參數值對象的 insertId屬性值獲取該數據的主鍵值。如下代碼所示:

const mysql = require('mysql');
/*
 createConnection方法創建一個表示與Mysql數據庫服務器之間連接的 Connection對象
*/
const connection = mysql.createConnection({
  host: 'localhost',
  port: 3306,
  database: 'new_my_db',
  user: 'root',
  password: '123456'
});

/*
 connection 對象被創建之后,可以使用該對象的 connect方法建立mysql數據庫服務器之間的連接
*/
connection.connect((err) => {
  if (err) {
    console.log(err);
    console.log('數據庫連接失敗');
  } else {
    console.log('數據庫連接成功');
    // 執行sql新增數據操作
    connection.query('INSERT INTO User SET ?', {
      UserName: '我是空智',
      Password: '123456789'
    }, (err, res) => {
      if (err) {
        console.log(err);
        console.log('插入數據失敗');
      } else {
        console.log('插入數據成功,我接着再查詢一遍');
        console.log('插入數據的ID值為 %d', res.insertId);
      }
    })
  }
});

如下圖所示:

2.3 多語句查詢

基於安全原因,在mysql模塊中,默認是禁止使用多語句查詢。因為如果我們開發者沒有對用戶輸入數據進行escape編碼處理的話,應用程序很有可能受到SQL注入攻擊。如果我們需要支持多語句查詢功能的話,可以將 createConnection方法所使用的options參數值對象中的multipleStatements屬性值設置為true即可。如下代碼所示:

var connection = mysql.createConnection({multipleStatements: true});

下面我們來做一個demo,首先我們向數據庫 new_my_db中table中同時插入三條數據,插入數據成功后修改第一條數據,修改完成后我們再刪除第三條數據,刪除數據成功后,我們再觸發查詢操作,查詢所有的數據。如下代碼所示:

const mysql = require('mysql');
/*
 createConnection方法創建一個表示與Mysql數據庫服務器之間連接的 Connection對象
*/
const connection = mysql.createConnection({
  host: 'localhost',
  port: 3306,
  database: 'new_my_db',
  user: 'root',
  password: '123456',
  multipleStatements: true
});

/*
 connection 對象被創建之后,可以使用該對象的 connect方法建立mysql數據庫服務器之間的連接
*/
connection.connect((err) => {
  if (err) {
    console.log(err);
    console.log('數據庫連接失敗');
  } else {
    console.log('數據庫連接成功');
    // 執行sql新增數據操作
    insertData();
  }
});
// 插入數據
function insertData() {
  var sqlStr = '';
  for (var i = 0; i < 3; i++) {
    sqlStr += "INSERT INTO " + 'User' + "(UserName, Password) \
    values("+ connection.escape(" 用戶名 " + i.toString())+", " +
    connection.escape(" 姓" + i.toString()) + ");";
    connection.query(sqlStr, (err, res) => {
      if (err) {
        console.log('插入數據失敗');
      } else {
        console.log('插入數據成功');
        updateData();
      }
    });
  }
}

// 更新數據
function updateData() {
  connection.query("update " + 'User' + " Set Password = ? where UserName=?", [" 姓100", '用戶名1'], (err, res) => {
    if (err) {
      console.log('更新數據失敗.');
    } else {
      console.log('更新數據成功');
      deleteData();
    }
  })
}

// 刪除數據
function deleteData() {
  connection.query("delete from " + 'User' + " where UserName=?", [' 用戶名2 '], (err, res) => {
    if (err) {
      console.log('刪除數據失敗');
    } else {
      console.log('刪除數據成功');
      // 查詢數據
      queryData();
    }
  });
}

// 查詢數據
function queryData() {
  connection.query("SELECT * FROM " + 'User', (err, res) => {
    if (err) {
      console.log('查詢數據失敗');
    } else {
      console.log('查詢數據成功');
      console.log(res);
    }
  });
}

如下圖所示:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM