この記事は以下の続きです。
SpringBoot2で簡単なアプリを作ってみよう!(2/3) ~画面表示~
第3回目はJPAを使ってDB操作をしていきたいと思います。
#SpringDataJPAとは
一言で言えば、SQLをより扱いやすくするためのライブラリです。
個人的な意見としてのメリット、デメリットは以下となっております。
#####メリット
・SQLを書く必要がない(場合によりますが)
・DB移行時影響が少ない(Oracle→MySQLなど)
・JPAの記述、管理がしやすい
#####デメリット
・動的SQLが初心者には難しい
・副問合せ(サブクエリ)が少し苦手
まずはコードを書いてみて雰囲気をつかんでいただければと思います。
##各クラスを作成する
とりあえず前回同様プロジェクトはこんな感じです。
今回はEntityクラス,Repositoryクラス,Serviceクラスを作成していきます。
JPAを利用する場合こちらの三つのクラスを基本的に作成します。
####Entityクラスを作成する
EntityはDBのテーブルと対になっているものを作ります。
役割としては、DBからのレコード取得、アプリ側からのレコード送信の為のデータ保管場所となります。MVCモデルでいうところのM(モデル)です。
@Entity
@Data
@Table(name="product")
public class Product implements Serializable{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String productName;
private int productNum;
}
####Repositoryインターフェースを作成する
RepositoryインターフェースはJpaRepositoryを継承して作成します。
<>の中は\になります。
このインターフェースでSQLの作成を行います。
@Repository
public interface ProductRepository extends JpaRepository<Product,Integer > {
}
####Serviceクラスを作成する
MVCモデルを勉強したばかりだとControllerとServiceの区別がつきにくいと思いますが、
Controllerクラスはあくまで指令をする役割、Serviceクラスは煩雑な処理等を担当します。
下記コードのfindAllメソッドではレコード全件取得、insertメソッドではレコード登録を行っております。
@Service
public class ProductService {
@Autowired
ProductRepository repository;
public List<Product> findAll(){
return repository.findAll();
}
public Product insert(){
Product item = new Product();
item.setProductName("name");
item.setProductNum(100);
return repository.save(item);
}
}
ここまでできましたら、ControllerとHTMLに追記をしていきます。
####Controller追記
@Autowired
を使うことでDIコンテナに登録されているクラスをnewしなくても呼び出すことができます。
productService.findAll()
データ全件取得
model.addAttribute
画面に値を渡す
@Controller
public class AdminController {
@Autowired
ProductService productService;
@GetMapping("/")
public String index(Model model) {
List<Product> productList = productService.findAll();
model.addAttribute("productList",productList);
return "productManage";
}
}
####HTML追記
th:each
をつけることでループすることができます。
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>商品管理</title>
</head>
<body>
<p>商品管理</p>
<table>
<tr>
<th>商品名</th>
<th>商品数</th>
</tr>
<tr th:each="p : ${productList}">
<td>[[${p.productName}]]</td>
<td>[[${p.productNum}]]</td>
</tr>
</table>
</body>
</html>
ここまでできたら画面を確認してみましょう!
http://localhost:8080/
以下の画面が表示されれば正常に動いてます!