SpringBootでDBから情報を取得する。

SpringBootのJDBCを使ってDBから情報を取得する実装（お勉強）をした。
備忘録としてまとめます。

ちなみにNamedParameterJdbcTemplateやRowMapperを使う方法があるみたいですが、今やるとこんがらがるので、とりあえずはベーシックな方法をまとめました。
**おそらくはNamedParameterJdbcTemplateが主流**なのかな？

## アノテーション
@Repository→DAOクラスに付与する系。
@Autowired→Beanを自動的にInjectionしてくれる。ざっくり言うとnewしてくれるみたいな感じ。

今回は「JdbcTemplate」をnewする。

```java:dao

@Autowired
JdbcTemplate jdbc;
// SpringJDBCを使う（ドライバーのインストール、DBへのconnectionをやってくれる）
// こいつを@Autowiredを使ってインスタンス化して、「jdbc.メソッド」の様に使う。

```
## DAO側の実際のコード

・レコード1件取得（カウント数とか）
　jdbc.queryForObject(【SELECT文】)
　　→レコード件数とか結果が1つの場合はqueryForObjectメソッドを使う。

```java:例）dao

@Override
    public int count() throws DataAccessException {

        // 全件取得してカウント（カラムを一つだけ取得→queryForObject）
        int count = jdbc.queryForObject("SELECT COUNT(*) FROM m_user", Integer.class);

        return count;
    }

```

・レコード登録、更新、削除。
　jdbc.update(【INSERT、UPDATE、DELETE文】)
　　→レコードを更新する場合はupdateを使う。
　　　また返値は正常終了なら０が返る。０以外は異常終了。

```java:例）dao

@Override
    public int insertOne(User user) throws DataAccessException {

        //１件登録。登録、更新、削除はupdateを使う。第一引数はSQL、第二はPreparedStatement。
        int rowNumber = jdbc.update("INSERT INTO m_user(user_id,"
                + " password,"
                + " user_name,"
                + " birthday,"
                + " age,"
                + " marriage,"
                + " role)"
                + " VALUES(?, ?, ?, ?, ?, ?, ?)",
                user.getUserId(),
                user.getPassword(),
                user.getUserName(),
                user.getBirthday(),
                user.getAge(),
                user.isMarriage(),
                user.getRole());

        return rowNumber; //正常終了なら０を返す。異常は０以外を返す。
    }

```

・テーブルのデータを１件取得。
　→queryForMapメソッドを使う。
　　<font color="blue">※受け取る値はMap型。<font>

```java:例）dao

@Override
    public User selectOne(String userId) throws DataAccessException {

        // １件取得
        Map<String, Object> map = jdbc.queryForMap("SELECT * FROM m_user"
                + " WHERE user_id = ?", userId);

        // 結果返却用の変数
        User user = new User();

        // 取得したデータを結果返却用の変数にセットしていく
        user.setUserId((String) map.get("user_id")); //ユーザーID
        user.setPassword((String) map.get("password")); //パスワード
        user.setUserName((String) map.get("user_name")); //ユーザー名
        user.setBirthday((Date) map.get("birthday")); //誕生日
        user.setAge((Integer) map.get("age")); //年齢
        user.setMarriage((Boolean) map.get("marriage")); //結婚ステータス
        user.setRole((String) map.get("role")); //ロール

        return user;
    }

```

・テーブルの全データを取得。
　→queryForListメソッドを使う。
　　※受け取る値は<font color="blue">上記Map型を**更にList化**。<font>

```java:例）dao

@Override
    public List<User> selectMany() throws DataAccessException {

        // M_USERテーブルのデータを全件取得（queryForList）
    	// map→keyとvalueの組み合わせ。それをListで受け取る。
        List<Map<String, Object>> getList = jdbc.queryForList("SELECT * FROM m_user");
        System.out.println("リスト=" + getList);

        // 結果返却用の変数
        List<User> userList = new ArrayList<>();

        // 取得したデータを結果返却用のListに格納していく
        for (Map<String, Object> map : getList) {
        	
        	System.out.println("Map=" + map);
        	
            //Userインスタンスの生成
            User user = new User();

            // Userインスタンスに取得したデータをセットする
            user.setUserId((String) map.get("user_id")); //ユーザーID
            user.setPassword((String) map.get("password")); //パスワード
            user.setUserName((String) map.get("user_name")); //ユーザー名
            user.setBirthday((Date) map.get("birthday")); //誕生日
            user.setAge((Integer) map.get("age")); //年齢
            user.setMarriage((Boolean) map.get("marriage")); //結婚ステータス
            user.setRole((String) map.get("role")); //ロール

            //結果返却用のListに追加
            userList.add(user);
        }
        System.out.println("リスト=" + getList);
        return userList;
    }

```

とりあえず以上です。
ちなみに@Overrideと書いているのは、DAO自体をinterface化して、implimentsするのが主流らしく、基本的にはメソッドには@Overrideするとのことです。