回到目录

对于数据分页,我们已经见的太多了,几乎每个列表页面都要用到分页,这已经成了一种定理了,在进行大数据展示时,如果不去分页,而直接把数据加载到内存,这简直是不可以去相向的,呵呵,在很多ORM工具中都对分页有了更好的支持,如LINQ里有大家熟悉的take和skip,而在MongoDB里也有这种概念,它使用limit和skip实现,这在大多数的Mongo客户端上都集成了这个功能,即帮助我们组合命令参数,并带我们把分页取数据的指令发到Mongo服务器去,实现分页技术!

添加了分页后的IMongoRepository接口

        /// <summary>
/// MongoDB集成的查询方法,大数据情况下,有分页时使用这个方法
/// </summary>
/// <typeparam name="U">匿名对象,用来为条件赋值</typeparam>
/// <param name="template">条件对象</param>
/// <param name="limit"></param>
/// <param name="skip"></param>
/// <returns></returns>
PagedResult<TEntity> GetModel<U>(U template, int pageIndex, int pageSize);
/// <summary>
/// MongoDB集成的查询方法,大数据情况下,有分页和排序时使用这个方法
/// </summary>
/// <typeparam name="U">匿名对象,用来为条件赋值</typeparam>
/// <typeparam name="O">匿名对象,用来为排序赋值,NoRM.OrderBy枚举</typeparam>
/// <param name="template">条件对象</param>
/// <param name="orderby">排序对象</param>
/// <param name="limit"></param>
/// <param name="skip"></param>
/// <returns></returns>
PagedResult<TEntity> GetModel<U, O>(U template, O orderby, int pageIndex, int pageSize);

看我是如何去实现它的,事实上是调用了Mongo客户端封装的Find<T, U, O>(this IMongoCollection<T> collection, U template, O orderby, int limit, int skip);方法

实现的,我们来看一下代码

  public PagedResult<TEntity> GetModel<U, O>(U template, O orderby, int pageIndex, int pageSize)
{
var skip = (pageIndex - ) * pageSize;
var limit = pageSize;
var recordCount = _table.Count();
return new PagedResult<TEntity>(
recordCount,
(int)(recordCount + pageSize - ) / pageSize,
pageSize,
pageIndex,
_table.Find(template, orderby, limit, skip).ToList());
}

代码主要实现的是分页和排序功能,其中template是查询条件,可以传入一个匿名对象,而orderby参数表示一个排序的匿名对象,把排序字段写到对象里即可,升序为1,降

序为-1,也可以使用它定义好的枚举来赋值,下面我们为上面方法做一个重载,来针对不需要排序的需求

   public PagedResult<TEntity> GetModel<U>(U template, int pageIndex, int pageSize)
{
return GetModel(template, new { }, pageIndex, pageSize);
}

有了底层的方法,再来看它的返回值,如果是分页返回对象,那么一定要返回一个PagedResult泛型对象,这个对象主要向外部公开一个参数,如当前页的数据集,当前页号

每面显示记录数,总页数和总的记录数及URL条件集合等。

    /// <summary>
