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操作。
目录
相关文章
|
8月前
|
设计模式 网络协议 数据可视化
Java 设计模式之状态模式:让对象的行为随状态优雅变化
状态模式通过封装对象的状态,使行为随状态变化而改变。以订单为例,将待支付、已支付等状态独立成类,消除冗长条件判断,提升代码可维护性与扩展性,适用于状态多、转换复杂的场景。
1025 157
|
9月前
|
数据采集 存储 安全
数据治理≠数据管理!90%的企业都搞错了重点!
在数字化转型中,数据不一致、质量差、安全隐患等问题困扰企业。许多组织跳过基础的数据管理,直接进行数据治理,导致方案难以落地。数据管理涵盖数据生命周期中的采集、存储、处理等关键环节,决定了数据是否可用、可靠。本文详解数据管理的四大核心模块——数据质量、元数据、主数据与数据安全,并提供构建数据管理体系的四个阶段:评估现状、确定优先级、建立基础能力与持续改进,助力企业夯实数据基础,推动治理落地。
|
设计模式 负载均衡 监控
并发设计模式实战系列(2):领导者/追随者模式
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发设计模式实战系列,第二章领导者/追随者(Leader/Followers)模式,废话不多说直接开始~
367 0
|
设计模式 监控 Java
并发设计模式实战系列(1):半同步/半异步模式
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发设计模式实战系列,第一章半同步/半异步(Half-Sync/Half-Async)模式,废话不多说直接开始~
523 0
|
设计模式 安全 Java
并发设计模式实战系列(12):不变模式(Immutable Object)
🌟 大家好,我是摘星!🌟今天为大家带来的是并发设计模式实战系列,第十二章,废话不多说直接开始~
300 0
|
9月前
|
数据采集 存储 SQL
数据管理四部曲:元数据管理、数据整合、数据治理、数据质量管控
老张带你搞定企业数据管理难题!数据找不到、看不懂、用不好?关键在于打好元数据管理、数据整合、数据治理和数据质量管控四大基础。四部曲环环相扣,助你打通数据孤岛,提升数据价值,实现精准决策与业务增长。
数据管理四部曲:元数据管理、数据整合、数据治理、数据质量管控
|
Web App开发 数据采集 JavaScript
动态网页爬取:Python如何获取JS加载的数据?
动态网页爬取:Python如何获取JS加载的数据?
1835 58
|
设计模式 算法 Java
设计模式觉醒系列(04)策略模式|简单工厂模式的升级版
本文介绍了简单工厂模式与策略模式的概念及其融合实践。简单工厂模式用于对象创建,通过隐藏实现细节简化代码;策略模式关注行为封装与切换,支持动态替换算法,增强灵活性。两者结合形成“策略工厂”,既简化对象创建又保持低耦合。文章通过支付案例演示了模式的应用,并强调实际开发中应根据需求选择合适的设计模式,避免生搬硬套。最后推荐了JVM调优、并发编程等技术专题,助力开发者提升技能。
|
11月前
|
数据采集 人工智能 监控
企业数据来源杂、质量差,如何通过主数据管理解决?如何确保数据可信、一致和可用?
本文三桥君系统介绍了主数据管理(MDM)在企业数字化转型中的关键作用。产品专家三桥君从数据清洗、治理、处理到流转四个维度,详细阐述了如何通过标准化流程将数据转化为企业核心资产。重点包括:数据清洗的方法与工具应用;数据治理的组织保障与制度设计;数据处理的三大核心动作;以及数据流转的三种模式与安全控制。专家三桥君强调主数据管理能够推动企业从"经验决策"转向"数据驱动",并提出构建统一数据服务网关、"数据血缘图谱"等实战建议,为企业数字化转型提供系统化解决方案。
382 0

热门文章

最新文章