【Java・SpringBoot】Spring JDBC / BeanPropertyRowMapper（SpringBootアプリケーション実践編16）

ホーム画面からユーザー一覧画面に遷移し、ユーザーの詳細を表示するアプリケーションを作成して、Spring JDBCの使い方について学びます⭐️
前回はRowMapperについて学びました。今回は**BeanPropertyRowMapper**を実践して学びます^^
構成は前回/これまでの記事を参考にしてください

⭐️前回の記事
[【Java・SpringBoot】Spring JDBC / RowMapper（SpringBootアプリケーション実践編15）](https://qiita.com/suema0331/items/5062bcf008d507a58b75)

#BeanPropertyRowMapper
* **RowMapper自体を用意しなくてOK！**
    * BeanPropertyRowMapperでは、**データベースから取得してきたカラム名と同一のフィールド名がクラスにあれば、自動でマッピング**をしてくれる！
    * →つまり、RowMapperのように**どのカラムとどのフィールドを一致させるか、いちいち用意する必要がない**
    * 自動でマッピングするためのルール
        * 1.**カラム名は単語をアンダースコアで区切る**（スネークケース）例：user_id
        * 2.**フィールド名は２つ目の単語から大文字にする**（キャメルケース）例：StringuserId;
            * AS句を使用して別名でもマッピングが可能
* 以下のUserDaoJdbcImpl3では、UserDaoJdbcImplをextends（継承）し、select文の部分だけをOverride


```UserDaoJdbcImpl3.java
package com.example.demo.login.domain.repository.jdbc;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;

import com.example.demo.login.domain.model.User;

@Repository("UserDaoJdbcImpl3")
public class UserDaoJdbcImpl3 extends UserDaoJdbcImpl {

    @Autowired
    private JdbcTemplate jdbc;

    //ユーザー１件取得
    @Override
    public User selectOne(String userId) {

        //１件取得用SQL
        String sql = "SELECT * FROM m_user WHERE user_id = ?";

        //RowMapperの生成
        RowMapper<User> rowMapper = new BeanPropertyRowMapper<User>(User.class);

        //SQL実行
        return jdbc.queryForObject(sql, rowMapper, userId);
    }

    //ユーザー全件取得
    @Override
    public List<User> selectMany() {

        //M_USERテーブルのデータを全件取得するSQL
        String sql = "SELECT * FROM m_user";

        //RowMapperの生成
        RowMapper<User> rowMapper = new BeanPropertyRowMapper<User>(User.class);

        //SQL実行
        return jdbc.query(sql, rowMapper);
    }
}

```

#サービスクラスでBean指定
* サービスクラスからUserDaoJdbcImpl3を使うように、Bean名をセット
* コード全文は下記参考

```UserService.java
//中略
@Service
public class UserService {
    @Autowired
    @Qualifier("UserDaoJdbcImpl3")
    UserDao dao;
//中略
```

#SpringBootを起動してホーム画面確認！
* http://localhost:8080/home
* ユーザー一覧、ユーザー詳細画面に移ると、コンソールの表示がUserDaoJdbcImpl3に変わっています
* これでBeanPropertyRowMapperを使うことができました〜^o^

```
メソッド開始： String com.example.demo.login.controller.HomeController.getUserDetail(SignupForm,Model,String)
userId = nekomofu@xxx.co.jp
メソッド開始： User com.example.demo.login.domain.repository.jdbc.UserDaoJdbcImpl3.selectOne(String)
メソッド終了： User com.example.demo.login.domain.repository.jdbc.UserDaoJdbcImpl3.selectOne(String)
メソッド終了： String com.example.demo.login.controller.HomeController.getUserDetail(SignupForm,Model,String)
```
#(参考)コード全文

```UserService.java
package com.example.demo.login.domain.service;

import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.example.demo.login.domain.model.User;
import com.example.demo.login.domain.repository.UserDao;

@Service
public class UserService {
    @Autowired
    @Qualifier("UserDaoJdbcImpl3")
    UserDao dao;

    public boolean insert(User user) {
        // insert実行
        int rowNumber = dao.insertOne(user);
        // 判定用変数
        boolean result = false;

        if (rowNumber > 0) {
            // insert成功
            result = true;
        }
        return result;
    }

    public int count() {
        return dao.count();
    }

    public List<User> selectMany() {
        // 全件取得
        return dao.selectMany();
    }

    public User selectOne(String userId) {
        // selectOne実行
        return dao.selectOne(userId);
    }

    public boolean updateOne(User user) {

        // 判定用変数
        boolean result = false;

        // １件更新
        int rowNumber = dao.updateOne(user);

        if (rowNumber > 0) {
            // update成功
            result = true;
        }

        return result;
    }

    public boolean deleteOne(String userId) {

        // １件削除
        int rowNumber = dao.deleteOne(userId);

        // 判定用変数
        boolean result = false;

        if (rowNumber > 0) {
            // delete成功
            result = true;
        }
        return result;
    }
}

```