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
});
AI 代码解读

MongoDB

image.png

  • config.js
      module.exports = {
         
         
          // 数据库相关配置数据
          DB: {
         
         
              db: 'demo',             // 数据库名称
              host: '192.168.3.91',   // 主机名
              port: 27017,            // 端口号
          }
      };
    
    AI 代码解读
  • 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()
                      });
                  });
              },
          };
      };
    
    AI 代码解读
  • 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);
          }
      });
    
    AI 代码解读
相关实践学习
MySQL基础-学生管理系统数据库设计
本场景介绍如何使用DMS工具连接RDS,并使用DMS图形化工具创建数据库表。
目录
相关文章
如何在 JavaScript 中使用 __proto__ 实现对象的继承?
使用`__proto__`实现对象继承时需要注意原型链的完整性和属性方法的正确继承,避免出现意外的行为和错误。同时,在现代JavaScript中,也可以使用`class`和`extends`关键字来实现更简洁和直观的继承语法,但理解基于`__proto__`的继承方式对于深入理解JavaScript的面向对象编程和原型链机制仍然具有重要意义。
【Java进阶】详解JavaScript的BOM(浏览器对象模型)
总的来说,BOM提供了一种方式来与浏览器进行交互。通过BOM,你可以操作窗口、获取URL、操作历史、访问HTML文档、获取浏览器信息和屏幕信息等。虽然BOM并没有正式的标准,但大多数现代浏览器都实现了相似的功能,因此,你可以放心地在你的JavaScript代码中使用BOM。
111 23
如何确保 Math 对象的方法在不同的 JavaScript 环境中具有一致的精度?
【10月更文挑战第29天】通过遵循标准和最佳实践、采用固定精度计算、进行全面的测试与验证、避免隐式类型转换以及持续关注和更新等方法,可以在很大程度上确保Math对象的方法在不同的JavaScript环境中具有一致的精度,从而提高代码的可靠性和可移植性。
4S店、分公司远程访问总部DMS系统,贝锐花生壳提供高性价比方案
在汽车销售与服务行业,DMS(经销商管理系统)是日常运营的重要工具,涵盖销售、库存、售后等模块。传统远程访问方案如专线或VPN成本高且复杂,而贝锐花生壳内网穿透提供了一种高效、安全、低成本的替代方案。无需公网IP和复杂配置,只需三步即可实现DMS系统的远程访问,并支持加密传输和精细访问控制,确保数据安全。
133 16
浅谈几种js设计模式
设计模式是软件开发中的宝贵工具,能够提高代码的可维护性和扩展性。通过单例模式、工厂模式、观察者模式和策略模式,我们可以解决不同场景下的实际问题,编写更加优雅和高效的代码。
67 8
JavaScript中通过array.filter()实现数组的数据筛选、数据清洗和链式调用,JS中数组过滤器的使用详解(附实际应用代码)
用array.filter()来实现数据筛选、数据清洗和链式调用,相对于for循环更加清晰,语义化强,能显著提升代码的可读性和可维护性。博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
Next.js 实战 (七):浅谈 Layout 布局的嵌套设计模式
这篇文章介绍了在Next.js框架下,如何处理中后台管理系统中特殊页面(如登录页)不包裹根布局(RootLayout)的问题。作者指出Next.js的设计理念是通过布局的嵌套来创建复杂的页面结构,这虽然保持了代码的整洁和可维护性,但对于特殊页面来说,却造成了不必要的布局包裹。文章提出了一个解决方案,即通过判断页面的skipGlobalLayout属性来决定是否包含RootLayout,从而实现特殊页面不包裹根布局的目标。
224 33
JavaScript中对象的数据拷贝
本文介绍了JavaScript中对象数据拷贝的问题及解决方案。作者首先解释了对象赋值时地址共享导致的值同步变化现象,随后提供了五种解决方法:手动复制、`Object.assign`、扩展运算符、`JSON.stringify`与`JSON.parse`组合以及自定义深拷贝函数。每种方法都有其适用场景和局限性,文章最后鼓励读者关注作者以获取更多前端知识分享。
83 1
JavaScript中对象的数据拷贝
JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式
本文深入探讨了JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式,结合电商网站案例,展示了设计模式如何提升代码的可维护性、扩展性和可读性,强调了其在前端开发中的重要性。
101 2

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问