エンティティ
itemテーブル構造のクラスItemを作成します。これによりO/Rマッピングの利用が可能になります。またitemテーブルを読み込んだ際の受け皿として利用します。Spring Bootではこのクラスのことを「エンティティー」と呼びます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
package com.example.demo; import org.springframework.data.annotation.Id; public class Item { @Id private Integer id; private Integer kind; private String name; private Integer price; public Integer getId() {return id;} public void setId(Integer id) {this.id = id;} public Integer getKind() {return kind;} public void setKind(Integer kind) {this.kind = kind;} public String getName() {return name;} public void setName(String name) {this.name = name;} public Integer getPrice() {return price;} public void setPrice(Integer price) {this.price = price;} public Item() { } } |
7行目~10行目のようにテーブルitemと同名の変数を定義します。
7 8 9 10 |
private Integer id; private Integer kind; private String name; private Integer price; |
6行目の「@id」は、次の行(Integer id)がこのテーブルのキーであることを意味します。
6 |
@Id |
あとはゲッター/セッター、引数無しのコンストラクタを作成すれば完成です。
リポジトリ
実際にデーターベースを操作するクラスItemDaoを作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
package com.example.demo; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Repository; @Repository public class ItemDao { private Item item = new Item(); private String priceEdit; private String kindName; public Item getItem() {return item;} public void setItem(Item item) {this.item = item;} public String getPriceEdit() {return priceEdit;} public void setPriceEdit(String priceEdit) {this.priceEdit = priceEdit;} public String getKindName() {return kindName;} public void setKindName(String kindName) {this.kindName = kindName;} private JdbcTemplate jdbcTemplate; public ItemDao() { } @Autowired public ItemDao(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } public ItemDao[] findAllItem() { List<Map<String, Object>> ret = jdbcTemplate.queryForList("SELECT item.id,item.name,item.kind,kind.name AS kindname,item.price FROM item ,kind WHERE item.kind = kind.id"); List<ItemDao> data = new ArrayList<ItemDao>(); for(Map<String, Object> each: ret) { ItemDao d = new ItemDao(); d.getItem().setId((Integer)each.get("id")); d.getItem().setName((String)each.get("name")); d.getItem().setKind((Integer)each.get("kind")); d.getItem().setPrice((Integer)each.get("price")); d.setKindName((String)each.get("kindName")); d.priceEdit = String.format("%,3d", (Integer)each.get("price")); data.add(d); } return data.toArray(new ItemDao[data.size()]); } } |
11行目の「@Repository」でこのクラスがデータベース操作であることを宣言しています。
11 |
@Repository |
テーブルitemには種類IDはありますが、種類名の情報はありません。そのためテーブルkindを結合し情報を取得します。また金額もカンマ編集されていないため別変数を設け対応します。itemテーブルの内容、種類名、カンマ編集後金額の定義が14行目~16行目です。ここでイメージして頂きたいのはこのクラス自体が商品情報の1件に対応するクラスということです。
14 15 16 |
private Item item = new Item(); private String priceEdit; private String kindName; |
テーブルアクセスクラスjdbcTemplateのインスタンス化の方法が特殊な方法となっています。コンストラクタの引数でインスタンスを受け取りそれを設定しています。現在はこの方法が推薦されています。
1 2 3 4 5 6 7 8 9 |
private JdbcTemplate jdbcTemplate; public ItemDao() { } @Autowired public ItemDao(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } |
37行目がデータアクセス命令です。SQLを引数にしてメソッドqueryForListを実行しています。戻り値はList<Map<String, Object>> 型になります。
37 |
List<Map<String, Object>> ret = jdbcTemplate.queryForList("SELECT item.id,item.name,item.kind,kind.name AS kindname,item.price FROM item ,kind WHERE item.kind = kind.id"); |
戻り値を件数分、各項目毎に設定していきます。そのためこのクラスのList型の配列を用意します。
38 |
List<ItemDao> data = new ArrayList<ItemDao>(); |
40行目から戻り値の件数分ループします。そしてクラスItemDaoに各項目設定し、List型の配列に追加していきます。
40 41 42 43 44 45 46 47 48 49 |
for(Map<String, Object> each: ret) { ItemDao d = new ItemDao(); d.getItem().setId((Integer)each.get("id")); d.getItem().setName((String)each.get("name")); d.getItem().setKind((Integer)each.get("kind")); d.getItem().setPrice((Integer)each.get("price")); d.setKindName((String)each.get("kindName")); d.priceEdit = String.format("%,3d", (Integer)each.get("price")); data.add(d); } |
最後の50行目は、呼び出し元へデータが取扱いやすいように通常の配列に変換し返しています。
50 |
return data.toArray(new ItemDao[data.size()]); |