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

简介: 数据管理器-数据访问对象模式

数据访问对象模式(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);
          }
      });
    
相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
目录
相关文章
|
5月前
|
设计模式 网络协议 数据可视化
Java 设计模式之状态模式:让对象的行为随状态优雅变化
状态模式通过封装对象的状态,使行为随状态变化而改变。以订单为例,将待支付、已支付等状态独立成类,消除冗长条件判断,提升代码可维护性与扩展性,适用于状态多、转换复杂的场景。
805 157
|
6月前
|
数据采集 存储 安全
数据治理≠数据管理!90%的企业都搞错了重点!
在数字化转型中,数据不一致、质量差、安全隐患等问题困扰企业。许多组织跳过基础的数据管理,直接进行数据治理,导致方案难以落地。数据管理涵盖数据生命周期中的采集、存储、处理等关键环节,决定了数据是否可用、可靠。本文详解数据管理的四大核心模块——数据质量、元数据、主数据与数据安全,并提供构建数据管理体系的四个阶段:评估现状、确定优先级、建立基础能力与持续改进,助力企业夯实数据基础,推动治理落地。
|
10月前
|
存储 数据管理 数据格式
数据治理 vs. 数据管理:别再傻傻分不清!
数据治理 vs. 数据管理:别再傻傻分不清!
524 10
|
6月前
|
数据采集 存储 SQL
数据管理四部曲:元数据管理、数据整合、数据治理、数据质量管控
老张带你搞定企业数据管理难题!数据找不到、看不懂、用不好?关键在于打好元数据管理、数据整合、数据治理和数据质量管控四大基础。四部曲环环相扣,助你打通数据孤岛,提升数据价值,实现精准决策与业务增长。
数据管理四部曲:元数据管理、数据整合、数据治理、数据质量管控
|
10月前
|
Web App开发 数据采集 JavaScript
动态网页爬取:Python如何获取JS加载的数据?
动态网页爬取:Python如何获取JS加载的数据?
1544 58
|
设计模式 存储 Java
【再谈设计模式】备忘录模式~对象状态的守护者
备忘录模式属于行为型设计模式。它的主要目的是在不破坏对象封装性的前提下,捕获并外部化一个对象的内部状态,以便之后可以将该对象恢复到这个状态。原发器(Originator):创建一个备忘录,用于记录当前时刻它的内部状态。原发器还可以使用备忘录来恢复其内部状态。备忘录(Memento):存储原发器对象的内部状态。备忘录应该防止原发器以外的其他对象访问其内部状态。负责人(Caretaker):负责保存备忘录,但不能对备忘录的内容进行操作或检查。
407 82
|
8月前
|
数据采集 人工智能 监控
企业数据来源杂、质量差,如何通过主数据管理解决?如何确保数据可信、一致和可用?
本文三桥君系统介绍了主数据管理(MDM)在企业数字化转型中的关键作用。产品专家三桥君从数据清洗、治理、处理到流转四个维度,详细阐述了如何通过标准化流程将数据转化为企业核心资产。重点包括:数据清洗的方法与工具应用;数据治理的组织保障与制度设计;数据处理的三大核心动作;以及数据流转的三种模式与安全控制。专家三桥君强调主数据管理能够推动企业从"经验决策"转向"数据驱动",并提出构建统一数据服务网关、"数据血缘图谱"等实战建议,为企业数字化转型提供系统化解决方案。
314 0
|
设计模式 供应链 安全
【再谈设计模式】中介者模式 - 协调对象间交互的枢纽
中介者模式定义了一个中介对象来封装一组对象之间的交互方式。中介者使得各对象之间不需要显式地相互引用,从而降低了它们之间的耦合度。它通过将对象之间的交互逻辑集中到中介者对象中,使得系统的结构更加清晰,易于维护和扩展。
333 18
【再谈设计模式】中介者模式 - 协调对象间交互的枢纽
|
JavaScript 前端开发 Docker
如何通过pm2以cluster模式多进程部署next.js(包括docker下的部署)
通过这些步骤,可以确保您的Next.js应用在多核服务器上高效运行,并且在Docker环境中实现高效的容器化管理。
1358 44

热门文章

最新文章