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;
}
}