LoginSignup
13
15

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-12-16

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

13
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
15