/// 分页结果对象,UI显示它,BLL为它赋值
/// 陈晴阳开发,张占岭修改,添加了AddParameters属性,用来存储URL参数
/// </summary>
/// <typeparam name="T"></typeparam>
public class PagedResult<T> : IEnumerable<T>, ICollection<T>
{
#region Public Fields
/// <summary>
/// 获取一个当前类型的空值。
/// </summary>
public static readonly PagedResult<T> Empty = new PagedResult<T>(, , , , null);
#endregion #region Ctor
/// <summary>
/// 初始化一个新的<c>PagedResult{T}</c>类型的实例。
/// </summary>
public PagedResult()
{
Data = new List<T>();
AddParameters = new NameValueCollection();
PageSize = ;
}
/// <summary>
/// 初始化一个新的<c>PagedResult{T}</c>类型的实例。
/// </summary>
/// <param name="totalRecords">总记录数。</param>
/// <param name="totalPages">页数。</param>
/// <param name="pageSize">页面大小。</param>
/// <param name="pageNumber">页码。</param>
/// <param name="data">当前页面的数据。</param>
public PagedResult(long totalRecords, int totalPages, int pageSize, int pageNumber, List<T> data)
{
this.TotalPages = totalPages;
this.TotalRecords = totalRecords;
this.PageSize = pageSize;
this.PageIndex = pageNumber;
this.Data = data;
}
#endregion #region Public Properties
/// <summary>
/// 获取或设置总记录数。
/// </summary>
public long TotalRecords { get; set; }
/// <summary>
/// 获取或设置页数。
/// </summary>
public int TotalPages { get; set; }
/// <summary>
/// 获取或设置页面大小。
/// </summary>
public int PageSize { get; set; }
/// <summary>
/// 获取或设置页码。
/// </summary>
public int PageIndex { get; set; }
/// <summary>
/// 获取或设置当前页面的数据。
/// </summary>
public List<T> Data { get; set; }
/// <summary>
/// 分页参数
/// </summary>
public NameValueCollection AddParameters { get; set; }
#endregion #region Public Methods
/// <summary>
/// 确定指定的Object是否等于当前的Object。
/// </summary>
/// <param name="obj">要与当前对象进行比较的对象。</param>
/// <returns>如果指定的Object与当前Object相等,则返回true,否则返回false。</returns>
/// <remarks>有关此函数的更多信息,请参见:http://msdn.microsoft.com/zh-cn/library/system.object.equals。
/// </remarks>
public override bool Equals(object obj)
{
if (ReferenceEquals(this, obj))
return true;
if (obj == (object)null)
return false;
var other = obj as PagedResult<T>;
if (other == (object)null)
return false;
return this.TotalPages == other.TotalPages &&
this.TotalRecords == other.TotalRecords &&
this.PageIndex == other.PageIndex &&
this.PageSize == other.PageSize &&
this.Data == other.Data;
} /// <summary>
/// 用作特定类型的哈希函数。
/// </summary>
/// <returns>当前Object的哈希代码。</returns>
/// <remarks>有关此函数的更多信息,请参见:http://msdn.microsoft.com/zh-cn/library/system.object.gethashcode。
/// </remarks>
public override int GetHashCode()
{
return this.TotalPages.GetHashCode() ^
this.TotalRecords.GetHashCode() ^
this.PageIndex.GetHashCode() ^
this.PageSize.GetHashCode();
} /// <summary>
/// 确定两个对象是否相等。
/// </summary>
/// <param name="a">待确定的第一个对象。</param>
/// <param name="b">待确定的另一个对象。</param>
/// <returns>如果两者相等,则返回true,否则返回false。</returns>
public static bool operator ==(PagedResult<T> a, PagedResult<T> b)
{
if (ReferenceEquals(a, b))
return true;
if ((object)a == null || (object)b == null)
return false;
return a.Equals(b);
} /// <summary>
/// 确定两个对象是否不相等。
/// </summary>
/// <param name="a">待确定的第一个对象。</param>
/// <param name="b">待确定的另一个对象。</param>
/// <returns>如果两者不相等,则返回true,否则返回false。</returns>
public static bool operator !=(PagedResult<T> a, PagedResult<T> b)
{
return !(a == b);
}
#endregion #region IEnumerable<T> Members
/// <summary>
/// 返回一个循环访问集合的枚举数。
/// </summary>
/// <returns>一个可用于循环访问集合的 IEnumerator 对象。</returns>
public IEnumerator<T> GetEnumerator()
{
return Data.GetEnumerator();
} #endregion #region IEnumerable Members
/// <summary>
/// 返回一个循环访问集合的枚举数。 (继承自 IEnumerable。)
/// </summary>
/// <returns>一个可用于循环访问集合的 IEnumerator 对象。</returns>
IEnumerator IEnumerable.GetEnumerator()
{
return Data.GetEnumerator();
} #endregion #region ICollection<T> Members
/// <summary>
/// 将某项添加到 ICollection{T} 中。
/// </summary>
/// <param name="item">要添加到 ICollection{T} 的对象。</param>
public void Add(T item)
{
Data.Add(item);
} /// <summary>
/// 从 ICollection{T} 中移除所有项。
/// </summary>
public void Clear()
{
Data.Clear();
} /// <summary>
/// 确定 ICollection{T} 是否包含特定值。
/// </summary>
/// <param name="item">要在 ICollection{T} 中定位的对象。</param>
/// <returns>如果在 ICollection{T} 中找到 item,则为 true;否则为 false。</returns>
public bool Contains(T item)
{
return Data.Contains(item);
} /// <summary>
/// 从特定的 Array 索引开始,将 ICollection{T} 的元素复制到一个 Array 中。
/// </summary>
/// <param name="array">作为从 ICollection{T} 复制的元素的目标的一维 Array。 Array 必须具有从零开始的索引。</param>
/// <param name="arrayIndex">array 中从零开始的索引,从此索引处开始进行复制。</param>
public void CopyTo(T[] array, int arrayIndex)
{
Data.CopyTo(array, arrayIndex);
} /// <summary>
/// 获取 ICollection{T} 中包含的元素数。
/// </summary>
public int Count
{
get { return Data.Count; }
} /// <summary>
/// 获取一个值,该值指示 ICollection{T} 是否为只读。
/// </summary>
public bool IsReadOnly
{
get { return false; }
} /// <summary>
/// 从 ICollection{T} 中移除特定对象的第一个匹配项。
/// </summary>
/// <param name="item">要从 ICollection{T} 中移除的对象。</param>
/// <returns>如果已从 ICollection{T} 中成功移除 item,则为 true;否则为 false。 如果在原始 ICollection{T} 中没有找到 item,该方法也会返回 false。 </returns>
public bool Remove(T item)
{
return Data.Remove(item);
} #endregion
}

