スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Spring MVC Spring Data JDBCを使って検索する

前回JPAを使って検索できるようにしてみたので、今回JDBCを使って、同様に検索できるようにしてみる。
なお、掲載内容については、全レコードを取得する記事との差分をメインとする。

■全レコードを取得する記事
Spring MVC Spring Data JDBCを使ってみる

また、コントローラ(BookController.java)、検索条件を格納するオブジェクト(BookSearchForm.java)、JSP(list.jsp)については、前回のJPAの記事を参考にしてほしい。

■JPAを使って検索する前回の記事
Spring MVC Spring Data JPAを使って検索する

◎動作検証にあたっての各バージョンは以下の通り
  • SpringFramework 3.2.8.RELEASE
  • Java 1.7
  • Tomcat 7.0

1.BookDao.java


package jp.co.sample.book.dao;

import java.util.List;

public interface BookDao<T> {

List<T> findAll();
List<T> findByNameLike(String name);
}

BookDaoインターフェース。「findByNameLike」が今回実装する検索用メソッド。

2.BookDaoImplTemplate.java


package jp.co.sample.book.dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;

import jp.co.sample.book.entity.BookEntity;

@Repository
public class BookDaoImplTemplate implements BookDao<BookEntity> {

private static Logger logger = LoggerFactory.getLogger(BookDaoImplTemplate.class);

@Autowired
private JdbcTemplate jdbcTemplate;

@Override
public List<BookEntity> findAll() {
logger.info("findAll start");
String sql = "SELECT * FROM Book";
List<BookEntity> entities = jdbcTemplate.query(sql, new RowMapper<BookEntity>() {
public BookEntity mapRow(ResultSet rs, int rowNum) throws SQLException {
BookEntity entity = new BookEntity();
entity.setBookId(rs.getLong("book_id"));
entity.setBookName(rs.getString("book_name"));
entity.setPrice(rs.getInt("price"));
return entity;
}
});
return entities;
}

@Override
public List<BookEntity> findByNameLike(String name) {
logger.info("findByNameLike start");
String sql = "SELECT * FROM Book WHERE book_name LIKE '%'||?||'%'";
List<BookEntity> entities = jdbcTemplate.query(sql, new RowMapper<BookEntity>() {
public BookEntity mapRow(ResultSet rs, int rowNum) throws SQLException {
BookEntity entity = new BookEntity();
entity.setBookId(rs.getLong("book_id"));
entity.setBookName(rs.getString("book_name"));
entity.setPrice(rs.getInt("price"));
return entity;
}
},name);
return entities;
}
}

「findByNameLike」メソッドの実装。「mapRow」メソッドについては全レコードを取得する記事にて記載しているため割愛する。
SQLを見てもらえれば分かるが、「WHERE book_name LIKE '%'||?||'%'"」と条件を指定すれば部分一致検索ができる。また、「?」にバインドするパラメタとして、「jdbcTemplate.query」メソッドの第3引数に「name」を追加している。

3.BookService.java


package jp.co.sample.book.service;

import java.util.List;

public interface BookService<T> {

List<T> findAll();
List<T> findByNameLike(String name);
}


4.BookServiceImpl.java

package jp.co.sample.book.service;

import java.util.List;

import jp.co.sample.book.dao.BookDao;
import jp.co.sample.book.entity.BookEntity;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

@Service
public class BookServiceImpl implements BookService<BookEntity> {

@Autowired
@Qualifier(value="bookDaoImplTemplate")
BookDao<BookEntity> dao;

@Override
public List<BookEntity> findAll() {
return dao.findAll();
}

@Override
public List<BookEntity> findByNameLike(String name) {
return dao.findByNameLike(name);
}
}

「BookDao<BookEntity> dao」で「@Qualifier」アノテーションを使っているのは、BookDaoインターフェースを実装した別クラスが存在するため、どちらを使用するのかを指定している。BookDaoインターフェースを実装したクラスがひとつであれば「@Qualifier」アノテーションは不要。

5.動作確認
①検索初期画面

検索

②検索結果
検索結果

JPAの場合と同様に、正しく検索できることが確認できた。
ちなみに小文字の「aop」の場合、ヒットしない。また、未入力で検索した場合は、全件取得される。
また、URLに「?bookName=AOP」のクエリ文字列が追加され、GETメソッドで実行されていることも確認できる。


■過去のSpring関連記事
Spring関連記事 Index

スポンサーサイト

コメントの投稿

非公開コメント

プロフィール

bookmount8

Author:bookmount8
システムエンジニア。サーバーサイドでjavaを扱うことが多い。最近は、ミドルやフロント周りも関心あり。

最新記事
カテゴリ
検索フォーム
最新コメント
月別アーカイブ
これまでの訪問者数
ブロとも申請フォーム

この人とブロともになる

RSSリンクの表示
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。