ObjectAPI形式で戻り値を自分でハンドリングする その2
JDBIを普通に使ってると、DaoとModelが別ファイルになっちゃうのですが、一応こうやれば同じクラスで実装できます。でもあまりよろしく無さそうですね。
Table002.java
public class Table002 { private int id; private String name; public Table002(){} public Table002(int id, String name) { this.id = id; this.name = name; } public static class Table002Mapper implements ResultSetMapper<Table002> { @Override public Table002 map(int index, ResultSet r, StatementContext ctx) throws SQLException { return new Table002(r.getInt("id"), r.getString("name")); } } @SqlQuery("select * from table001") @RegisterMapper(Table002Mapper.class) public List<Table002> findAll(){return null;} public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
Sample011.java
public static void main(String[] args) { String url = "jdbc:postgresql://192.168.52.128/jdbi"; DBI dbi = new DBI(url, "jdbi_user", "jdbi_pass"); Table002 table002 = dbi.onDemand(Table002.class); List<Table002> rows = table002.findAll(); System.out.println("rows count = " + rows.size()); for( Table002 row : rows ) { System.out.println("id = " + row.getId() + ", name = " + row.getName()); } }
Table002.findAll() が全てなのですが、普通の実体クラスなので実装を書かないとコンパイルエラーになります。とは言え、このメソッドのコードは全く実行されませんので、return null; とだけ書いてます。
ちなみに、Table002 を abstract にすると、今度は new できないので、やっぱり上手くいきません。やっぱり素直にDaoとModelを分割するのが良さそうです。