読者です 読者をやめる 読者になる 読者になる

修行@ホーチミン

ホーチミン長期出張の日記です

SpringBootでDB接続②

前書き

前回は、SpringBootとJPAのfindAll()をつかってテーブルのリストを返却するところまでを確認したので、今回はInsertとDelete(論理削除)を新たに追加してみました。

内容

基本構成はListを返す時とほぼ同じですが、Serviceの内容がそれぞれ異なります。 ※前回利用したテーブルにカラム追加しています。

INSERT

INSERTの場合は、JpaRepositoryのsave()メソッドを用います。

※ちなみにUPDATEも、このsave()メソッドを使います。

HTTPリクエストしたオブジェクトをServiceクラスで少し加工して、DBに登録といった簡単なものを実装しました。

INSERTは下記パスにてリクエストを受け取るようにControllerクラスに設定しています。

/hotel/insert

Serviceクラス
@Service
@Transactional
public class HotelInsertService {

    @Autowired
    private HotelRepository hotelRepository;

    /**
     * 
     * @return
     */
    public HotelInsertResponseBody insertHotels(Hotel hotel) {
        hotel.setRegisterDatetime(new Timestamp(System.currentTimeMillis()));
        hotel.setRegisterPerson(TestUtils.API_NAME);
        Hotel res = hotelRepository.save(hotel);
        HotelInfo hotelInfo = new HotelInfo(res.getId(), res.getName(), res.getLatitude(), res.getLongitude());
        return new HotelInsertResponseBody(hotelInfo);
    }
}
HttpRequest

curlコマンドで、リクエストを投げます。

root@host:~$ curl http://localhost:8080/hotel/insert -X POST -H "Content-Type: application/json" -d "{
>   \"header\": {
>     \"uid\": \"00000\",
>     \"languageCode\": \"US\",
>     \"countryCode\": \"US\",
>     \"currencyCode\": \"USD\"
>   }, 
>   \"body\": {
>     \"id\": \"105\",
>     \"name\": \"HIJ Hotel\"
>   }
> }"
SELECT結果

先ほど登録されたid=105SELECTした結果、ちゃんと登録されているを確認できました。

mysql> select * from hotel where id=105\G
*************************** 1. row ***************************
               id: 105
             name: HIJ Hotel
         latitude: NULL
        longitude: NULL
          address: NULL
     country_code: NULL
        city_code: NULL
            grade: NULL
         facility: NULL
       image_path: NULL
register_datetime: 2016-09-12 16:21:23
  register_person: hotel-engine-training
  update_datetime: NULL
    update_person: NULL
      delete_flag: 0
  delete_datetime: NULL
    delete_person: NULL
1 row in set (0.00 sec)

DELETE

物理削除の場合は、JpaRepositoryのdelete()を用いるのですが、今回はdelete_flagを用いて論理削除する方法を取りました。

DELETEは下記パスにてリクエストを受け取るようにControllerクラスに設定しています。

/hotel/delete

Serviceクラス

HttpReqestから得たidから、findOne()メソッドを用いて対象データを取得して

そのオブジェクトのdelete_flag=1としたあとに、save()メソッドで更新するといった内容です。

@Service
@Transactional
public class HotelDeleteService {

    @Autowired
    private HotelRepository hotelRepository;

    /**
     * 
     * @return
     */
    public int deleteHotel(Hotel hotel) {
        // transform entity information as response as need
        Hotel target = hotelRepository.findOne(hotel.getId());
        target.setDeleteFlag(true);
        target.setDeleteDatetime(new Timestamp(System.currentTimeMillis()));
        target.setDeletePerson(DenaTravelUtils.API_NAME);
        hotelRepository.save(target);
        return 0;
    }
}
HttpRequest

先ほど追加した、id=105のレコードを論理削除してみます。

root@host:~$ curl http://localhost:8080/hotel/delete -X POST -H "Content-Type: application/json" -d "{
  \"header\": {
    \"uid\": \"00000\",
    \"languageCode\": \"US\",
    \"countryCode\": \"US\",
    \"currencyCode\": \"USD\"
  }, 
  \"body\": {
    \"id\": \"105\",
    \"name\": \"HIJ Hotel\"
  }
}"
SELECT結果

delete_flag=1になったことを確認することができました。

mysql> select * from hotel where id=105\G
*************************** 1. row ***************************
               id: 105
             name: HIJ Hotel
         latitude: NULL
        longitude: NULL
          address: NULL
     country_code: NULL
        city_code: NULL
            grade: NULL
         facility: NULL
       image_path: NULL
register_datetime: 2016-09-12 16:21:23
  register_person: hotel-engine-training
  update_datetime: NULL
    update_person: NULL
      delete_flag: 1
  delete_datetime: 2016-09-12 17:15:20
    delete_person: hotel-engine-training
1 row in set (0.00 sec)

※ちなみにEntityクラスに下記アノテーションを付与することで、論理削除を実現しています。

@Where(clause="delete_flag = 0")