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图形化工具创建数据库表。
目录
相关文章
|
12天前
|
关系型数据库 分布式数据库 数据库
云栖大会|从数据到决策:AI时代数据库如何实现高效数据管理?
在2024云栖大会「海量数据的高效存储与管理」专场,阿里云瑶池讲师团携手AMD、FunPlus、太美医疗科技、中石化、平安科技以及小赢科技、迅雷集团的资深技术专家深入分享了阿里云在OLTP方向的最新技术进展和行业最佳实践。
|
19天前
|
前端开发 JavaScript UED
探索JavaScript中的异步编程模式
【10月更文挑战第21天】在数字时代的浪潮中,JavaScript作为一门动态的、解释型的编程语言,以其卓越的灵活性和强大的功能在Web开发领域扮演着举足轻重的角色。本篇文章旨在深入探讨JavaScript中的异步编程模式,揭示其背后的原理和实践方法。通过分析回调函数、Promise对象以及async/await语法糖等关键技术点,我们将一同揭开JavaScript异步编程的神秘面纱,领略其带来的非阻塞I/O操作的魅力。让我们跟随代码的步伐,开启一场关于时间、性能与用户体验的奇妙之旅。
|
27天前
|
存储 人工智能 安全
【荣誉奖项】荣获2024数据治理优秀产品!瓴羊Dataphin联合DAMA发布数据管理技能认证
瓴羊Dataphin连续俩年获得DAMA年度优秀数据治理产品奖,本次与DAMA联合发布“DAMA x 瓴羊 数据管理技能认证”,助力提升全民数据素养。
134 0
【荣誉奖项】荣获2024数据治理优秀产品!瓴羊Dataphin联合DAMA发布数据管理技能认证
|
7天前
|
前端开发 JavaScript UED
探索JavaScript的异步编程模式
【10月更文挑战第33天】在JavaScript的世界里,异步编程是提升应用性能和用户体验的关键。本文将带你深入理解异步编程的核心概念,并展示如何在实际开发中运用这些知识来构建更流畅、响应更快的Web应用程序。从回调函数到Promises,再到async/await,我们将一步步解锁JavaScript异步编程的秘密,让你轻松应对各种复杂的异步场景。
|
1月前
|
JavaScript 前端开发 API
探索Node.js中的异步编程模式
【10月更文挑战第4天】在JavaScript的世界中,异步编程是提升应用性能和用户体验的关键。本文将深入探讨Node.js中异步编程的几种模式,包括回调函数、Promises、async/await,并分享如何有效利用这些模式来构建高性能的后端服务。
|
1月前
|
JavaScript 前端开发 调度
探索Node.js中的异步编程模式
在Node.js的世界里,异步编程是核心。本文将带你深入了解异步编程的精髓,通过代码示例和实际案例分析,我们将一起掌握事件循环、回调函数、Promises以及async/await等关键概念。准备好迎接挑战,让你的Node.js应用飞起来!
|
1月前
|
设计模式 JavaScript 前端开发
JavaScript设计模式--访问者模式
【10月更文挑战第1天】
30 3
|
1月前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP开发领域,设计模式是解决常见问题的高效方案集合。它们不是具体的代码,而是一种编码和设计经验的总结。单例模式作为设计模式中的一种,确保了一个类仅有一个实例,并提供一个全局访问点。本文将深入探讨单例模式的基本概念、实现方式及其在PHP中的应用。
单例模式在PHP中的应用广泛,尤其在处理数据库连接、日志记录等场景时,能显著提高资源利用率和执行效率。本文从单例模式的定义出发,详细解释了其在PHP中的不同实现方法,并探讨了使用单例模式的优势与注意事项。通过对示例代码的分析,读者将能够理解如何在PHP项目中有效应用单例模式。
|
1月前
|
JavaScript 前端开发 开发者
探索Node.js中的异步编程模式
【9月更文挑战第33天】在JavaScript的后端领域,Node.js凭借其非阻塞I/O和事件驱动的特性,成为高性能应用的首选平台。本文将深入浅出地探讨Node.js中异步编程的核心概念、Promise对象、Async/Await语法以及它们如何优化后端开发的效率和性能。
25 7
|
2月前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP的编程实践中,设计模式是解决常见软件设计问题的最佳实践。单例模式作为设计模式中的一种,确保一个类只有一个实例,并提供全局访问点,广泛应用于配置管理、日志记录和测试框架等场景。本文将深入探讨单例模式的原理、实现方式及其在PHP中的应用,帮助开发者更好地理解和运用这一设计模式。
在PHP开发中,单例模式通过确保类仅有一个实例并提供一个全局访问点,有效管理和访问共享资源。本文详细介绍了单例模式的概念、PHP实现方式及应用场景,并通过具体代码示例展示如何在PHP中实现单例模式以及如何在实际项目中正确使用它来优化代码结构和性能。
44 2

热门文章

最新文章

  • 1
    C++一分钟之-设计模式:工厂模式与抽象工厂
    42
  • 2
    《手把手教你》系列基础篇(九十四)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-下篇(详解教程)
    46
  • 3
    C++一分钟之-C++中的设计模式:单例模式
    53
  • 4
    《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
    37
  • 5
    《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
    61
  • 6
    Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
    56
  • 7
    Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
    40
  • 8
    Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
    49
  • 9
    Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
    105
  • 10
    Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
    75