ページング クエリは、データベース内の膨大なデータをセグメントに表示します。ユーザー エクスペリエンスを向上させるために、各ページにはユーザー定義の行数が表示されます。最も重要なことは、データが読み取られたかどうかです。すべてのデータをサーバー ディスクに一度に出力します。メモリ オーバーフローの危険があります。
False ページング: 原理は、すべてのデータをサーバー ディスクに読み込むことです。メモリを使用し、ページをめくってメモリからデータを読み取ります。 長所: シンプルな実装、高いパフォーマンス 短所: データが大きい場合、メモリ オーバーフローが発生しやすいです。
真のページング: データベース (つまり、ディスク) からデータをクエリします。ページをめくるたびに、利点: メモリ オーバーフローを引き起こすのは簡単ではありません。欠点: 実装が複雑で、パフォーマンスが比較的低いです。いくつかの
一般的なページング関数には次のようなものがあります。 ホーム ページ 前のページ 次のページページ 最後のページ 現在のページ数 合計ページ数 合計行数 データは何ページにジャンプしますか? 1 ページあたりのページ数 このデータをクエリして、アイデアを具体化するオブジェクトにカプセル化する必要があります。カプセル化を強化し、多くの複雑なコードを節約します
##ページングに渡す必要があるパラメータ##必要なパラメータユーザーによって渡されます:
currentPage: 現在のページ、どのページにジャンプするか、最初にアクセスするときにオブジェクトを作成します、デフォルト値は 1pageSize: each 表示されるデータの行数
1. の製品情報現在のページ
2. ホームページはどのページですか?3. 前のページはどのページですか?
4. 次のページは何ページですか?
5. 合計ページは何ページありますか? ? 最後のページの値は同じです
6. データは全部で何個 (行) ありますか?
7. 現在のページは何ページですか?
8. データは何個ありますか?情報は各ページに表示されますか?
ユーザーのアップロードから取得: 現在のページ、データの数
各ページに表示されるデータの総数、各ページに表示される製品情報データベースクエリから取得:データの総数、各ページに表示される製品情報
上記の既知の情報の計算に基づいて取得:総ページ数、前ページ、次ページ
データベースからクエリする SQL ステートメントを作成します
データベース内の最初の SQL クエリデータはいくつありますか?COUNT の後にスペースを入れることはできませんSELECT COUNT(*) FROM 表名
# 第一个 ?:从哪一个索引的数据开始查询(默认从 0 开始) # 第二个 ?:查询多少条数据 SELECT * FROM 表名 LIMIT ?, ?
product テーブルに 21 個のデータがあり、各ページが 5 つのデータに分割されているとします。
データの最初のページをクエリします: SELECT * FROM product LIMIT 0, 5
2 ページ目のデータのクエリ: SELECT * FROM product LIMIT 5, 5
3 ページ目のデータのクエリ: SELECT * FROM product LIMIT 10, 5
4 ページ目のデータのクエリ: SELECT * FROM product LIMIT 15, 5
ルールを検索すると、最初の? 値は (currentPage - 1) * pageSize から取得され、2 番目の? 値は
pageSize から取得されます。つまり、それらはすべてページングから取得されます。ユーザーによって渡されたパラメータ。
前ページと次ページの合計ページ数
// 优先计算总页数 int totalPage = rows % pageSize == 0 ? rows / pageSize : rows / pageSize + 1; //上一页等于当前页-1,但不能超过1页界限 int prevPage = currentPage - 1 >= 1 ? currentPage - 1 : 1; //下一页等于当前页+1,但不能超过总页数界限 int nextPage = currentPage + 1 <= totalPage ? currentPage + 1 : totalPage;
ページング クエリの実装
アクセス プロセス: #表示する必要があるデータをカプセル化するデータがカプセル化されていない場合は、各データをスコープに格納する必要があります。データが分散しすぎて一元管理するには不便です
/** * 封装结果数据(某一页的数据) */ @Getter public class PageResult{ // 两个用户的输入 private int currentPage; // 当前页码 private int pageSize; // 每页显示的条数 // 两条 SQL 语句执行的结果 private int totalCount; // 总条数 private List data; // 当前页结果集数据 // 三个程序计算的数据 private int prevPage; // 上一页页码 private int nextPage; // 下一页页码 private int totalPage; // 总页数/末页页码 // 分页数据通过下面构造期封装好 public PageResult(int currentPage, int pageSize, int totalCount, List data) { this.currentPage = currentPage; this.pageSize = pageSize; this.totalCount = totalCount; this.data = data; // 计算三个数据 this.totalPage = totalCount % pageSize == 0 ? totalCount / pageSize : totalCount / pageSize + 1; this.prevPage = currentPage - 1 >= 1 ? currentPage - 1 : 1; this.nextPage = currentPage + 1 <= this.totalPage ? currentPage + 1 : this.totalPage; } }
Mybatisが提供する操作メソッドはパラメータを1つだけ渡してSQLを実行することができます。タスクを実行し、現在特定のページのデータをクエリしています。そのページがどのページであるか、およびページあたりのデータの数の 2 つのパラメータを知る必要があるため、これら 2 つのパラメータをオブジェクトにカプセル化する必要があります
Writeこれらのクエリ データをカプセル化するクラス (クエリ オブジェクト クラスという名前)@Setter @Getter /** * 封装分页查询需要的两个请求传入的分页参数 */ public class QueryObject { private int currentPage = 1; // 当前页码,要跳转到哪一页的页码(需要给默认值) private int pageSize = 3; // 每页显示条数(需要给默认值) }
//DAO接口提供两个根据查询对象的查询方法 int queryForCount(); ListqueryForList(QueryObject qo); //DAO实现类 @Override //查询数据库总数据条数 public int queryForCount() { SqlSession session = MyBatisUtil.getSession(); int totalCount = session.selectOne("cn.xxx.mapper.ProductMapper.queryForCount"); session.close(); return totalCount; } @Override //查询某一页的结果集 public List queryForList(QueryObject qo) { SqlSession session = MyBatisUtil.getSession(); List products = session.selectList("cn.xxx.mapper.ProductMapper.queryForList",qo); session.close(); return products; }
Modify productMapper.xml
Modify QueryObject .java
getStart メソッドをこのクラスに追加し、現在のページに基づいてデータベースから表示する必要がある各ページの行サイズを返します。
@Setter @Getter /** * 封装分页查询需要的两个请求传入的分页参数 */ public class QueryObject { private int currentPage = 1; // 当前页码,要跳转到哪一页的页码(需要给默认值) private int pageSize = 3; // 每页显示条数(需要给默认值) // 用于 Limit 子句第一个 ? 取值 public int getStart(){ return (currentPage - 1) * pageSize; } }
永続層 DAO を呼び出してデータ クエリを完了し、複数のデータを 1 つのオブジェクトにカプセル化します
//IProductService接口 public interface IProductService { /** * 完成查询某一页的业务逻辑功能 */ PageResultquery(QueryObject qo); } //Service实现类 public class ProductServiceImpl implements IProductService { private IProductDAO productDAO = new ProductDAOImpl(); @Override public PageResult query(QueryObject qo) { // 调用 DAO 查询数据数量 int totalCount = productDAO.queryForCount(); // 为了性能加入判断,若查询的数据数量为 0,说明没有数据,返回返回空集合,即集合中没有 元素 if(totalCount == 0){ return new PageResult(qo.getCurrentPage(), qo.getPageSize(), totalCount, Collections.emptyList()); } // 执行到这里代表有数据,查询当前页的结果数据 List products = productDAO.queryForList(qo); return new PageResult(qo.getCurrentPage(), qo.getPageSize(), totalCount, products); } }
1. バックグラウンド テストに合格するためには、最初にビジネス層コンポーネントを完了する必要があります。
2. MVC の考え方に従います。3. ブラウザはページング リクエスト パラメータ (どのページに移動するか/ページあたりのデータの数) を送信し、これらのパラメータをサーブレットで受け取り、カプセル化します
4. QueryObject オブジェクトに対して、サービスのページング クエリ メソッド (クエリ)。
5. 取得したページングクエリ結果オブジェクト(PageResult)をリクエストスコープ内で共有し、JSPにジャンプして表示します。
6. JSP ページを変更し、ページング バーの情報を書き出します (ページング バーの情報は PageResult オブジェクトから取得されます)。
1 を表示します。ページ リクエスト パラメータを取得し、クエリ操作であることを判断し、クエリ メソッドを呼び出し、ページング パラメータを取得します。
2. パラメータは QueryObject にカプセル化されます3. ビジネス レイヤー メソッドを呼び出してデータの特定のページをクエリします
4. クエリ結果をスコープに保存します
5. 表示ページに転送しますjsp
6. jsp のスコープから結果を取得し、ブラウザに応答します
//创建业务层对象 private IProductService productService = new ProductServiceImpl(); protected void list(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { QueryObject qo = new QueryObject(); // 获取请求参数 currentPage,并转型封装 String currentPage = req.getParameter("currentPage"); if(StringUtil.hasLength(currentPage)) { qo.setCurrentPage(Integer.valueOf(currentPage)); } // 获取请求参数 pageSize,并转型封装 String pageSize = req.getParameter("pageSize"); if(StringUtil.hasLength(pageSize)) { qo.setPageSize(Integer.valueOf(pageSize)); } // 调用业务层方法来处理请求查询某一页数据 PageResultpageResult = productService.query(qo); // 把数据共享给 list.jsp req.setAttribute("pageResult", pageResult); // 控制跳转到 list.jsp 页面 req.getRequestDispatcher("/WEB-INF/views/product/list.jsp").forward(req, resp); }
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>产品列表
添加
# ##よくある質問#### ##
ページめくり操作は成功したが、数ページ後にめくれなくなった場合は、Tomcat を再起動することによってのみめくることができます。問題: SqlSession オブジェクトが DAO で閉じられていません
以上がJavaを使用してページングクエリ機能を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。