読者です 読者をやめる 読者になる 読者になる

とあるエンジニア系ライダーの日常

Webエンジニアの話、バイクの話

SpringBoot,Thymeleaf,JpaRepositoryで基本構成を作ってみた

あけましておめでとうございます!

SpringBoot、前から気になるなぁと思っていたので、

年末にちょこっと触ってみた。

SpringBootとはとかはハショリます。

今年は週1ぐらいでブログ書きたいなぁと。勉強するために!

 

とりあえずmavenで必要なものを突っ込んでみる

STS(簡単にSpringBootを開発するツール)もあるけど、

おもしろくないのでInteliJでmavenプロジェクトを作成して

必要なものだけ全部突っ込んでみる。

必要な物 

  • spring-boot-starter-parent: SpringBootのベース
  • spring-boot-starter-web
  • spring-boot-starter-thymeleaf: Thymeleafが使いたかった!
  • spring-boot-starter-data-jpa: 結局裏ではhibernate使ってるけど
  • mysql-connector-java: MySQLは適当にVagrantで建てた
  • lombok: あるとJpaRepository使いやすかった
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.3.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.12</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

 

 

まずは起動用ファイル

SpringBootはサーバーを内包していて、mainから走らせれば起動するので、

これだけ書けばとりあえずサーバーが起動する。

なんとなく名前はBootにしてみた。起動しそうだからb

@SpringBootApplication
public class Boot {
public static void main(String[] args) {
SpringApplication.run(Boot.class, args);
}
}

 

 

Thymeleafを組み合わせてみる

resources/templatesにhtmlファイルを設置

index.html

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>top page</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
test
<p th:text="${msg}" />
</body>
</html>

コントローラーがその名前を返せばいいだけ。

今回はindex.htmlとしたのでこんな感じ。

@Controller
@RequestMapping("/")
public class IndexController {
public String index(Model model) {
model.addAttribute("msg","Hello Spring Boot");
return "index";
}
}

簡単すぎる!

これでBootを走らせるともうlocalhost:8080で見れる!

早すぎる!

 

 

Jpa Repositoryを使ってみる

まずは必要なデータベース!!!

データベース名:mydatabase

テーブル名:mytable

として作って適当にデータを突っ込んでみる。

次に

resources/application.properties

を作ってアクセスできる様に下記を記載する

今回はVM上でmysqlがあるのでこんな感じ。

spring.datasource.url=jdbc:mysql://192.168.33.10/mydatabase
spring.datasource.username=user
spring.datasource.password=password
spring.datasource.driverClassName=com.mysql.jdbc.Driver

spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update

spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect

がないと、

org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set

で悩まされた。。。

 

あとは簡単!

Entityを用意する

@Entity
@Data
@Table(name = "mydata")
public class MyData {

@Id
@GeneratedValue(strategy= GenerationType.AUTO)
private Integer id;
private String name;

}

JpaRepositoryのinterfaceを用意する。

だいたいのメソッドがデフォルトで用意されている。

@Repository
public interface MyDataRepository extends JpaRepository<MyData, Integer> {
}

Repositoryの実装としてServiceを作る。

AutowiredとかはSpring DIの基本なので説明飛ばします!

@Service
@Transactional
public class MyDataService {

@Autowired
MyDataRepository myDataRepository;

public List<MyData> findAll() {
return myDataRepository.findAll(new Sort(Sort.Direction.ASC, "id"));
}
}

最後にThymeleafに送っていたデータをDBからServiceを使って取得。

MyDataにtoStringが実装されてるから取得した値をそのまま出してみる。(雑)

@Controller
@RequestMapping("/")
public class IndexController {

@Autowired
MyDataService myDataService;

@RequestMapping(method = RequestMethod.GET)
public String index(Model model) {
List<MyData> myDataList = myDataService.findAll();
model.addAttribute("msg", myDataList.get(0));
return "index";
}
}

そして走らせる。

 

 

無事成功!

f:id:kensanty:20170101190003p:plain

ほとんど引っかかるところはなく簡単にできたのがすごい!

環境構築もいらないし。

でも、楽だけど、中身をちゃんと知らないといけないなぁと思った。

まぁ、とりあえずベース環境として使って、

勉強しながら気分次第でmavenのimport方法変えていけばいいかなと。

YAGNIということで。

これをベースに何作るかは全然考えてない。。。