大きな話のページ分け(一)


ページングは人間的な機能であり、データを大量に表示するソリューションでもあります.しかしながら、ページング機能の実現において、ページングは多様である.では、私たちがプロジェクトで使うとき、私はどのような方法でページを分けるべきですか?次に、ページングクエリのさまざまな実装をまとめ、比較して、使用するときに良い選択をします(本稿では、真のページングのみを議論し、以下で説明するページングも特に真のページングを指します).
ページング共通性
ページごとに、どのように実現しても、何番目のデータから何番目のデータまでの考え方で実現されます.2つのパラメータが必要です.
PageNo:現在のページ番号;
PaseSize:各ページに表示されるデータ.
3つのデータのページング方式の比較
MySqlデータベースの特色ページ
最も簡単な方法はmysqlデータベースのlimit関数を使用してページを分割することです.
Limit[offset],rowsはMysqlデータベースのM番目のレコードからN番目のレコードを取得できる文は次のとおりです.
select*fromテーブル名limit M,N
テーブルSys_からoption(プライマリ・キーがsys_id)では、10番目のレコードから20個のレコードを検索します.文は次のとおりです.
select * from sys_option order by sys_id limit 10,20
Oracleデータベースの共通ページング
Oracleでは、3つのネストされたクエリが頻繁に使用されます.
select * from (select T.*,rownum rn from (select * from table order by id) T where rownum =(PageNo-1)*PageSize
PageNoは現在のページ数です.
PageSizeは、1ページあたりのデータ数を表示します.
クエリーは、(PageNo-1)*PageSizeバーデータからPageNo*PageSizeバーデータまでです.
例:t_からstudentテーブルから20~40番目のデータを取り出す
select * from (select A.*,rownum rn from (select * from t_student order by id) A where rownum <41) where rn >=20
質問Oracleでは、なぜ3つのネストされたクエリーを使用してページングを実装するのですか?
これはOracleデータベースのプロパティに関連しており、rownumのデフォルトは1からです.ネストされたクエリーが適用されない場合は、次の文を書きます.
select rownum,id from (select * from t_student order by id) where rownum >=m and rownum < n; 
rownum>mかつm>1を実行すると、rownumはデフォルトで1となるため、これは成立しない条件であるため、データが検出されないため、3層ネスト文を用いてrownumを一時テーブルのフィールドにし、oracleデータ特性の制限はありません.
SqlServerデータ共通ページング
1ページ目の5つのデータをクエリーしたほうがクエリーしやすいですが、2ページ目のデータをどのようにクエリーしますか(つまり6~10番目のレコードです).
2ページ目のレコードは、この1ページ目に表示されたレコードに続く5つのレコード、すなわちuserIDフィールドを降順に並べ替えることで、1ページ目のデータを除いた5つのレコード、すなわち、それらのuserIDは1ページ目のUserIDの中になく、SQL文にnot inというものがあるのがちょうど役に立つ.まず、UserIDを降順に並べ替えて、前のページで使用したデータのUserIDを検索します.SQL文と実行結果は以下の通りです.
select top 5 * from t_User where userID not in (select 5 userID from t_User order by userID asc) order by userID asc
userIDは1から始まるので、userIDは1~5のレコードが1ページ目に表示され、userIDが6~10のレコードが2ページ目に表示され、userIDが11~15のレコードが3ページ目に表示される……というように、1ページあたり5つのレコードが表示される場合、nページ目に表示されるデータレコードの式は、
select top 5 * from t_User where userID not in (select top(n-1)*5 userID from t_User order by userID asc) order by userID asc
Hibernateフレームワークのページング
上記から、各データには独自の特色のあるコンテンツがあり、ページング機能を完了することができます.Hibernateフレームワークはこれに基づいてカプセル化され,QueryインタフェースにおけるsetMaxResultssetとFirstResultメソッドのみでページングが完了する.Hibernateを採用するメリットは、mysqlデータベースを使用すると、HibernateはMysqlのルールに従って対応するページング文を生成します.Oracleデータベースを使用すると、対応するOracleページング文も生成されます.すなわち,Hibernateフレームワークはページングを実現し,特定のデータベースとは無関係であり,データベースの交換に有利である.
次に、Hibernateがページングを実装するツールクラスの主な方法を示します.
public class AbstractPageManager extends HibernateDaoSupport {

	/**
	 *   HQL  ,         HQL    : 
	 * select ... from Organization o where o.parent is null 
	 *     ,    : 
	 * select count(*) from Organization o where o.parent is null
	 * 
	 * @param hql
	 * @return
	 */
	private String getCountQuery(String hql) {
		//   from   
		int index = hql.indexOf("from");

		//   :        SQL  
		if (index != -1) {
			return "select count(*) " + hql.substring(index);
		}
		throw new SystemException("   HQL    ");
	}
	
	/**
	 *   HQL        
	 * 
	 * @param hql HQL  
	 * @param params HQL        
	 * @param offSet           
	 * @param pageSize        
	 * @return
	 */
	public PageModel searchPaginate(String hql, Object[] params, int offSet,
			int pageSize) {
		//     
		String strCount = getCountQuery(hql);

		//     
		Query query = getSession().createQuery(strCount);
		//  HQL            Query
		if (params != null && params.length > 0) {
			for (int i = 0; i < params.length; i++) {
				query.setParameter(i, params[i]);
			}
		}

		//       
		int intCount = ((Long) query.uniqueResult()).intValue();

		//   Organization  
		query = getSession().createQuery(hql);
		//  HQL            Query
		if (params != null && params.length > 0) {
			for (int i = 0; i < params.length; i++) {
				query.setParameter(i, params[i]);
			}
		}
		/*
		 * offSet             
		 * pageSize          
		 */
		query.setFirstResult(offSet);
		query.setMaxResults(pageSize);

		//  PageModel
		PageModel pageModel = new PageModel();
		pageModel.setDatas(query.list());
		pageModel.setTotal(intCount);
		
		return pageModel;
	}
}

以上から分かるように、MySql、Oracle、SqlServerの3つのデータベースが共通している点と、独自の特色のある内容があります.データベース固有の文を使用すると、データベースの移植には不利です.Hibernateフレームワークはこれに基づいてカプセル化され、setMaxResultsset()とFirstResult()メソッドでoffSetとpageSizeを設定するだけで、データベースに基づいて特色文を生成することができ、具体的に興味のある学生が自分でHibernateソースコードを研究することができることを実現することができ、私はここで貼り付けません.
未完待機.