さあ、検索もできたし、削除機能に移るぞ、ってことで。

検索結果一行毎に削除ボタンおいて、クリックされた本の情報を削除する、
というのが願い。

で、早速やってみました。ボタン作るのはさすがにすぐできる。action=サーブレットにしといてと。
検索結果は変数に入れてあるから、削除ように作ったメソッドに引数として連れてきて、SQLに埋め込んで実行、と。

こんな感じか?試しに削除ボタンをポチ。

エラー。

だろうな。ショックじゃないですよっと。
適当に直してもう一回実行っと。

すると。検索しても一件もヒットせず、結果画面は真っ白。

え?なんで?SQL文間違えた?いやそんなはずない。さっきまで普通に検索してくれたSQLなのに。
あ~、変なとこいじっちゃった~と思い、直したところを元に戻すも、やはり検索ヒットせず。

え、せっかく作った検索システム、もう壊した?
まずい。

慌ててコードの中のselect文をコピーして、psqlのほうで実行。
すると。

レコードが激減していました。
え、いつデータ消えたんだ?

あ、さっき削除をポチしたときか。
エラー画面にはなったけど、SQLはちゃんと実行され、DBにも反映されてた様子。つまり単純に、レコード消すプログラムはできてたわけだ!

なんで全部消えるんだよという気持ちより、消せるプログラムを一日かからず書けたことに感動しました(笑)。

いや、直さなきゃだけど。
今日は週末なので、先輩と進捗ミーティング。

ふと、どんなコード書いてるの?という質問を受け、?を入れたSQL文を書いて変数に入れて、違うメソッドで?に代入してます~みたいなことを答えたら

美しくないかも、という一言。
はい。何となくそれは感じてました。

そんなわけで、月曜日はコードレビューから始めることに。

醜いコードを晒すことにはなりそうだけど、誰かに見てもらうって、心強いなあ。

金曜日なのでなんとなくふわふわしてる儒艮でした。
出来上がった途端、久しぶりに「キターーーー!!」とか言ってしまった。

昨日詰まってたのは、PreparedStatementの
pstmt.set(1,入力された値);

のところになぜか入力値が格納されなくて、エラーはないけど正確な検索結果が得られなかったというところ。

ところが、プログラムはきちんと既に動いていたのです。

私は書籍名をキーワード検索していたつもりが、コードの中のSQLが

select * from bookDB
where title = ?

になってた。全文一致しないとレコード出てこないようになってた!
試しに入力欄に本の名前そっくり入れて検索かけたら、ずばりヒット。

なあんだ…SQLをlike検索に直せば終わるじゃん。

これで書籍名のキーワード検索は完成。

で、書籍名と著者とか、二つの項目でand検索したいときはどうすんの?
これは案外簡単。

だってPreparedStatementのSQL文を

select * from bookDB
where title like ? and author like ?…(以下、検索され得る列名のlike検索をandでつなぐ);

ってしとけばいいだけ。これで入力された部分でand検索してくれます。
入力がないところは「入力値がないよー」とかエラーになりそうなかんじですが、ならなかったです。

そんなわけで、書籍名、著者、出版社、所持している部所でキーワード検索できるサーブレットとJSPができました。

万歳!

空白スペース入れて同じ項目で複数検索とかはできないけど。