有了底层方法和返回的对象,下面就是前台显示了,我们可以扩展一个PagerHelper,重新为它起个名字叫PagedResultHelper吧,把它的相关PagedList类型对象修改成PagedResult对象即可,代码如下

  /// <summary>
/// 关于PagedResult对象的分页展示
/// 作者:张占岭,花名:仓储大叔
/// </summary>
public static class PagedResultHelper
{ #region Ajax分页
/// <summary>
/// AJAX分页
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="html"></param>
/// <param name="pagedList"></param>
/// <param name="UpdateTargetId"></param>
/// <returns></returns>
public static MvcHtmlString AjaxPagerResult<T>(this HtmlHelper html, PagedResult<T> pagedList, string UpdateTargetId, bool isDisplayCompletePage)
{
var ui = new UIHelper(html.ViewContext.RequestContext.HttpContext.Request.Url.ToString(), UpdateTargetId, pagedList.AddParameters);
if (!isDisplayCompletePage)
return MvcHtmlString.Create(ui.GetPage(pagedList.PageIndex, pagedList.PageSize, (int)pagedList.TotalRecords, false));
else
return MvcHtmlString.Create(ui.GetPage(pagedList.PageIndex, pagedList.PageSize, (int)pagedList.TotalRecords));
} public static MvcHtmlString AjaxPager<T>(this HtmlHelper html, PagedResult<T> pagedList, string UpdateTargetId)
{
return AjaxPagerResult<T>(html, pagedList, UpdateTargetId, true);
}
/// <summary>
/// AJAX分页
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="html"></param>
/// <param name="pagedList"></param>
/// <param name="UpdateTargetId"></param>
/// <param name="ActionName"></param>
/// <param name="ControllerName"></param>
/// <returns></returns>
public static MvcHtmlString AjaxPagerResult<T>(this HtmlHelper html, PagedResult<T> pagedList, string UpdateTargetId, string ActionName, string ControllerName, bool isDisplayCompletePage, bool isTop)
{
var mvcUrl = new UrlHelper(html.ViewContext.RequestContext).Action(ActionName, ControllerName); //占岭修改
var localUrl = string.Format(@"{0}://{1}", html.ViewContext.RequestContext.HttpContext.Request.Url.Scheme, html.ViewContext.RequestContext.HttpContext.Request.Url.Authority);
var url = string.Format("{0}{1}{2}", localUrl, mvcUrl, html.ViewContext.RequestContext.HttpContext.Request.Url.Query);
var ui = new UIHelper(url, UpdateTargetId, pagedList.AddParameters);
return MvcHtmlString.Create(ui.GetPage(pagedList.PageIndex, pagedList.PageSize, (int)pagedList.TotalRecords, isDisplayCompletePage, false, isTop));
}
public static MvcHtmlString AjaxPagerResult<T>(this HtmlHelper html, PagedResult<T> pagedList, string UpdateTargetId, string ActionName, string ControllerName, bool isDisplayCompletePage)
{
return AjaxPagerResult<T>(html, pagedList, UpdateTargetId, ActionName, ControllerName, true, false);
}
/// <summary>
/// ajax方式,MVC路由支持的分页
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="html"></param>
/// <param name="pagedList"></param>
/// <param name="UpdateTargetId"></param>
/// <param name="ActionName"></param>
/// <param name="ControllerName"></param>
/// <returns></returns>
public static MvcHtmlString AjaxPagerResult<T>(this HtmlHelper html, PagedResult<T> pagedList, string UpdateTargetId, string ActionName, string ControllerName)
{
var mvcUrl = new UrlHelper(html.ViewContext.RequestContext).Action(ActionName, ControllerName); //占岭修改
var localUrl = string.Format(@"{0}://{1}", html.ViewContext.RequestContext.HttpContext.Request.Url.Scheme, html.ViewContext.RequestContext.HttpContext.Request.Url.Authority);
var url = string.Format("{0}{1}{2}", localUrl, mvcUrl, html.ViewContext.RequestContext.HttpContext.Request.Url.Query);
var ui = new UIHelper(url, UpdateTargetId, pagedList.AddParameters); return MvcHtmlString.Create(ui.GetPage(pagedList.PageIndex
, pagedList.PageSize
, (int)pagedList.TotalRecords
,
, new UrlHelper(html.ViewContext.RequestContext)
, html.ViewContext.RouteData.Values["action"].ToString()
, html.ViewContext.RouteData.Values["controller"].ToString(), true, false, null)); } #endregion #region Html分页
/// <summary>
/// Html分页,不使用MVC路由
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="html"></param>
/// <param name="pagedList"></param>
/// <returns></returns>
public static MvcHtmlString PagerResult<T>(this HtmlHelper html, PagedResult<T> pagedList)
{
return PagerResult<T>(html, pagedList, false);
}
public static MvcHtmlString PagerResult<T>(this HtmlHelper html, PagedResult<T> pagedList, string className)
{
return PagerResult<T>(html, pagedList, false, className);
}
public static MvcHtmlString PagerResult<T>(this HtmlHelper html, PagedResult<T> pagedList, bool router, string className)
{
return PagerResult<T>(html, pagedList, router, true, className);
}
/// <summary>
/// Html分页,router为true表示走MVC路由
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="html"></param>
/// <param name="pagedList"></param>
/// <param name="router">路由</param>
/// <param name="className">CSS类名</param>
/// <returns></returns>
public static MvcHtmlString PagerResult<T>(this HtmlHelper html, PagedResult<T> pagedList, bool router, bool isCompleteDisplay, string className)
{
if (pagedList == null)
return null;
UIHelper ui = new UIHelper(html.ViewContext.RequestContext.HttpContext.Request.Url.ToString(), pagedList.AddParameters);
if (router)
return MvcHtmlString.Create(ui.GetPage(pagedList.PageIndex
, pagedList.PageSize
, (int)pagedList.TotalRecords
,
, new UrlHelper(html.ViewContext.RequestContext)
, html.ViewContext.RouteData.Values["action"].ToString()
, html.ViewContext.RouteData.Values["controller"].ToString(), isCompleteDisplay, false, className));
return MvcHtmlString.Create(ui.GetPage(pagedList.PageIndex, pagedList.PageSize, (int)pagedList.TotalRecords, isCompleteDisplay, className));
}
public static MvcHtmlString PagerResult<T>(this HtmlHelper html, PagedResult<T> pagedList, bool router)
{
return PagerResult<T>(html, pagedList, router, null);
}
#endregion }

这样,我们前台调用分页时,还是一句话就搞定了,呵呵!

aaarticlea/png;base64,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" alt="" />

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAbQAAAAvCAIAAAAEgKglAAAEzUlEQVR4nO2dPW7iQBiGI3EbJC6TJpfgApQucoY0i5Qe0aGUSChaJQ1IFJEQ6VYCulBwgNmCP8N8tsfz4/Eoj/UUxMQz43m/eTTgaPdh/7MHAIA7HqKPAACghSBHAAAB5AgAIIAcAQAEAsrxp8EjVr8mh5exeW+k05/Y0Z7bCXS0oYat00md6EJsTo7N3INe0NGn1e/YQjTiS47kFaLf6JJCjnvkmMTYkGNaeUVMJ3WiF0Ae5JjA2JBjWnlFTCd1ohdAnghy1Kcgf8Zi+moVtEsAocdmOJPIMW5elW2699u8lZRSSin9tcdm61ZXdOLsHDu3Niyv77odhZNj2LGtlt3+56t1I6tl91xhj+/VjYil2Xs7qNNxyJ4d5bgZZEYj0RsJtIR85VXSjviWRb+GKinIaz5S26fLrw23Sqmvt5kfOQ63SimVb7/4vCo4kKOHojecrChy9Dy2989Of9Kxl+P3Y386WO33P0dLnl8XXyXM//P6Sym1mHf6s2wnLYA6cvwYTw01nVxeDdSwkRyL8hpu1WJ+/rXjW37k+LS4+O2mNsTzSqk/f//V3ZB6ydoXMb9zLJqLunPX5GILMbbXl0mnPx28O+wc3z87L9/5BnUr1Vl+s2yn1G7ds5bjatnNPh9td44tz8tkSI79GsmxIK/e2+Giwt7bQe0OX6VyLNrf3bpsPro5fZFg0Xm5/cp7ccnaO03L0WReSqRp0lHlYnPJI+DYHD9WX8ntIouvKg5iPlKFZjST42aQTQcr+4/V+sRaL5sQeenXeq/hOma8z+tpoUbDSad/3FoesuG6XI55hemv872MhpcP8jdylM7faFH8ETnaFGtoObrcVOvluBlkk+54U9lI+VJ5Wth/rP4YT7vjjct3juLE2gUXTo7lS7pBOd7lNct2x+8fZ9lOqcX8+Onb13eOogT186IWTRRpEXE42r5zNJGmFzlW1l/wsXmQ4/djXzajflXF/Q63Sp03ILXkuFp2s+XHz967HPXXsfK6u1acGcd+68rxmtfz+mu37p1sdcieJ1HkWNK4SWotoe07x8bkaEh75bhadgsegIhXBZLj8TlMHl3WLnnVjS+cHMuXdDQ5np7GnJ7D3BzXpzT32io/7ORo3iZyrE7dV2H9RjlWmVG/qmiBHbcYLh+rz/jfOVrEF06O4kz66tdciHd55Z/GnDDbORrCztEP1jvHu5OVsxbxT0N8js1Bjvp+ze5pde7v5uQqjy7HNuRVa0nb9VtTVde8rk9jasox768Sl9WS46Ud/QVytNw5isVUMncNL7ZwYzOcSS+NGC4/Bzn6uZ0W5qW3VvTaul/rdOzQnWW+1zNp09C8yLFi51g+R+JblQVda8GXEGJsFjOJHCPmJV51Nz/u/cY1o7sfdRvmmypp2TrrEPAPTyQwtt8sxxTziphO6kQvgDzIMYGxIce08oqYTupEL4A8yDGBsSHHtPKKmE7qRC+APPw3CcEPL2Pz3ogvOUa8nUBHG2o4uqSQY1g5AgCkC3IEABBAjgAAAsgRAEAAOQIACCBHAAAB5AgAIIAcAQAEkCMAgAByBAAQQI4AAALIEQBAADkCAAggRwAAAeQIACCAHAEABJAjAIAAcgQAEECOAAACyBEAQAA5AgAIIEcAAIH/eW3G6c7vuloAAAAASUVORK5CYII=" alt="" />

事实上,对于PagedResult我们也可以用在其它ORM工具上,因为一定的数据库和NoSql都开放了limit及skip等功能,大家可以放眼去看,放心去想,呵呵!

回到目录

MongoDB学习笔记~为IMongoRepository接口添加分页取集合的方法的更多相关文章

