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
を作ってアクセスできる様に下記を記載する
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";
}
}
そして走らせる。
無事成功!
ほとんど引っかかるところはなく簡単にできたのがすごい!
環境構築もいらないし。
でも、楽だけど、中身をちゃんと知らないといけないなぁと思った。
まぁ、とりあえずベース環境として使って、
勉強しながら気分次第でmavenのimport方法変えていけばいいかなと。
YAGNIということで。
これをベースに何作るかは全然考えてない。。。