Java初学者です。
サイコロを作っておりまして、ログをDBに格納、取り出して表示、という機能を実装しています。
現在ログの検索機能を実装しようとしています。
DBのテーブルにはtimeカラムと、numberカラムがあり、
今回はTimestamp型のtimeに格納されているデータの日付を参照して取得したいです。
jspでformタグを使い、servletで入力されたデータの取得はできています。
入力するデータは、日付のみです。
例)「7」入力 => 7日のログを出力
どうかお力を貸して頂けないでしょうか。
よろしくお願い致します。
追記
不明点
・日付での検索方法
・日付検索のSQL
DBはpostgreSQLを使用しています。
現在のDAOとservletは下記のようになっています。
servlet
//jspから入力データを取得 String date = request.getParameter("date"); DateFormat sdf = new SimpleDateFormat("dd"); List<Map<String, Object>> logList = null; try { Timestamp d = new Timestamp(sdf.parse(date).getTime()); logList = diceDao.searchDiceLog(d); } catch (Exception e) { e.printStackTrace(); } request.setAttribute("log",logList); String path = "index.jsp"; RequestDispatcher dispatcher = request.getRequestDispatcher(path); dispatcher.forward(request,response);
Dao
public List<Map<String, Object>> searchDiceLog(Timestamp date) throws Exception { try { List<Map<String, Object>> list = new ArrayList<>(); Map<String, Object> map = new HashMap<>(); DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); //DB接続 Class.forName("org.postgresql.Driver"); conn = DriverManager.getConnection(url,user,password); conn.setAutoCommit(false); stmt = conn.createStatement(); //データ取得 String sql = "SELECT number,time FROM dice_log WHERE time = ? ORDER BY time DESC"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setTimestamp(1,date); rs = pstmt.executeQuery(); while (rs.next()) { map = new HashMap<>(); map.put("number",rs.getInt(1)); map.put("time",dateFormat.format(rs.getTimestamp(2))); list.add(map); } return list; }
色々と情報が足りない気がします。例えば以下のような点を明示すると回答を得やすくなると思います。(今のままですと、丸投げに近いです)
・「ログをDBに格納、取り出して表示、という機能を実装していて」とあるが、格納と取り出しは既にできていて、「検索」ができないのか。
(つまり、DBへのアクセスはできているけど、日付での検索方法が分からないのか)
・DBは何なのか。(oracle ? mysql? postgres?)
・JDBCを使っているのか、使っていないのか?使い方を含めて分からないのか。
・検索の為のSQLが分かればいいのか。
・上記の一部が分からないのか、あるいは全て分からないのか。
・実際のJavaのコードでは、どこまで自分でできているのか。(DBアクセス部分のコードの提示)
ご指導頂きありがとうございます。
現在のコードなどを追記しました。
質問の仕方を学び、より良いエンジニアになれるように頑張ります。
loadDiceLog と searchDiceLog は実は同じものでしょうか。
同じものです。
申し訳ありません、修正します。
現時点のコードで結構完成していると思うのですが、もしかするともとのコードは別の方が作られたのでしょうか。(ここまで本人が書けているなら、追加もそれほど大変なことには思えないので)
このコードは自分が書いたものです。ただ、ググりながらなんとか書いたもので、完全に理解できていない箇所もあります。
先ほどコードを改善し、servletで受け取ったデータを、Timestamp型でDAOに受け渡しました。しかし、そこからのSQLでの検索が上手く行かず悩んでいました。(本文中のコード修正済み)
>SQLでの検索が上手く行かず
何が原因で「上手く行かない」かは、コンソールに出力されます。
そこを見て、何故か考えてみてください。
それでも何故か理解できなかった場合、エラー文を質問欄に追記してください。
というか、DAO内に明らかに一点エラーを吐きそうな場所が見受けられるのですが
赤い×印等(Eclipse等の場合)が表示されていませんか?
追記:その行、まだエラー吐いてませんか?そしてその真上もエラー吐いてませんか?
DAO内の rs = pstmt.executeQuery(); この部分は修正しました。
何度か手を加えていたため、こちらのコードに反映できていませんでした。申し訳ありません。
現在エラーは出てない状況です。
Connection、ResultSetの宣言が見当たらず、変数(conn rs)のみになっていますが
実際のコードには宣言が存在するのでしょうか。
そして、当初意図してたのはこの部分↓なのですが
pstmt.String(1,date);
本当にエラー吐いていませんか?
try ~ catch()で例外を捕捉したり、エラー内容を出力していないので、エラーが発生しても上位にthrowされているのに気が付いていないかもしれません。
Connection、ResultSetの宣言はメソッド外で宣言しております。
またコメント頂いた部分ですが、
pstmt.String(1,date); => pstmt.setTimestamp(1,date);
と変更しておりました。反映漏れが多くあり、余計な時間をかけてしまい申し訳ありません
そこまでを一度質問欄に反映させた上で
現在発生している問題を見つけましょう。
SQLに関して一例として回答しましたが、tetutetuさんの書かれている「自分で考えること」が一番大事だと思いますので、引き続きがんばってください。
回答1件
あなたの回答
tips
プレビュー