zoukankan      html  css  js  c++  java
  • koa2实现对mysql的增删改查函数封装

    ---恢复内容开始---

    nodejs实现对mysql简单的增删改查操作

    最近在看mysql的视频,所以手写了这么个东西,欢迎大家指点指点  

    // 项目开始先造一个简单的node服务器server.js:
    const Koa = require('koa'); const Path = require('path'); const Static = require('koa-static'); const KoaBody = require('koa-body')(); const Route = require('./router/router'); const App = new Koa();
    // const main
    = Static(Path.join(__dirname)); App.use(main);

    // 处理post请求需要用这个 App.use(KoaBody);
    // 使用路由 App .use(Route.routes()) .use(Route.allowedMethods()); App.listen(
    3666, (err) => { if(err) { throw err; } console.log('server listen 3666'); });


    // 接下来进行对路由的配置router.js:

    const Router = require('koa-router');

    const Route = new Router();

    // 从processData.js中引入这四个方法

    const {
      wantAddData,  // 添加数据
      wantDeleData,  // 删除数据
      wantExitData,  // 修改数据
      wantFindData   // 查找数据
    } = require('../processData/processData');

    
    

    Route.post('/add',wantAddData);
    Route.get('/getShopMsg', wantFindData);
    Route.post('/exitShopMsg', wantExitData);
    Route.get('/delete', wantDeleData);

    module.exports = Route;

    // 这样一个简单版的node服务器就架好了

    // 接下来就是连接上本地的mysql数据库了

    // 创建mysql.js

    const Mysql = require('mysql');
    const { _SQLCONFIG } = require('../config');

    // _SQLCONFIG 保存你的mysql信息,结构如下:

    /**

    _SQLCONFIG: {
      host: 'localhost',  
      user: 'root',      
      port: '3306',       
      database: '',       
      password: '',    
      connectionLimit: 50 // 最大连接数
    }

    */

    // 创建数据库连接
    const pool = Mysql.createPool(_SQLCONFIG);

    // 通过connection的query方法统一执行增删改查的操作。

    // connecQuery为增删改查方法的函数名

    // statements进行增删改查操作的条件,查询条件都由前端访问时将条件传入

    // parameter 进行添加或修改的数据
    function poolFn(connecQuery, statements, parameter) {
      // getConnection 创建连接池
      return new Promise((resolve, reject) => {
        pool.getConnection((err, connection) => {
          if(err) {
            throw err;
            reject('建立连接池失败');
            return;
          }

          connecQuery(connection, statements, parameter).then(data => {

            connection.release(); // 到这步说明已经完成操作,释放连接
            resolve(data);
          });
        });
      // console.log(pool._allConnections.length); // 连接池里的连接数
      });
    }
    /*
    * connection 连接句柄
    * statements 查询语句

    * */

    // 基于promise方法实现

    // 查询数据
    function connecQueryFind(connection, statements) {
      return new Promise((resolve, reject) => {
        connection.query(statements, (err, result) => {
          if(err) {
            throw err;
            reject('查询失败');
          }
          resolve(result);
        });
      })
    }

    // 添加数据
    function connecQueryAdd(connection, statements, parameter) {
      return new Promise((resolve, reject) => {
        connection.query(statements, parameter, (err, result) => {
          if(err) {
            throw err;
            reject('添加失败');
          }
          resolve(result);
        });
      })
    }

    // 删除数据
    function connecQueryDele(connection, statements) {
       return new Promise((resolve, reject) => {
        connection.query(statements, (err, result) => {
          if(err) {
            throw err;
            reject('删除失败');
          }
          resolve(result);
        });
      })
    }

    // 修改数据
    function connecQueryExit(connection, statements, parameter) {
      return new Promise((resolve, reject) => {
        connection.query(statements, parameter, (err, result) => {
          if(err) {
            throw err;
            reject('修改失败');
          }
          resolve(result);
        });
      })
    }

    // 将方法封装统一导出

    function queryFn(connecQuery, statements, parameter) {
      return new Promise((resolve) => {
        poolFn(connecQuery, statements, parameter).then(data => {
          resolve(data);
        });
      });
    }

    module.exports = {
      findData(statements, parameter) {
        return queryFn(connecQueryFind, statements, parameter);
      },
      addData(statements, parameter) {
        return queryFn(connecQueryAdd, statements, parameter);
      },
      deleData(statements, parameter) {
        return queryFn(connecQueryDele, statements, parameter);
      },
      exitData(statements, parameter) {
        return queryFn(connecQueryExit, statements, parameter);
      }
    };

    // 最后就是对mysql中四个方法在路由中的处理了processData.js:

    // 从mysql.js引入增删改查方法

    const {
      findData,
      addData,
      deleData,
      exitData
    } = require('../mysql/mysql');

    // ------------------ctx.query获取get请求参数--------------------------------------
    // ------------------ctx.request.body获取post请求参数------------------------------
    // let data = fs.readFileSync('./k_Mongo/shopList.json', 'utf-8'); 读取文件信息

    // 这边通过async方法保证数据的同步获取

    let wantFindData = async(ctx) => { // 获取数据
      let res = ctx.query;

      // 返回的数据格式为json
      ctx.response.type = 'json';
      let statements = res.statements;
      await findData(statements).then(data => {
        ctx.body = data;
      }, () => {
        ctx.body = { err: '数据获取失败' };
      });
    };

    let wantAddData = async(ctx) => { // 添加数据
      let res = ctx.request.body;
      let statements = res.statements;
      let parameter = JSON.parse(res.parameter);
      ctx.response.type = 'json';
      await addData(statements, parameter).then(data => {
        ctx.body = data;
       }, () => {
        ctx.body = { err: '数据添加失败' };
      });
    };

    let wantDeleData = async(ctx) => { // 删除数据
      let res = ctx.query;
      let statements = res.statements;
      ctx.response.type = 'json';
      await deleData(statements).then(data => {
        ctx.body = data;
      }, () => {
        ctx.body = { err: '数据删除失败' };
      });
    };

    let wantExitData = async(ctx) => { // 修改数据
      let res = ctx.request.body;
      let parameter = JSON.parse(res.parameter);
      let statements = res.statements;
      ctx.response.type = 'json';
      await exitData(statements, parameter).then(data => {
        ctx.body = data;
      }, () => {
        ctx.body = { err: '数据修改失败' };
      });
    };

    module.exports = {
      wantFindData,
      wantAddData,
      wantDeleData,
      wantExitData
    };

    // 到这一步基本上结束了,可以在前端使用试验一下

    // 先自己封装一个axios的方法,结合上次讲的axios封装get和post方法 fetch.js:

    const axios = require('axios');

    //封装axios请求,get和post
    export default function(url, method, params = {}) {
      let data = method.toLocaleLowerCase() === 'get' ? 'params' : 'data';
      return axios({
        method,
        url,
        [data]: params
      }).then((res) => {
        return Promise.resolve(res.data);
      }).catch((err) => {
        return Promise.reject(err);
      })
    }

    // 再新建一个api.js文件专门存放接口查询

    // 这边就只使用添加数据和获取数据

    import fetch from './fetch';

    // 添加商品数据
    export function addShopData(params) {
      return new Promise((resolve, reject) => {
        fetch('/add', 'post', params).then(data => {
          resolve(data);
        }, err => {
          reject(err);
        })
      });
    }

    // 获取商品列表数据
    export function getShopData(params) {
      return new Promise((resolve, reject) => {
        fetch('/getShopMsg', 'get', params).then(data => {
          resolve(data);
        }, err => {
          reject(err);
        })
      });
    }

    // 修改商品列表数据
    export function exitShopData(params) {
      return new Promise((resolve, reject) => {
        fetch('/exitShopMsg', 'post', params).then(data => {
          resolve(data);
        }, err => {
          reject(err);
        })
      });
    }

    // 最后一步了

    // React先创建shopList.js

    import React, { Component } from 'react';
    import { getShopData } from '../../../api/shopApi';
    import SingShop from './singShop';
    import CompontHead from '../homeComHead/compontHead';

    import './shoplist.scss';

    export default class HomeShopList extends Component {
      constructor(props) {
        super(props);

        // 商品数据
        this.state = {
          shopData: [],
          shopData02: []
        };

      // this.conUl = React.createRef();

      // 查询条件

      // 查询shopMsg表的所有数据
      this.getParams = {
        statements: 'SELECT * FROM shopMsg'
      };

      // 这是修改的数据
      // let DATA = [{"detImg":"/static/images/all/1495869803526192.jpg"}];

      // 修改的参数
      // this.exitParams = {
      //    statements: 'UPDATE shopMsg SET product_det=? WHERE product_id="KY_13141544361478180"',  // 修改条件
      //    parameter: [JSON.stringify(DATA)]     // 修改的数据
      // };
      // product_genre product_det
      
      }
      componentWillMount() {

        // 进行查询操作
        getShopData(this.getParams).then(data => {
          data.map(item => {
            item.product_genre = JSON.parse(item.product_genre);
            item.product_det = JSON.parse(item.product_det);
          });
           data.length = 8;
           let shopData02 = JSON.parse(JSON.stringify(data));
          this.setState({
           shopData: data,
           shopData02: shopData02.splice(2, data.length)
          }); 

          console.log(data);
        });
      // exitShopData(this.exitParams).then(data => {
        // console.log(data);
      // });
      }
     
      render() {
        return (
          <div>hehe</div>
        )
      }
    }

    // 这是查询出来的数据:

    // 这是我数据库里的product_id='KY_13141544361478180'的数据,对应上面查到的第一条数据

    // 添加数据就不展示了,因为这里面的数据都是我添加进去的 

    // 本文只是实现了基本的mysql增删改查,对于mysql更深层的操作目前还没达到那个境界,以后还需更加努力!文笔不好,谢谢阅读,希望对你有所帮助。

  • 相关阅读:
    游戏引擎/GUI的设计与实现-主题
    Perl 写的巡检数据库的脚本
    Perl 利用grep 判断元素是否在数组里
    抓报错对应的SQL
    org.hibernate.exception.GenericJDBCException: Could not open connection
    java.sql.SQLException: Access denied for user 'sa'@'localhost' (using password: YES)
    java.sql.SQLException: Access denied for user 'sa'@'localhost' (using password: NO)
    Caused by: java.lang.NoSuchMethodError: javax.persistence.Table.indexes()[Ljavax/persistence/Index
    Caused by: org.h2.jdbc.JdbcSQLException: Table "T_STUDENT_INFO" not found; SQL statement
    No bean named 'hibernateTemplate' is defined
  • 原文地址:https://www.cnblogs.com/kyl-6/p/10161427.html
Copyright © 2011-2022 走看看