2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【SpringBoot】簡単なアプリを作ってみよう!(3/3) ~DB操作(SpringDataJPA)~

Last updated at Posted at 2021-04-02

この記事は以下の続きです。
SpringBoot2で簡単なアプリを作ってみよう!(2/3) ~画面表示~

第3回目はJPAを使ってDB操作をしていきたいと思います。
#SpringDataJPAとは
一言で言えば、SQLをより扱いやすくするためのライブラリです。
個人的な意見としてのメリット、デメリットは以下となっております。
#####メリット
・SQLを書く必要がない(場合によりますが)
・DB移行時影響が少ない(Oracle→MySQLなど)
・JPAの記述、管理がしやすい

#####デメリット
・動的SQLが初心者には難しい
・副問合せ(サブクエリ)が少し苦手

まずはコードを書いてみて雰囲気をつかんでいただければと思います。

##各クラスを作成する
とりあえず前回同様プロジェクトはこんな感じです。
スクリーンショット 2021-03-27 22.25.27.png
今回はEntityクラス,Repositoryクラス,Serviceクラスを作成していきます。
JPAを利用する場合こちらの三つのクラスを基本的に作成します。
####Entityクラスを作成する
EntityはDBのテーブルと対になっているものを作ります。
役割としては、DBからのレコード取得、アプリ側からのレコード送信の為のデータ保管場所となります。MVCモデルでいうところのM(モデル)です。

Product.java
@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の作成を行います。

ProductRepository.java
@Repository
public interface ProductRepository extends JpaRepository<Product,Integer > {
}

####Serviceクラスを作成する
MVCモデルを勉強したばかりだとControllerとServiceの区別がつきにくいと思いますが、
Controllerクラスはあくまで指令をする役割、Serviceクラスは煩雑な処理等を担当します。

下記コードのfindAllメソッドではレコード全件取得、insertメソッドではレコード登録を行っております。

ProductService.java
@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 画面に値を渡す

AdminController
@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をつけることでループすることができます。

productManage.html
<!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/

以下の画面が表示されれば正常に動いてます!

####◇画面イメージ
スクリーンショット 2021-04-02 8.27.48.png

2
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?