質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

13132閲覧

LIMIT、OFFSETでのページング作成

kurageno

総合スコア16

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

2クリップ

投稿2015/12/28 07:39

お世話になってます。プログラミング初心者です。
現在、独学でWebアプリケーションで商品を販売するサイトを作成しています。
そこでページング作成をしているのですが、
どうしても躓いてしまいます。
問題点としては
DAOクラスでmysqlのLIMITとOFFSETを使用して10件ずつ表示をアイテムの表示をさせようとしています。
ただアイテム情報を表示させるだけなら可能なのですが、制限を

SELECT * FROM m_item LIMIT 10 OFFSET ?
という形でOFFSETの値を可変で変えてページングを作成していきたいのですが、
このOFFSETの値の変え方がわかりません。
OFFSETは入力したりして変えるものではないですが可変するものなので ? にしてみています。

DAOクラスのソースはこのような形で作成しています。
因みに servlet、DAO、model、jspを使用して作成しています。

稚拙な質問内容ではありますが、ご回答よろしくお願いします。

public class ItemDAO {

private static final String PATH = "jdbc:mysql://localhost/ec_site"; private static final String USER_ID = "root"; private static final String PASSWORD = ""; private static final String DORAIV = "com.mysql.jdbc.Driver"; public List<Item> allItems() { Connection conn = null; List<Item> itemList = new ArrayList<Item>(); try{ Class.forName(DORAIV); conn = (Connection) DriverManager.getConnection(PATH,USER_ID,PASSWORD); String sql = "SELECT * FROM item LIMIT 10 OFFSET ?"; PreparedStatement pStmt = (PreparedStatement) conn.prepareStatement(sql); ResultSet rs = pStmt.executeQuery(); while (rs.next()) { String itemName = rs.getString("item_name"); String itemNumber = rs.getString("item_number"); String price = rs.getString("price"); String image = rs.getString("image"); String stock = rs.getString("stock"); String category = rs.getString("category"); String saleFlag = rs.getString("sale_flag"); String itemId = rs.getString("item_id"); Item item = new Item(itemNumber,itemName,price,image,stock,categoryId,saleFlag,itemId); itemList.add(item); } return itemList; } catch(SQLException e) { e.printStackTrace(); return null; } catch(ClassNotFoundException e){ e.printStackTrace(); return null; } finally { if (conn != null) { try { conn.close(); } catch(SQLException e) { e.printStackTrace(); return null; } } } }

}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

OFFSETに指定する値は、自分で計算します。

どうやって計算するかというと、ページ番号と1ページ当たりの件数から算出します。
具体的には、
OFFSET = 1ページ当たりの件数 × (現在のページ番号 - 1)
です。
現在のページ番号が1の場合、10 × (1 - 1)でゼロになります。
現在のページ番号が2の場合、10 × (1 - 1)10になります。
そうすれば、それぞれそのページで表示したいデータが取れるようになります。

それと同時に、ORDER BYを指定しないと、順序が固定でなくなるので、ORDER BYも指定するようにしてください。

ご質問のDAOに当てはめると、まずallItemsに表示したいページ番号をパラメーターとして渡す必要がありますね。
そして上記の計算を行い、計算結果をOFFSETに設定します。

...

参考リンク:

MySQL:LIMIT句で取得件数を指定してデータ取得 | raining
http://raining.bear-life.com/mysql-2/limit%E5%8F%A5%E3%81%A7%E5%8F%96%E5%BE%97%E4%BB%B6%E6%95%B0%E3%82%92%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%A6%E3%83%87%E3%83%BC%E3%82%BF%E5%8F%96%E5%BE%97

mysql - ORDER BY を指定しない時 / SELECT結果表示並び順 の法則性 - スタック・オーバーフロー
http://ja.stackoverflow.com/questions/11058/order-by-%E3%82%92%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%AA%E3%81%84%E6%99%82-select%E7%B5%90%E6%9E%9C%E8%A1%A8%E7%A4%BA%E4%B8%A6%E3%81%B3%E9%A0%86-%E3%81%AE%E6%B3%95%E5%89%87%E6%80%A7

投稿2015/12/28 07:55

argius

総合スコア9388

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kurageno

2015/12/28 08:04

早急にご返答頂き、ありがとうございます。 参考リンクを計算方法を元に試行錯誤してみます。
kurageno

2015/12/28 23:38

度々失礼します。 昨日はご返答頂き、ありがとうございます。 OFFSETの数値の変換方法は分かりました。 DAOクラスにパラメーターとして渡すのはサーブレットクラスからで良いのでしょうか? まだ始めたばかりで勉強不足もあり、どこに何をどう渡せばよいのかイメージができずにいます。 お手数ですがご教授お願いします。
argius

2015/12/29 00:04

画面でボタンかリンクを押した時に、次に表示させたい「現在のページ番号」をパラメーターとしてサーブレットに渡して、サーブレットからDAOに渡すようにします。 現在のページ番号のパラメーターが渡されない場合は、(デフォルト値として)1をDAOに渡せばOKです。
kurageno

2015/12/29 01:04

早急なご返答、ありがとうございます。 検索結果が何件あるかはCOUNT句でわかる。 検索結果÷1ページに表示する件数(LIMIT)でページ数はわかる。 1ページあたりの件数*(現在のページ番号-1) がoffset ということですよね? ページ番号をサーブレットに渡して、その中でoffsetの計算?処理を行い、結果をDAOクラスへ渡す ということですか?? 何度も申し訳ありません。
argius

2015/12/29 01:06

はい、それでOKです。
kurageno

2015/12/29 01:18

わかりました! ご丁寧に教えて頂き、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問