万隆的笔记 万隆的笔记
博文索引
笔试面试
  • 在线学站

    • 菜鸟教程 (opens new window)
    • 入门教程 (opens new window)
    • Coursera (opens new window)
  • 在线文档

    • w3school (opens new window)
    • Bootstrap (opens new window)
    • Vue (opens new window)
    • 阿里开发者藏经阁 (opens new window)
  • 在线工具

    • tool 工具集 (opens new window)
    • bejson 工具集 (opens new window)
    • 文档转换 (opens new window)
  • 更多在线资源
  • Changlog
  • Aboutme
GitHub (opens new window)
博文索引
笔试面试
  • 在线学站

    • 菜鸟教程 (opens new window)
    • 入门教程 (opens new window)
    • Coursera (opens new window)
  • 在线文档

    • w3school (opens new window)
    • Bootstrap (opens new window)
    • Vue (opens new window)
    • 阿里开发者藏经阁 (opens new window)
  • 在线工具

    • tool 工具集 (opens new window)
    • bejson 工具集 (opens new window)
    • 文档转换 (opens new window)
  • 更多在线资源
  • Changlog
  • Aboutme
GitHub (opens new window)
  • jQuery-Datatables
    • 页面引用
    • 分页查询案例
    • 定义数据访问接口
    • 定义通用的分页展示对象
    • 业务逻辑层关键代码
    • 控制器层关键代码
    • 客户端
    • 参考
  • jQuery iCheck
  • jQuery zTree
  • jQuery TreeTable
  • jQuery Validation
  • Dropzone
  • wangEditor
  • DataTime
  • JavaScript
2022-02-01
目录

jQuery-Datatables

# jQuery Datatables

DataTables 是一款 jQuery 表格插件。它是一个高度灵活的工具,可以将任何HTML表格添加高级的交互功能。

  • 中文网站 (opens new window)
  • 实例索引 (opens new window)
  • 参考手册 (opens new window)
  • 帮助文档 (opens new window)

# 页面引用

<!-- DataTables -->
<link rel="stylesheet" href="/static/assets/bower_components/datatables.net-bs/css/dataTables.bootstrap.min.css">

<!-- DataTables -->
<script src="/static/assets/bower_components/datatables.net/js/jquery.dataTables.min.js"></script>
<script src="/static/assets/bower_components/datatables.net-bs/js/dataTables.bootstrap.min.js"></script>

使用,启用 0 配置模式

$('#dataTable').DataTable();

# 分页查询案例

# 服务端

#MyBatis 映射文件关键代码 DataTables 分页需要提供查询数据的总笔数,以下为查询总笔数的关键代码:

<select id="count" resultType="java.lang.Integer">
  SELECT COUNT(*) FROM tb_user
</select>

这里我们使用 MySQL 作为数据库,由于需要传入分页参数,这里我们还使用了 Map 作为查询参数类型,以下为 MySQL 分页查询的关键代码: (MySQL单表的数据量尽量不要超过1000w条数据)

<select id="page" resultType="TbUser" parameterType="java.util.Map">
    SELECT
    <include refid="tbUserColumns" />
    FROM
    tb_user AS a LIMIT #{page}, #{pageSize}
</select>

# 定义数据访问接口

/**
 * 分页查询
 * @param params
 * @return
 */
List<TbUser> page(Map<String, Object> params);

/**
 * 查询笔数
 * @return
 */
int count();

# 定义通用的分页展示对象

创建一个名为 PageInfo 的分页数据展示对象,代码如下:

package com.wenwl.my.shop.commons.dto;

import com.wenwl.my.shop.commons.persistence.BaseEntity;

import java.util.List;

/**
 * @author wenwl
 * @className PageInfo
 * @dsecription 分页数据传输对象
 * @data 2020/2/16
 * @vserion 1.0.0
 */
public class PageInfo<T extends BaseEntity> {

    private int draw;
    private int recordsTotal;
    private int recordsFiltered;
    private List<T> data;
    private String error;

    public int getDraw() {
        return draw;
    }

    public void setDraw(int draw) {
        this.draw = draw;
    }

    public int getRecordsTotal() {
        return recordsTotal;
    }

    public void setRecordsTotal(int recordsTotal) {
        this.recordsTotal = recordsTotal;
    }

    public int getRecordsFiltered() {
        return recordsFiltered;
    }

    public void setRecordsFiltered(int recordsFiltered) {
        this.recordsFiltered = recordsFiltered;
    }

    public List<T> getData() {
        return data;
    }

    public void setData(List<T> data) {
        this.data = data;
    }

    public String getError() {
        return error;
    }

    public void setError(String error) {
        this.error = error;
    }
}

# 业务逻辑层关键代码

