大きな話のページ分け(一)
ページングは人間的な機能であり、データを大量に表示するソリューションでもあります.しかしながら、ページング機能の実現において、ページングは多様である.では、私たちがプロジェクトで使うとき、私はどのような方法でページを分けるべきですか?次に、ページングクエリのさまざまな実装をまとめ、比較して、使用するときに良い選択をします(本稿では、真のページングのみを議論し、以下で説明するページングも特に真のページングを指します).
ページング共通性
ページごとに、どのように実現しても、何番目のデータから何番目のデータまでの考え方で実現されます.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がページングを実装するツールクラスの主な方法を示します.
以上から分かるように、MySql、Oracle、SqlServerの3つのデータベースが共通している点と、独自の特色のある内容があります.データベース固有の文を使用すると、データベースの移植には不利です.Hibernateフレームワークはこれに基づいてカプセル化され、setMaxResultsset()とFirstResult()メソッドでoffSetとpageSizeを設定するだけで、データベースに基づいて特色文を生成することができ、具体的に興味のある学生が自分でHibernateソースコードを研究することができることを実現することができ、私はここで貼り付けません.
未完待機.
ページング共通性
ページごとに、どのように実現しても、何番目のデータから何番目のデータまでの考え方で実現されます.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は現在のページ数です.
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ソースコードを研究することができることを実現することができ、私はここで貼り付けません.
未完待機.