SpringBoot + MyBatis(SQLite)なプロジェクトを30分で作成するハンズオン

勉強会用の資料です。
対面でやるため、資料は非常に雑です。

# プロジェクトを作る
[New Project] -> [Gradle]
あと適当に。
<img width="954" alt="newproject_gradle.png" src="https://qiita-image-store.s3.amazonaws.com/0/4857/751aa10c-06f9-581f-d405-a2309f91725f.png">

# SpringBootを使ってWebサーバを作る
## build.gradle にspringbootを追加する
build.gradle

```groovy
apply plugin: 'java'

sourceCompatibility = 1.8
version = '1.0'

repositories {
    mavenCentral()
}

dependencies {
    compile("org.springframework.boot:spring-boot-starter-web:1.3.5.RELEASE")// 追加
    testCompile group: 'junit', name: 'junit', version: '4.11'
}
```

## コントローラを作る
SampleController.java

```java
@Controller
@EnableAutoConfiguration
public class SampleController {
    @RequestMapping("/")
    @ResponseBody
    String home() {
        return "Hello";
    }

    public static void main(String[] args) throws Exception {
        SpringApplication.run(SampleController.class, args);
    }
}
```

## 動作確認
- 実行
  - クラスを選択して右クリック
  - [Run 'Sample...main()']をクリック

<img width="547" alt="run.png" src="https://qiita-image-store.s3.amazonaws.com/0/4857/43dc6286-7e1c-a078-d568-7213f4703b41.png">

- ブラウザで "http://localhost:8080/" にアクセス
- Helloが表示されたらOK!

# MybatisでSQLiteにアクセスする
## build.gradle にmybatisとsqliteを追加する
dependenciesに2行追加する
build.gradle

```
dependencies {
    compile("org.springframework.boot:spring-boot-starter-web:1.3.5.RELEASE")

    compile group: 'org.mybatis', name: 'mybatis', version: '3.0.1'// 追加
    compile group: 'org.xerial', name: 'sqlite-jdbc', version: '3.8.11.2'// 追加

    testCompile group: 'junit', name: 'junit', version: '4.11'
}
```

## ターミナルでdbを作る
```
% sqlite3 hoge.db
SQLite version 3.8.5 2014-08-15 22:37:57
Enter ".help" for usage hints.
sqlite> create table test_table(name);
sqlite> insert into test_table values('apple');
sqlite> insert into test_table values('banana');
```
※プロジェクト直下でやってね。
## mybatisの設定ファイルを作る
リソースディレクトリにmybatis-config.xmlを作る
src/main/resources/mybatis-config.xml

```xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <environments default="sample_id">
        <environment id="sample_id">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="org.sqlite.JDBC"/><!-- sqliteのドライバーを設定 -->
                <property name="url" value="jdbc:sqlite:hoge.db"/><!-- dbのファイルパス -->
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="sample_mapper.xml"/>
    </mappers>
</configuration>
```

## マッパーを作る
リソースディレクトリにsample_mapper.xmlを作る
src/main/resources/sample_mapper.xml

```xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="sample.mybatis">
    <select id="selectTest" resultType="map">
        select * from test_table
    </select>
</mapper>
```

## コントローラーから呼び出す
SampleController.java

```java
@Controller
@EnableAutoConfiguration
public class SampleController {
    @RequestMapping("/")
    @ResponseBody
    List<Map<String, Object>> home() {
        String resource = "mybatis-config.xml";
        try (Reader in = Resources.getResourceAsReader(resource)) {
            // ★設定ファイルを元に、 SqlSessionFactory を作成する
            SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);

            // ★SqlSessionFactory から SqlSession を生成する
            SqlSession session = factory.openSession();
            // ★SqlSession を使って SQL を実行する
            List<Map<String, Object>> result = session.selectList("sample.mybatis.selectTest");
            return result;
        } catch (IOException e) {
            // nop
        }

        return null;
    }

    public static void main(String[] args) throws Exception {
        SpringApplication.run(SampleController.class, args);
    }
}
```

## 動作確認
- 実行、"http://localhost:8080/" にアクセス
- ↓ こんなんが表示されたらOK!!!!

```
[{"name":"apple","NAME":"apple"},{"name":"banana","NAME":"banana"}]
```

# おつかれさまでした

# 補足: はまりポイント
## importできない
原因: build.gradleを更新後、intellijのRefreshをしてない。
-> intellijでgradleをリフレッシュする
[View] - [Tool Windows] - [Gradle]を表示して、左上のリロードっぽいボタンを押す

## なんにもしてないのにサーバが立ち上がらなくなった
原因: 前回実行したアプリを落としてない
-> [Run] - [Stop]

## SampleController.javaはどこにおけばイイ？
src/main/java配下

## SampleController.javaでimportすべきパッケージがわからん
```
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.io.IOException;
import java.io.Reader;
import java.util.List;
import java.util.Map;
```