  1. MongoDB学习笔记~为IMongoRepository接口添加了排序和表达式树,针对官方驱动

    回到目录 MongoDB的官方驱动,语法更好,更强 之前写过关于IMongoRepository仓储的文章,在mongodb的驱动选择上使用了NoRM,但是进行$ref引用类型导航时出现了问题,它对引 ...

  2. MongoDB学习笔记~为IMongoRepository接口添加了增删改方法,针对官方驱动

    回到目录 上一讲说了MongoDB官方驱动的查询功能,这回说一下官方驱动的增删改功能,驱动在升级为2.0后,相应的insert,update和delete都只有了异步版本(或者叫并行版本),这当然也是 ...

  3. MongoDB学习笔记~为IMongoRepository接口更新指定字段

    回到目录 对于MongoDB来说,它的更新建议是对指定字段来说的,即不是把对象里的所有字段都进行update,而是按需去更新,这在性能上是最优的,这当然也是非常容易理解的,我们今天要实现的就是这种按需 ...

  4. MongoDB 学习笔记(三):分页、排序与游标

    一.分页 1.limit返回指定条数的数据 2.skip指定跨度 3.limit与skip结合,进行分页 二.排序 1.sort排序:指定排序的key,大于0为升序,小于0为降序.如果指定了多个排序键 ...

