開発環境
Eclipse ver2018-09(4.9.0)
Java8
spring boot2.2.0
Gradle
MySQL
プロジェクト作成
ファイル > 新規 > springスタータ-・プロジェクト を選択。
ビルドツールのMavenとGradleはお好みで選択してください。
Bootを使わないSpring FrameworkではMavenを使用していたので、今回はGradleを選択しました。Gradleはbuild.gradleファイルで依存を設定していきます。AndroidStudioではGradleがデフォルトとなっています。
依存関係を選択します。今回はWeb上でCRUDを試したいので下記を選択しました。完了をクリックすれば自動的にプロジェクトが生成されます。
- Spring Web
- Tymeleaf(HTMLテンプレートエンジン)
※Spring Bootでは、jspは推奨しておりません。HTMLで記述をしていきます。 - MySQL Driver
- Spring Data JPA(DBをつなぐORMapper)
SQL文が内包されているので、SQL文を書く手間が省けます。 - Lombok
冗長なアクセッサーなどをアノテーションで自動生成する事ができます。 - Spring Boot DevTools
ホットデプロイが可能になります。
DB接続設定
resourcesフォルダ直下にあるapplication.propertiesに書き込んでいきます。Bootを使用しない時は、serverのxmlやBeans定義ファイルをあちこち設定していたので、applicationファイルだけを記述すればOKという楽さに感動しました。
さすが、tomcat内包のスタンドアローン。。。素敵すぎます。
spring.datasource.url=jdbc:mysql://localhost:3306/DB名?serverTimezone=UTC spring.datasource.username=root spring.datasource.password=password spring.jpa.database=MYSQL spring.jpa.hibernate.ddl-auto=update
Entity Classの作成
EntityClassはデータの入れ物をなるクラスです。DomainClassと同等な感覚です。
@Entity @Table(name="member") @NoArgsConstructor @AllArgsConstructor @Getter @Setter public class Member{ @Id @Column(name="id") @GeneratedValue(strategy=GenerationType.IDENTITY) private Integer id; @Column(name="name") private String name; @Column(name="age") private Integer age; }
Repository Interfaceの作成
継承しているJpaRepositoryにはJQPL(SQL文)の簡易クエリが搭載されています。このクラスを継承する事によりSQL文を書く手間が省けます。
JpaRepository<Entityクラス名,idのtype>
@Repository public interface MemberRepository extends JpaRepository<Member,Integer>{}
Service Classの作成
CRUDの機能を実装してゆきます。
※findOne()メソッドについて
findOne()を使用する際には、戻り値がOptional型になります。
Optional型とは値がnullであっても保持することができる型です。(ぬるぽ回避)
そのため、値がnullでない時にはget()で値を返す必要があります。(if文の部分)
ifで使われているisPresent()はOptional型に保持されている値がnull以外の時に「true」を返します。
この機能を使って、値をget()に受け渡してください。
@Service @Transactional(rollbackOn=Exception.class) public class MemberService{ @Autowired MemberRepository repository; public List<Member> findAll(){ return repository.findAll(); } public Member findOne(Integer id) { Optional<Member> member = repository.findById(id); if(member.isPresent()) { return member.get(); }else { return null; } } public Member save(Member member){ return repository.save(member); } public void delete(Integer id){ repository.deleteById(id); } }
Controller Classの作成
@Controller @RequestMapping("/member") public class MemberController { @Autowired private MemberService memberService; @GetMapping public String index(Model model) { List<Member> members = memberService.findAll(); model.addAttribute("members", members); return "index"; } @GetMapping("new") public String newMember(Model model) { return "new"; } @GetMapping("{id}/edit") public String edit(@PathVariable Integer id, Model model) { Member member = memberService.findOne(id); model.addAttribute("member", member); return "edit"; } @PostMapping public String create(@ModelAttribute Member member) { memberService.save(member); return "redirect:/member"; } @PostMapping("{id}/edit") public String update(@PathVariable Integer id, @ModelAttribute Member member) { member.setId(id); memberService.save(member); return "redirect:/member"; } @PostMapping("{id}") public String destroy(@PathVariable Integer id) { memberService.delete(id); return "redirect:/member"; } }
次回は、HTMLを作成していきます。