SpringBootでCRUDを試してみた①~Java編~

スポンサーリンク

開発環境

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を作成していきます。

タイトルとURLをコピーしました