Spring Boot 6 データベース操作

JPAとは

Java Persistence API
永続化ライブラリ
マッピングされたデータベースオブジェクトを操作可能

共通

pom.xml

※pom.xml

<project ~>
 ~<br/>
 <dependencies>
  ~
  
  <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-jpa</artifactId>
  </dependency>
  
  オープンソースDB
  <dependency>
   <groupId>org.hsqldb</groupId>
   <artifactId>hsqldb</artifactId>
   <scope>runtime</scope>
  </dependency>
  
 </dependencies>
</project>

エンティティクラス

※MyData.java

@Entity
@Table(name="myTable")
public class MyData {
 @Id
 @GeneratedValue(strategy = GenerationType.AUTO)
 @Column
 private long id;

 @Column(length = 50, nullable = false)
 private String name;

 public long getId() {
  return id;
 }
 public void setId(long id) {
  this.id = id;
 }

 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
}

テンプレート

※index.html

<!DOCTYPE html>
<html xmsns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8" />
<title>DBTest</title>
</head>
<body>
 <form method="post" action="/" th:object="${formModel}">
  <input type="text" name="name" th:value="*{name}" /><br/>
  <input type="submit" name="登録" />
 </form>
 <table>
  <tr><td>ID</td><td>名前</td></tr>
  <tr th:each="obj : ${datalist}">
   <td th:text="${obj.id}"></td>
   <td th:text="${obj.name}"></td>
  </tr>
 </table>
</body>
</html>

リポジトリ方式

流れ

リポジトリクラス

JpaRepositoryクラス
 saveAndFlush();
 findAll();

※MyRepository.java

@Repository
public interface MyRepository extends JpaRepository<MyData, Long> {
 独自検索機能の(自動)実装
 MyRepositoryインターフェースを実装したクラスでのメソッド記述は不要
 Idという名前からエンティティクラスのカラムをfindする処理を自動生成する

 public MyRepository findById(Long id)
}

コントローラー

※HelloController.java
@Controller
public class HelloController {
 @Autowired
 MyRepository repository;

 @RequestMapping(value = "/", method = RequestMethod.GET)
 public ModelAndView index(ModelAndView model){

  リポジトリの検索メソッドを利用
  Iterable<MyData> list = this.repository.findAll();

  model.setViewName("index");
  model.addObject("datalist", list);
  return model;
 }

 @RequestMapping(value = "/", method = RequestMethod.POST)
 @Transactional(readOnly=false)
 public ModelAndView form(
   MyDataのインスタンスを自動作成。POST元のth:objectで指定

   @ModelAttribute("formModel") MyData mydata,
   ModelAndView model){

  mydata.name = "C#";
  repository.saveAndFlush(mydata);

  return new ModelAndView("redirect:/");
 }
 
 @RequestMapping(value = "/", method = RequestMethod.POST)
 @Transactional(readOnly=false)
 public ModelAndView form(
  エンティティを用いない場合
  String name
  ModelAndView model){

  return new ModelAndView("redirect:/");
 }
}

EntityManager

DAOインターフェイス

※MyDataDao.java
public interface MyDataDao<T> extends Serializable {
 public List<T> getAll();
}

DAOクラス

※MyDataDaoImpl.java
public class MyDataDaoImpl implements MyDataDao<MyData> {
 private EntityManager entityManager;

 public MyDataDaoImpl() {
  super();
 }

 public MyDataDaoImpl(EntityManager manager) {
  this.entityManager = manager;
 }

 @Override
 public List<MyData> getAll() {
  Query query = this.entityManager.createQuery("from MyData");
  List<MyData> list = query.getResultList();
  this.entityManager.close();
  return list;
 }
}

コントローラー

※HelloController.java
@Controller
public class HelloController {
 EntityManagerの自動インスタンス化
 @PersistenceContext
 EntityManager entityManager;

 MyDataDaoImpl dao;

 コンテナの初期化時に自動実行
 @PostConstruct
 public void init(){
  this.dao = new MyDataDaoImpl(this.entityManager);
 }

 @RequestMapping(value = "/", method = RequestMethod.GET)
 public ModelAndView index(ModelAndView model){

  DAOの検索メソッドを利用
  Iterable<MyData> list = this.dao.getAll();

  model.setViewName("index");
  model.addObject("datalist", list);
  return model;
 }

 @RequestMapping(value = "/", method = RequestMethod.POST)
 @Transactional(readOnly=false)
 public ModelAndView form(
   MyDataのインスタンスを自動作成。POST元のth:objectで指定

   @ModelAttribute("formModel") MyData mydata,
   ModelAndView model){

  mydata.name = "C#";
  repository.saveAndFlush(mydata);

  return new ModelAndView("redirect:/");
 }
}

サービス層

リポジトリクラス

※MyRepository.java
@Repository
public interface MyRepository extends JpaRepository<MyData, Long> {}

サービスコンポーネント

※MyDataService.java
@Service
public class MyDataService {
 @PersistenceContext
 private EntityManager entityManager;
 public List<MyData> getAll(){
  return (List<MyData>)this.entityManager
   .createQuery("from MyData").getResultList();
 }
}

コントローラー

※HelloController.java
@Controller
public class HelloController {
 @Autowired
 private MyRepository repository;

 @Autowired
 private MyDataService service;

 @PostConstruct
 public void init(){
  MyData data1 = new MyData(); data1.setName("Java");
  this.repository.save(data1);

  MyData data2 = new MyData(); data2.setName("C#");
  this.repository.save(data2);

  MyData data3 = new MyData(); data3.setName("PHP");
  this.repository.save(data3);
 }

 @RequestMapping(value = "/", method = RequestMethod.GET)
 public ModelAndView index(
   @ModelAttribute("formModel") MyData mydata,
   ModelAndView model){

  Iterable<MyData> list = service.getAll();

  model.setViewName("index");
  model.addObject("datalist", list);

  return model;
 }
}