@Override
public PageInfo<TbUser> page(Map<String, Object> params) {
    PageInfo<TbUser> pageInfo = new PageInfo<>();

    int count = tbUserDao.count();
    List<TbUser> tbUsers = tbUserDao.page(params);

    pageInfo.setRecordsTotal(count);
    pageInfo.setRecordsFiltered(count);
    pageInfo.setData(tbUsers);

    return pageInfo;
}

# 控制器层关键代码

@ResponseBody
@GetMapping(value = "page")
public PageInfo<TbUser> page(HttpServletRequest req){
    String drawStr = req.getParameter("draw");
    String startStr = req.getParameter("start");
    String lengthStr = req.getParameter("length");

    int draw = drawStr == null ? 0 : Integer.parseInt(drawStr);
    int start = startStr == null ? 0 : Integer.parseInt(startStr);
    int length = lengthStr == null ? 0 : Integer.parseInt(lengthStr);

    HashMap<String, Object> params = new HashMap<>();
    params.put("page",start);
    params.put("pageSize",length);
    PageInfo<TbUser> pageInfo = userService.page(params);
    pageInfo.setDraw(draw);
    return pageInfo;
}

# 客户端

使用 DataTables 分页功能,需要开启一些列的相关配置,分页的数据结果是由 Ajax 请求获取并解析 JSON 格式数据自动封装进表格的,代码如下:

$('#dataTable').DataTable({
    //是否自适应宽度,禁止这个选项可以实现最优的性能
    "autoWidth": true,
    //是否显示表格左下角的信息
    "info": true,
    //是否允许用户改变表格每页显示的记录数
    "lengthChange": false,
    //是否允许开启排序
    "ordering": false,
    //是否开启本地分页
    "paging": true,
    //是否显示处理状态(排序的时候,数据很多耗费时间长的话,也会显示这个)
    "processing": true,
    // 是否允许 DataTables 开启本地搜索
    "searching": false,
    // 控制 DataTables 的延迟渲染,可以提高初始化的速度
    "deferRender": true,
    // 是否开启服务器模式
    "serverSide": true,
    "ajax": {
        "url": "/user/page"
    },
    // 分页按钮显示选项
    "pagingType": "full_numbers",
    // 设置列的数据源
    "columns": [
        {
            "data": function (row, type, val, meta) {
                return '<input id="' + row.id + '" type="checkbox" class="minimal" />';
            }
        },
        {"data": "id"},
        {"data": "username"},
        {"data": "phone"},
        {"data": "email"},
        {
                "data": function (row, type, val, meta) {
                    return moment(row.updated).format("YYYY-MM-DD HH:mm:ss");
                    }
        },
        {
            "data": function (row, type, val, meta) {
                var detailURL = "/user/detail?id="+row.id;
                var deleteURL = "/user/delete";
                return '<button type="button" class="btn btn-sm btn-default" onclick="App.showDetail(\''+detailURL+'\')"><i class="fa fa-search"></i> 查看</button>&nbsp;&nbsp;' +
                    '<a href="/user/form?id='+row.id+'" type="button" class="btn btn-sm btn-primary"><i class="fa fa-edit"></i> 编辑</a>&nbsp;&nbsp;' +
                    '<button  type="button" class="btn btn-sm btn-danger" onclick="App.deleteSingle(\'' + deleteURL + '\', \'' + row.id + '\')"><i class="fa fa-trash-o"></i> 删除</button >';

            }
        }
    ],
    // 表格重绘的回调函数
    "drawCallback": function (settings) {
        App.init();
    },
    // 国际化
    "language": {
        "sProcessing": "处理中...",
        "sLengthMenu": "显示 _MENU_ 项结果",
        "sZeroRecords": "没有匹配结果",
        "sInfo": "显示第 _START_ 至 _END_ 项结果,共 _TOTAL_ 项",
        "sInfoEmpty": "显示第 0 至 0 项结果,共 0 项",
        "sInfoFiltered": "(由 _MAX_ 项结果过滤)",
        "sInfoPostFix": "",
        "sSearch": "搜索:",
        "sUrl": "",
        "sEmptyTable": "表中数据为空",
        "sLoadingRecords": "载入中...",
        "sInfoThousands": ",",
        "oPaginate": {
            "sFirst": "首页",
            "sPrevious": "上页",
            "sNext": "下页",
            "sLast": "末页"
        },
        "oAria": {
            "sSortAscending": ": 以升序排列此列",
            "sSortDescending": ": 以降序排列此列"
        }
    }
});

# 参考

  • 配置选项 (opens new window)
  • 服务器处理 (opens new window)
  • 设置列的数据源 (opens new window)
  • 国际化 (opens new window)
  • 日期格式化工具 (opens new window)
  • 多条件查询 (opens new window)
上次更新: 5/31/2023, 1:14:42 AM
jQuery iCheck

jQuery iCheck→

最近更新
01
2025
01-15
02
Elasticsearch面试题
07-17
03
Elasticsearch进阶
07-16
更多文章>
Theme by Vdoing
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式