JavaScript设计模式(二十八):数据管理器-数据访问对象模式

本文涉及的产品
数据管理 DMS,安全协同 3个实例 3个月
推荐场景:
学生管理系统数据库
简介: 数据管理器-数据访问对象模式

数据访问对象模式(Data access object-DAO)

抽象和封装对数据源的访问与存储,DAO通过对数据源链接的管理方便对数据的访问与存储

封装本地存储

/**
 * 定义本地存储类
 * @param preId     存储库前缀
 */
const BaseLocalStorage = function (preId) {
   
   
    this.preId = preId;
};

// 本地存储类原型方法
BaseLocalStorage.prototype = {
   
   
    // 状态
    state: {
   
   
        FAILURE: 0,     // 失败
        SUCCESS: 1,     // 成功
        OVERFLOW: 2,    // 溢出
    },
    // 存储工具
    storage: localStorage || window.localStorage,
    // 获取数据库的真是字段
    getKey(key) {
   
   
        return this.preId + key;
    },
    /**
     * 新增/修改 数据到数据库
     * @param key       不带前缀的属性
     * @param value     值
     * @param callback  回调(传入 `状态,key,值`)
     */
    set(key, value, callback) {
   
   
        let state = this.state.SUCCESS;
        let realKey = this.getKey(key); // 真实key
        try {
   
   
            this.storage.setItem(realKey, value);
        } catch (e) {
   
   
            // 存不进去了,返回溢出窗台
            state = this.state.OVERFLOW;
        }
        callback && callback.call(this, {
   
   state, key, value});
    },
    /**
     * 查询数据到数据库
     * @param key           不带前缀的属性
     * @param callback      回调(传入 `状态,key,值`)
     */
    get(key, callback) {
   
   
        let state = this.state.SUCCESS;
        let realKey = this.getKey(key); // 真实key
        let value = null;
        try {
   
   
            value = this.storage.getItem(realKey);
        } catch (e) {
   
   
            // 获取失败
            state = this.state.FAILURE;
        }
        callback && callback.call(this, {
   
   state, key, value});
    },
    /**
     * 删除数据
     * @param key           不带前缀的属性
     * @param callback      回调(传入 `状态,key`)
     */
    remove(key, callback) {
   
   
        let state = this.state.SUCCESS;
        let realKey = this.getKey(key); // 真实key
        try {
   
   
            this.storage.removeItem(realKey);
        } catch (e) {
   
   
            // 获取失败
            state = this.state.FAILURE;
        }
        callback && callback.call(this, {
   
   state, key});
    }
};


const s = new BaseLocalStorage('Lee-');

s.set('name', 'Lee', function ({
   
   state, key, value}) {
   
   
    console.log(state, key, value); // 1 'name' 'Lee'
});
s.get('name', function ({
   
   state, key, value}) {
   
   
    console.log(state, key, value); // 1 'name' 'Lee'
});
s.remove('name', function ({
   
   state, key}) {
   
   
    console.log(state, key); // 1 'name'
});
s.get('name', function ({
   
   state, key, value}) {
   
   
    console.log(state, key, value); // 1 'name' null
});

MongoDB

image.png

  • config.js
      module.exports = {
         
         
          // 数据库相关配置数据
          DB: {
         
         
              db: 'demo',             // 数据库名称
              host: '192.168.3.91',   // 主机名
              port: 27017,            // 端口号
          }
      };
    
  • db.js

      const {
         
          MongoClient } = require('mongodb');
      const config = require('./config').DB;
    
      // 创建数据库对象
      const url = `mongodb://${config.host}:${config.port}`;
      const mongoClient = new MongoClient(url);
    
      /**
       * 连接数据库
       * @param {string} col  表名
       * @param {Function} fn 回调
       */
      function connect(col, fn) {
         
         
          mongoClient.connect()
              .then(client => {
         
         
                  const db = client.db(config.db);
                  const collection = db.collection(col);
                  fn && fn(collection, client);
              })
              .catch(err => {
         
         
                  throw err;
              });
      }
    
      // 输出数据访问对象
      exports.DB = function (col) {
         
         
          return {
         
         
              /**
               * 插入一条数据
               * @param {data, success, fail} param 
               *      data    插入数据 
               *      success 成功回调 
               *      fail    失败回调
               */
              insertOne({
         
          data, success = () => {
         
          }, fail = () => {
         
          } }) {
         
         
                  connect(col, (collection, client) => {
         
         
                      collection.insertOne(data)
                          .then(res => success(res))
                          .catch(err => fail(err))
                          .finally(() => client.close()); // 关闭数据库
                  });
              },
              /**
               * 删除一条数据
               * @param {data, success, fail} param 
               *      q       查询数据 
               *      success 成功回调 
               *      fail    失败回调
               */
              deleteMany({
         
          q, success = () => {
         
          }, fail = () => {
         
          } }) {
         
         
                  connect(col, (collection, client) => {
         
         
                      collection.deleteMany(q)
                          .then(res => success(res))
                          .catch(err => fail(err))
                          .finally(() => client.close());
                  });
              },
              /**
               * 修改一条数据
               * @param {data, success, fail} param 
               *      q       查询数据
               *      data    修改数据 
               *      success 成功回调 
               *      fail    失败回调
               */
              updateOne({
         
          q, data, success = () => {
         
          }, fail = () => {
         
          } }) {
         
         
                  connect(col, (collection, client) => {
         
         
                      collection.updateOne(q, {
         
          $set: data })
                          .then(res => success(res))
                          .catch(err => fail(err))
                          .finally(() => client.close());
                  });
              },
              /**
               * 查询数据
               * @param {data, success, fail} param 
               *      q       查询数据 
               *      success 成功回调 
               *      fail    失败回调
               */
              find({
         
          q, success = () => {
         
          }, fail = () => {
         
          } }) {
         
         
                  connect(col, (collection, client) => {
         
         
                      collection.find(q).toArray((err, res) => {
         
         
                          if (err) {
         
         
                              fail(err);
                          } else {
         
         
                              success(res);
                          }
                          client.close()
                      });
                  });
              },
          };
      };
    
  • app.js

      const DB = require('./db').DB;
    
      // 操作user表
      const user = DB('user');
    
      // 增
      user.insertOne({
         
         
          data: {
         
          name: 'Lee', age: 18, desc: '简介啦~~~' },
          success(res) {
         
         
              console.log(res);
          },
          fail(err) {
         
         
              console.log(err.message);
          }
      });
    
      // 删
      user.deleteMany({
         
         
          q: {
         
          name: 'Lee' },
          success(res) {
         
         
              console.log(res);
          },
          fail(err) {
         
         
              console.log(err.message);
          }
      });
    
      // 改
      user.updateOne({
         
         
          q: {
         
          name: 'Lee' },
          data: {
         
          age: 20 },
          success(res) {
         
         
              console.log(res);
          },
          fail(err) {
         
         
              console.log(err.message);
          }
      });
    
      // 查
      user.find({
         
         
          q: {
         
         },
          success(res) {
         
         
              console.log(res);
          },
          fail(err) {
         
         
              console.log(err.message);
          }
      });
    
      const book = DB('book');
    
      // 增
      book.insertOne({
         
         
          data: {
         
          name: '《Tom》', desc: '简介啦~~~' },
          success(res) {
         
         
              console.log(res);
          },
          fail(err) {
         
         
              console.log(err.message);
          }
      });
    
