nodejs怎么添加和查询数据库的数据

发布时间:2021-09-24 09:45:44 作者:小新
来源:亿速云 阅读:191
# Node.js怎么添加和查询数据库的数据

## 目录
1. [前言](#前言)
2. [数据库连接准备](#数据库连接准备)
   - [2.1 安装必要的包](#21-安装必要的包)
   - [2.2 创建数据库连接](#22-创建数据库连接)
3. [添加数据到数据库](#添加数据到数据库)
   - [3.1 使用原生SQL插入](#31-使用原生sql插入)
   - [3.2 使用ORM插入数据](#32-使用orm插入数据)
4. [查询数据库数据](#查询数据库数据)
   - [4.1 基础查询操作](#41-基础查询操作)
   - [4.2 高级查询技巧](#42-高级查询技巧)
5. [实战案例](#实战案例)
   - [5.1 用户管理系统示例](#51-用户管理系统示例)
6. [性能优化建议](#性能优化建议)
7. [常见问题解答](#常见问题解答)
8. [总结](#总结)

## 前言

在现代Web开发中,数据库操作是核心功能之一。Node.js作为流行的后端运行时环境,提供了多种操作数据库的方式。本文将详细介绍如何使用Node.js进行数据库数据的添加和查询操作,涵盖MySQLMongoDB等常见数据库,并提供完整代码示例。

## 数据库连接准备

### 2.1 安装必要的包

根据不同类型的数据库,我们需要安装对应的Node.js驱动:

```bash
# MySQL
npm install mysql2

# MongoDB
npm install mongodb

# ORM解决方案
npm install sequelize mongoose typeorm

2.2 创建数据库连接

MySQL连接示例

const mysql = require('mysql2/promise');

async function createConnection() {
  const connection = await mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: 'password',
    database: 'test_db'
  });
  return connection;
}

MongoDB连接示例

const { MongoClient } = require('mongodb');

async function connectToMongo() {
  const uri = 'mongodb://localhost:27017';
  const client = new MongoClient(uri);
  await client.connect();
  return client.db('test_db');
}

添加数据到数据库

3.1 使用原生SQL插入

单条数据插入

async function insertUser(user) {
  const conn = await createConnection();
  const [result] = await conn.execute(
    'INSERT INTO users (name, email) VALUES (?, ?)',
    [user.name, user.email]
  );
  console.log(`插入成功,ID: ${result.insertId}`);
  await conn.end();
}

批量插入

async function batchInsertUsers(users) {
  const conn = await createConnection();
  const query = 'INSERT INTO users (name, email) VALUES ?';
  const values = users.map(u => [u.name, u.email]);
  
  const [result] = await conn.query(query, [values]);
  console.log(`批量插入${result.affectedRows}条记录`);
  await conn.end();
}

3.2 使用ORM插入数据

Sequelize示例

const { Sequelize, DataTypes } = require('sequelize');
const sequelize = new Sequelize('sqlite::memory:');

const User = sequelize.define('User', {
  name: DataTypes.STRING,
  email: DataTypes.STRING
});

async function createUser() {
  const jane = await User.create({ 
    name: 'Jane Doe',
    email: 'jane@example.com'
  });
  console.log(jane.toJSON());
}

Mongoose示例

const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');

const UserSchema = new mongoose.Schema({
  name: String,
  email: String
});
const User = mongoose.model('User', UserSchema);

async function createUser() {
  const user = new User({ name: 'John', email: 'john@example.com' });
  await user.save();
  console.log(user);
}

查询数据库数据

4.1 基础查询操作

查询所有记录

// MySQL
async function getAllUsers() {
  const conn = await createConnection();
  const [rows] = await conn.query('SELECT * FROM users');
  await conn.end();
  return rows;
}

// MongoDB
async function getAllUsers() {
  const db = await connectToMongo();
  return db.collection('users').find().toArray();
}

条件查询

// MySQL条件查询
async function getUserByName(name) {
  const conn = await createConnection();
  const [rows] = await conn.query(
    'SELECT * FROM users WHERE name = ?', 
    [name]
  );
  await conn.end();
  return rows[0];
}

// MongoDB条件查询
async function getUserByName(name) {
  const db = await connectToMongo();
  return db.collection('users').findOne({ name });
}

4.2 高级查询技巧

分页查询

async function getUsersPaginated(page = 1, pageSize = 10) {
  const offset = (page - 1) * pageSize;
  const conn = await createConnection();
  const [rows] = await conn.query(
    'SELECT * FROM users LIMIT ? OFFSET ?',
    [pageSize, offset]
  );
  await conn.end();
  return rows;
}

关联查询

// MySQL关联查询
async function getUsersWithPosts() {
  const conn = await createConnection();
  const [rows] = await conn.query(`
    SELECT users.*, posts.title 
    FROM users 
    LEFT JOIN posts ON users.id = posts.user_id
  `);
  await conn.end();
  return rows;
}

// MongoDB聚合查询
async function getUsersWithPosts() {
  const db = await connectToMongo();
  return db.collection('users').aggregate([
    {
      $lookup: {
        from: 'posts',
        localField: '_id',
        foreignField: 'user_id',
        as: 'posts'
      }
    }
  ]).toArray();
}

实战案例

5.1 用户管理系统示例

完整CRUD实现

const express = require('express');
const mysql = require('mysql2/promise');
const app = express();
app.use(express.json());

// 数据库连接池
const pool = mysql.createPool({
  host: 'localhost',
  user: 'root',
  password: 'password',
  database: 'user_db',
  waitForConnections: true,
  connectionLimit: 10,
  queueLimit: 0
});

// 创建用户
app.post('/users', async (req, res) => {
  try {
    const [result] = await pool.execute(
      'INSERT INTO users (name, email) VALUES (?, ?)',
      [req.body.name, req.body.email]
    );
    res.status(201).json({ id: result.insertId });
  } catch (err) {
    res.status(500).json({ error: err.message });
  }
});

// 获取用户列表
app.get('/users', async (req, res) => {
  try {
    const [rows] = await pool.query('SELECT * FROM users');
    res.json(rows);
  } catch (err) {
    res.status(500).json({ error: err.message });
  }
});

// 获取单个用户
app.get('/users/:id', async (req, res) => {
  try {
    const [rows] = await pool.query(
      'SELECT * FROM users WHERE id = ?',
      [req.params.id]
    );
    if (rows.length === 0) {
      return res.status(404).json({ error: 'User not found' });
    }
    res.json(rows[0]);
  } catch (err) {
    res.status(500).json({ error: err.message });
  }
});

app.listen(3000, () => console.log('Server running on port 3000'));

性能优化建议

  1. 使用连接池:避免频繁创建和销毁数据库连接

    const pool = mysql.createPool({ /* 配置 */ });
    
  2. 合理使用索引:对经常查询的字段建立索引

    CREATE INDEX idx_name ON users(name);
    
  3. 批量操作:减少数据库往返次数

    await conn.query('INSERT INTO users (name) VALUES ?', [names]);
    
  4. 缓存常用查询:使用Redis等缓存高频访问数据

  5. 分页查询:避免一次性获取大量数据

常见问题解答

Q1: 如何防止SQL注入? A: 始终使用参数化查询,不要直接拼接SQL字符串:

// 错误做法(不安全)
await conn.query(`SELECT * FROM users WHERE name = '${name}'`);

// 正确做法
await conn.query('SELECT * FROM users WHERE name = ?', [name]);

Q2: 如何处理数据库连接泄漏? A: 确保在所有代码路径中都关闭连接,或使用连接池:

// 使用try-catch-finally
let conn;
try {
  conn = await createConnection();
  // 执行查询
} finally {
  if (conn) await conn.end();
}

Q3: 为什么我的查询很慢? A: 可能原因包括: - 缺少适当的索引 - 查询返回了过多数据 - 数据库服务器负载过高 - 网络延迟

总结

本文详细介绍了在Node.js中添加和查询数据库数据的各种方法,包括:

  1. 使用原生驱动进行基本CRUD操作
  2. 利用ORM简化数据库交互
  3. 实现高级查询如分页和关联查询
  4. 构建完整的RESTful API示例
  5. 性能优化技巧和常见问题解决方案

无论你是使用关系型数据库如MySQL还是NoSQL如MongoDB,Node.js都提供了强大的工具和库来简化数据库操作。选择适合你项目需求的方案,并遵循最佳实践,可以构建出高效可靠的数据库访问层。

进一步学习资源: - MySQL2文档 - MongoDB Node驱动文档 - Sequelize官方文档 - Mongoose指南 “`

推荐阅读:
  1. nodejs Sequelize和mysql有哪些常用的查询命令
  2. oracle闪回查询和闪回数据库

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

nodejs 数据库

上一篇:php怎么实现分页查询

下一篇:php怎么实现跨域请求

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》