endokのブログ

IT・プログラミングネタ

Spring Boot触ってみる その4 ーSQLServerへの接続ー

Spring Boot触ってみる その3 ーThymeleaf Layout Dialectでレイアウトを共通化ー - endokのブログ
の続き。

SpringBootでのSQLServerへの接続方法を確認する。
SpringBoot特有の設定ということはなく、Springであれば同じような設定となるだろう。

その1(http://endok.hatenablog.com/entry/2016/06/04/124011)で作成したサンプルプロジェクトを引き続き利用する。

Microsoft JDBC Driver 4.2 for SQL Serverの導入

Microsoft JDBC Driver 4.2 for SQL Serverを利用する。

Maven管理はできるが、セントラルリポジトリからはダウンロードできないらしい。
そのため自分でMicrosoftからダウンロードしてMavenのローカルレポジトリに導入する必要がある。

ダウンロード

https://www.microsoft.com/en-us/download/details.aspx?id=11774
からsqljdbc_4.2.6420.100_jpn.exeをダウンロードする。

展開されたファイルに含まれる"sqljdbc42.jar"を利用する

pom.xmlへの追加

下記をpom.xmlに追記する。

	<dependency>
	    <groupId>com.microsoft.sqlserver</groupId>
	    <artifactId>sqljdbc</artifactId>
	    <version>4.2</version>
	</dependency>

この時点ではSTS上で
 "Missing artifact com.microsoft.sqlserver:sqljdbc:jar:4.2"
というエラー扱いとなる。

Mavenローカルリポジトリへのインストール

今回はSTS上のMavenを使ってインストールしてみる。
Mavenがインストールされていればmvnコマンドで同等の内容を実行しても問題ない。

[Run]→[Run Configurations..]を開く。
左メニューのMaven Buildを右クリックし、Newを選択する。

Name:適当に名前を付ける
Base directory:sqljdbc.jarのあるフォルダを指定
Goals:install:install-file
Parameter:下記を追加する。
 file:sqljdbc42.jar ※Base directoryからのファイルパス
 packaging:jar
 groupId:com.microsoft.sqlserver
 artifactId:sqljdbc
 version:4.2

f:id:endok:20160612145338j:plain

Runボタンを押して実行する。
BUILD SUCCESSとなれば成功。

その後、プロジェクトを右クリックして[Maven]→[Update Project..]を実行するとpom.xmlのエラーが解消する。

Microsoft JDBC Driver 4.2 for SQL Serverの利用

エンティティクラスの作成

今回は下記memberクラスを利用する。

@Entity
@Table
public class Member {

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column
	private long id;

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

	@Column(nullable = true)
	private Integer age;

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

	public Integer getAge() {
		return age;
	}

	public void setAge(Integer age) {
		this.age = age;
	}

}

接続設定

localhost:1433で動作するSQLServerインスタンスのtestdbデータベースに接続する場合、下記をapplication.propertiesに記載する。

spring.datasource.url=jdbc:sqlserver://localhost:1433;databaseName=testdb
spring.datasource.username=sa
spring.datasource.password=sqladmin
spring.datasource.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver

テーブルの作成

今回はtestdbというデータベースを作成して利用する。

https://msdn.microsoft.com/ja-jp/library/ms378599(v=sql.110).aspx
のデータ型を参考にテーブルを定義してもよいが、hibernateに自動生成させることもできる。

application.propertiesに下記記述を追加する。

spring.jpa.hibernate.ddl-auto=create

この設定を行ったうえでアプリケーションを起動すると、Entityの定義をもとにテーブルを自動生成してくれる。
この設定値は、none,update,create,create-drop,validateのいずれかを指定できる。
組み込みDBの場合はcreate-dropがデフォルト値、その他DBの場合はnoneがデフォルト値となるとのこと。

この機能で作成されたテーブル定義は下記の通りとなった。

CREATE TABLE [dbo].[member](
	[id] [numeric](19, 0) IDENTITY(1,1) NOT NULL,
	[age] [int] NULL,
	[name] [varchar](50) NOT NULL,
PRIMARY KEY CLUSTERED 
(
	[id] ASC
)
)

動作確認

テーブルの作成ができていれば接続設定の正しさは確認できているが、一応データの保存と取得を行っておく。

下記のような保存、参照処理をControllerで実行する。

@Controller
public class HelloController {

	@Autowired
	MemberRepository repository;

	@RequestMapping(value = "/hello")
	public String index(Model model) {
		
		Member newMember = new Member();
		newMember.setName("新規データ");
		newMember.setAge(50);
		repository.save(newMember);
		
		List<Member> list = repository.findAll();
		model.addAttribute("list", list);
		
		return "hello";
	}

}

テンプレートには下記を記述する。

<table>
	<tr>
		<th>ID</th>
		<th>名前</th>
		<th>年齢</th>
	</tr>
	<tr th:each="data : ${list}">
		<td th:text="${data.id}"></td>
		<td th:text="${data.name}"></td>
		<td th:text="${data.age}"></td>
	</tr>
</table>

アクセスすると下記のようにデータの保存、取得ができていることが確認できる。
(1,2は事前に登録しておいたデータ)

f:id:endok:20160612161708j:plain

まとめ

ローカルリポジトリへのインストールのところがちょっとややこしかったが、割とすんなり導入できた。
application.propertiesのSQL関連設定を調べていくなかで、Spring/JPA/Hibernateが持つDB初期化の仕組みやスキーマ生成の仕組みを知ることができたのはよかった。
想定されている使い方としては開発は組み込みDBで行い、本番環境はSQLServer等を使うという方式なのだろう。
個人的には開発時点でも同じ環境にしておかないと不安だが、JPA/Hibernateで細かい差異は吸収するので大丈夫という考え方なのかもしれない。