相关实践学习
MySQL基础-学生管理系统数据库设计
本场景介绍如何使用DMS工具连接RDS,并使用DMS图形化工具创建数据库表。
目录
相关文章
|
1月前
|
人工智能 关系型数据库 分布式数据库
拥抱Data+AI|“全球第一”雅迪如何实现智能营销?DMS+PolarDB注入数据新活力
针对雅迪“云销通App”的需求与痛点,本文将介绍阿里云瑶池数据库DMS+PolarDB for AI提供的一站式Data+AI解决方案,助力销售人员高效用数,全面提升销售管理效率。
|
1月前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
|
1月前
|
设计模式 开发者 Python
Python编程中的设计模式:工厂方法模式###
本文深入浅出地探讨了Python编程中的一种重要设计模式——工厂方法模式。通过具体案例和代码示例,我们将了解工厂方法模式的定义、应用场景、实现步骤以及其优势与潜在缺点。无论你是Python新手还是有经验的开发者,都能从本文中获得关于如何在实际项目中有效应用工厂方法模式的启发。 ###
|
18天前
Next.js 实战 (三):优雅的实现暗黑主题模式
这篇文章介绍了在Next.js中实现暗黑模式的具体步骤。首先,需要安装next-themes库。然后,在/components/ThemeProvider/index.tsx文件中新增ThemeProvider组件,并在/app/layout.tsx文件中注入该组件。如果想要加入过渡动画,可以修改代码实现主题切换时的动画效果。最后,需要在需要的位置引入ThemeModeButton组件,实现暗黑模式的切换。
|
1月前
|
监控 JavaScript 算法
深度剖析 Vue.js 响应式原理:从数据劫持到视图更新的全流程详解
本文深入解析Vue.js的响应式机制,从数据劫持到视图更新的全过程,详细讲解了其实现原理和运作流程。
|
1月前
|
设计模式 安全 Java
Kotlin - 改良设计模式 - 构建者模式
Kotlin - 改良设计模式 - 构建者模式
|
1月前
|
前端开发 JavaScript UED
探索JavaScript的异步编程模式
【10月更文挑战第40天】在JavaScript的世界里,异步编程是一道不可或缺的风景线。它允许我们在等待慢速操作(如网络请求)完成时继续执行其他任务,极大地提高了程序的性能和用户体验。本文将深入浅出地探讨Promise、async/await等异步编程技术,通过生动的比喻和实际代码示例,带你领略JavaScript异步编程的魅力所在。
30 1
|
1月前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
45 1
|
1月前
|
关系型数据库 分布式数据库 数据库
云栖大会|从数据到决策:AI时代数据库如何实现高效数据管理?
在2024云栖大会「海量数据的高效存储与管理」专场,阿里云瑶池讲师团携手AMD、FunPlus、太美医疗科技、中石化、平安科技以及小赢科技、迅雷集团的资深技术专家深入分享了阿里云在OLTP方向的最新技术进展和行业最佳实践。
|
1月前
|
数据采集 存储 JavaScript
如何使用Puppeteer和Node.js爬取大学招生数据:入门指南
本文介绍了如何使用Puppeteer和Node.js爬取大学招生数据,并通过代理IP提升爬取的稳定性和效率。Puppeteer作为一个强大的Node.js库,能够模拟真实浏览器访问,支持JavaScript渲染,适合复杂的爬取任务。文章详细讲解了安装Puppeteer、配置代理IP、实现爬虫代码的步骤,并提供了代码示例。此外,还给出了注意事项和优化建议,帮助读者高效地抓取和分析招生数据。
如何使用Puppeteer和Node.js爬取大学招生数据:入门指南

热门文章

最新文章