安装和配置

建议使用5.6或5.7版本的数据库

Express框架下的配置

安装mysql模块

npm install mysql --save

建议使用的版本为2.18.1

"mysql": "^2.18.1",

配置数据库连接

在项目的根目录下新建model文件夹,新建一个文件database.js文件,内容如下:

const mysql = require('mysql')

const db = mysql.createConnection({
  host: 'localhost',
  user: 'root',
  password: '123456',
  database: 'student_admin'
})

module.exports = db

封装数据库操作

在model文件夹下新建一个文件query.js,内容如下:

// 封装查询数据库的方法
function sqlQuery(sql, values, db) {
  return new Promise((resolve, reject) => {
    db.query(sql, values, (err, results, fields) => {
      if (err) reject(err)
      resolve(results)
    })
  })
}

module.exports = sqlQuery

其中sqlQuery方法接收三个参数,第一个参数为sql语句,第二个参数为sql语句中的占位符,第三个参数为数据库连接对象。 第二个参数可以以数组或者对象的形式传入,例如:

// 以数组的形式传入
sqlQuery('SELECT * FROM student WHERE id = ?', [1], db)
// 以对象的形式传入
sqlQuery('SELECT * FROM student WHERE id = :id', {id: 1}, db)

使用

在需要使用数据库的地方引入数据库连接对象和封装的方法

const db = require('../model/database')
const sqlQuery = require('../model/query')

然后就可以使用了

router.get('/student', async (req, res) => {
  const sql = 'SELECT * FROM student'
  const result = await sqlQuery(sql, [], db)
  res.json(result)
})

封装模糊查询

// 封装模糊查询的方法
function sqlQueryLike(searchObj) {
  let sql = ''
  for (let key in searchObj) {
    if (key !== 'class') {
      sql += ` AND ${key} LIKE '%${searchObj[key]}%'`
    }
    // 班级不能模糊查询
    if (key === 'class' && searchObj[key] !== '') {
      sql += ` AND ${key} = '${searchObj[key]}'`
    }
  }
  return sql
}

该方法对班级进行了特殊处理,因为班级不能模糊查询,所以需要单独处理。 方法中的searchObj参数为对象,例如:

{
  name: '黄',
  class: '计算机科学与技术',
  age: 20,
  birthday: '1999-01-01'
}

封装范围查询

// 封装范围查询的方法
function sqlQueryRange(rangeObj) {
  let sql = ''
  for (let key in rangeObj) {
    if (rangeObj[key].length === 2) {
      sql += ` AND ${key} BETWEEN ${rangeObj[key][0]} AND ${rangeObj[key][1]}`
    }
  }
  return sql
}

其中,rangeObj参数为对象,例如:

{
  age: [18, 20],
  birthday: ['1999-01-01', '2000-01-01']
}

完整的查询方法

在项目中引入相关模块
const db = require('../model/database')
const sqlQuery = require('../model/query')
const sqlQueryLike = require('../model/queryLike')
const sqlQueryRange = require('../model/queryRange')

// 查询学生信息
router.get('/student', async (req, res) => {
  const { searchObj, rangeObj, page, pageSize } = req.query
  let sql = 'SELECT * FROM student WHERE 1 = 1'
  // 模糊查询
  if (searchObj) {
    sql += sqlQueryLike(JSON.parse(searchObj))
  }
  // 范围查询 一班可以查询某个时间段的学生
  if (rangeObj) {
    sql += sqlQueryRange(JSON.parse(rangeObj))
  }
  // 分页
  if (page && pageSize) {
    sql += ` LIMIT ${(page - 1) * pageSize},${pageSize}`
  }
  const result = await sqlQuery(sql, [], db)
  res.json(result)
})

上述代码中的searchObj和rangeObj参数为对象,例如:

{
  searchObj: {
    name: '黄',
    class: '计算机科学与技术',
    age: 20,
  },
  rangeObj: {
    age: [18, 20],
    birthday: ['1999-01-01', '2000-01-01']
  },
  page: 1,
  pageSize: 10
}

功能是查询名字中包含字,班级为计算机科学与技术,年龄为20岁的学生,年龄在18到20岁之间,生日在1999-01-01到2000-01-01之间的学生,每页10条数据,第页的数据。

Last Updated:
Contributors: 黄定鑫