  5. MongoDB学习笔记~大叔分享批量添加—批量更新—批量删除

    回到目录 说它是批量操作,就是说将集合对象一次提交到服务器,并对数据进行持久化,如果您的代码是一次一次的提交,那不算是批量操作!在之前的mongodb仓储中并没有对批量更新和批量删除进行实现,而今天在 ...

  6. MongoDB学习笔记~自己封装的Curd操作(查询集合对象属性,更新集合对象)

    回到目录 我不得不说,mongodb官方驱动在与.net结合上做的不是很好,不是很理想,所以,我决定对它进行了二次封装,这是显得很必然了,每个人都希望使用简单的对象,而对使用复杂,麻烦,容易出错的对象 ...

  7. Mongodb学习笔记(二)Capped Collection固定集合

    一.Capped Collection固定集合 简单介绍 capped collections是性能出色的有着固定大小的集合(定容集合),以LRU(Least Recently Used最近最少使用) ...

  8. MongoDB学习笔记系列

    回到占占推荐博客索引 该来的总会来的,Ef,Redis,MVC甚至Sqlserver都有了自己的系列,MongoDB没有理由不去整理一下,这个系列都是平时在项目开发时总结出来的,希望可以为各位一些帮助 ...

  9. MongoDB学习笔记系列~目录

