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


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

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

アノテーション

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

今回は「JdbcTemplate」をnewする。

dao

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

DAO側の実際のコード

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

例)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を使う。
   また返値は正常終了なら0が返る。0以外は異常終了。

例)dao

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

        //1件登録。登録、更新、削除は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; //正常終了なら0を返す。異常は0以外を返す。
    }

・テーブルのデータを1件取得。
 →queryForMapメソッドを使う。
  ※受け取る値はMap型。

例)dao

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

        // 1件取得
        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メソッドを使う。
  ※受け取る値は上記Map型を更にList化

例)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するとのことです。