数据访问对象模式(Data access object-DAO):抽象和封装对数据源的访问和存储,DAO通过对数据源链接的管理方便对数据的访问与存储。数据访问对象类DAO,方便管理自己本地存储库。
数据访问对象类是对本地存储的一次封装,基本上是对数据的增删改查操作。
本地存储保存在localstorage中,对于同一个站点,没有分割库,所以要将每次存储的数据字段前面添加前缀表示。
//创建一个DAO类 var BaseLocalStorage = function(preId,timeSign){ //定义本地存储数据库前缀 this.preId = preId; //定义时间戳与存储数据之间的拼接符 this.timeSign = timeSign || ‘|-|’; }
在DAO类内部保存操作返回状态供以后使用,在本地存储服务的引用保存在DAO类的内部,DAO提供对数据库的增删改查操作接口方法。
// 本地存储类原型方法 BaseLocalStorage.prototype = { //操作状态 status : { SUCCESS:0, FAILURE:1, OVERFLOW:2, TIMEOUT:3 }, //保存本地存储链接 storage : localStorage || window.localStorage, //获取本地存储数据库数据真实字段 getKey : function(key){ return this.preId + key; }, //添加修改数据 set: function(key,value,callback,time){ //默认操作状态时成功 var status = this.status.SUCCESS, //获取真实字段 key = this.getKey(key); try{ //参数时间参数时获取时间戳 time = new Date(time).getTime() || time.getTime(); }catch(e){ //为传入时间参数或者时间参数有误获取默认时间:一个月 time = new Date().getTime() + 1000*60*60*24*31; } try{ this.storage.setItem(key,time + this,timeSign + value) }catch(e){ status = this.status.OVERFLOW; } callback && callback.call(this,status,key,value); }, //获取数据 四种情况 get: function(key,value){ var status = this.status.SUCCESS, key = this.getKey(key), value = null, timeSignLen = this.timeSign.length, that = this, index, time, result; try{ value = that.storage.getItem(key); }catch(e){ result = { status : that.status.FAILURE, VALUE : null }; callback && callback.call(this,result.status,result.value); return result; } //如果成功获取数据字符串 if(value){ index = value.indexOf(that.timeSign); time += value.slice(0,index); //如果时间没过期 if(new Date(time).getTime() > new Date().getTime() || time == 0){ value = value.slice(index + timeSignLen); }else{ //过期结果为null value = null, status = that.status.TIMEOUT; that.remove(key); } }else{ status = that.status.FAILURE; } //设置结果 result = { status : status, value : value }; callback && callback.call(this,result.status,result.value); return result; }, //删除数据 remove: function(key,callback){ var status = this.status.FAILURE, key = this.getKey(key), value = null; try{ value = this.storage.getItem(key); }catch(e){} if(value){ try{ this.storage.removeItem(key); status = this.status.SUCCESS; }catch(e){} } callback && callback.call(this,status,status>0?null:value.slice(value.indexOf(this.timeSign) + this.timeSign,length)) } }
数据访问对象模式更适合与服务器端的数据库操作,在nodejs中操作MongoDB时即可使用.
数据访问对象模式可以方便我们对前端存储的管理,统一我们的使用方式,并且使用时更加方便。
数据访问对象(DAO)模式即是对数据库的操作(CURD)进行封装,用户不必为操作数据库感到苦恼,DAO提供了简单而统一的操作接口,对于Mongo来说,DAO对象甚至会保留对数据库的链接,每次操作数据库不必一次次向数据库发送链接请求。