    MongoDB学习笔记~环境搭建 (2015-03-30 10:34) MongoDB学习笔记~MongoDBRepository仓储的实现 (2015-04-08 12:00) MongoDB学习笔 ...

随机推荐

  1. CodeIgniter-Lottery - php ci 抽奖辅助函数

    CodeIgniter-Lottery - php ci 抽奖辅助函数 Github https://github.com/xjnotxj/CodeIgniter-Lottery 用法 1. 移入文件 ...

  2. git安装和初次使用

    为了知道某人安装git,我也是重装啊. 1.下载git并安装 2.打开我的电脑,右键属性,选择高级设置,打开环境变量设置: 3.键盘输入窗口键+r,或者点击开始->运行 输入cmd 在新打开的命 ...

  3. js赋值运算的理解

    简介 js引擎由于为了效率,很多时候的非直接量赋值都不是copy一份在赋值给新的变量,而是一个引用 ps:直接量:直接值数字字符串等 为什么使用len = doms.length; 里的len效率要比 ...

  4. iOS 视图控制器 (内容根据iOS编程编写)

    视图控制器是  UIViewController 类或其子类对象.每个视图控制器都负责管理一个视图层次结构,包括创建视图层级结构中的视图并处理相关用户事件,以及将整个视图层次结构添加到应用窗口. 创建 ...

  5. healthMonitoring与运行状况监视

    配置针对应用程序的运行状况监视的一个服务 配置节内容比以往的较为复杂,如下 <healthMonitoring Enabled="true|false" heartbeatI ...

  6. caching与缓存

    通常,应用程序可以将那些频繁访问的数据,以及那些需要大量处理时间来创建的数据存储在内存中,从而提高性能.例如,如果应用程序使用复杂的逻辑来处理大量数据,然后再将数据作为用户频繁访问的报表返回,避免在用 ...

  7. android Can't bind to local 86XX for debugger

    For some reason eclipse DDMS always gives the error 'Can't bind to local 86XX for debugger' every ti ...

  8. PHP+MYSQL网站SQL Injection攻防

    程序员们写代码的时候讲究TDD(测试驱动开发):在实现一个功能前,会先写一个测试用例,然后再编写代码使之运行通过.其实当黑客SQL Injection时,同样是一个TDD的过程:他们会先尝试着让程序报 ...

  9. C++_系列自学课程_第_6_课_bitset集_《C++ Primer 第四版》

    在C语言中要对一个整数的某一个位进行操作需要用到很多的技巧.这种情况在C++里面通过标准库提供的一个抽象数据类型 bitset得到了改善. 一.标准库bitset类型 1.bitset的作用 bits ...

  10. python征程1.1(初识python)

    在学习python前必须要掌握的一些基本知识   1.编程语言 2.python   .  C#   JAVA 3.python:  pypy    cpython     jpython 4.执行方 ...