質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

1回答

3035閲覧

Java上でpostgreSQLで保存されているデータを取得する方法について知りたい

sossy

総合スコア5

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

1グッド

2クリップ

投稿2020/03/14 14:53

編集2020/03/14 15:47

前提・実現したいこと

JavaのEclipseのspringbootで勤怠管理システムを作成しているのですが、 pgAdminと繋いで入力した時の日付がDB内になければDBに日付(ymd)と出勤時間(start_time)、退勤時間(end_time)をinsert、入力した日付が既にDB内にあるのなら出勤時間(start_time)、退勤時間(end_time)をupdateするようにしたいです。
いろいろ試したのですがなかなか上手くいかなくて、もしよろしければどのようにすれば良いのか教えていただきたいです。

Java

1 2package com.example.demo; 3 4import java.sql.Connection; 5import java.sql.Date; 6import java.sql.DriverManager; 7import java.sql.PreparedStatement; 8import java.sql.ResultSet; 9import java.sql.SQLException; 10 11import org.springframework.stereotype.Controller; 12//import org.springframework.web.bind.annotation.PathVariable; 13import org.springframework.web.bind.annotation.RequestMapping; 14//import org.springframework.web.bind.annotation.RestController; 15import org.springframework.web.bind.annotation.RequestMethod; 16import org.springframework.web.bind.annotation.RequestParam; 17import org.springframework.web.servlet.ModelAndView; 18//import org.springframework.stereotype.Controller; 19 20 21@Controller 22public class HelloController { 23 24 @RequestMapping(value = "/", method = RequestMethod.GET) 25 26 public ModelAndView index(ModelAndView mav) { 27 28 mav.setViewName("index"); 29 mav.addObject("msg", "勤怠開始時間を入力してください。"); 30 31 32 return mav; 33 } 34 35 @RequestMapping(value = "/", method = RequestMethod.POST) 36 public ModelAndView send(@RequestParam("start") String start, @RequestParam("end") String end, ModelAndView mav) { 37 38 Connection conn; 39 java.util.Date d1 = new java.util.Date(); 40 Date date = new Date(d1.getTime()); 41 ResultSet rs = null; 42 43 44 45 try { 46//この辺りでDB内の日付を取得しようとしているが自信なし 47 conn = DriverManager.getConnection("jdbc:postgresql://localhost:5432/postgres", "postgres", "パスワード"); 48 PreparedStatement pstmt2 = conn.prepareStatement("select * from kintai_daily_todoke where ymd = ?"); 49 pstmt2.setDate(1, date); 50 rs = pstmt2.executeQuery(); 51 52 rs.next();  53 54 55 System.out.println(rs.getDate(1)); 56 System.out.println(date); 57 58 59 60   // 現在の日付 = DB内の日付 61 if(date == rs.getDate(1)) { 62 63 PreparedStatement pstmt = conn.prepareStatement("update kintai_daily_todoke set start_time = ?, end_time = ? where ymd = ?"); 64 65 pstmt.setString(1, start); 66 pstmt.setString(2, end); 67 pstmt.setDate(3, date); 68 pstmt.executeUpdate(); 69 70 71 72 73 74 mav.addObject("msg", "更新しました"); 75 76 77 78 } 79 else { 80 81; 82 PreparedStatement pstmt = conn.prepareStatement("insert into kintai_daily_todoke values(?,?,?)"); 83 pstmt.setDate(1, date); 84 pstmt.setString(2, start); 85 pstmt.setString(3, end); 86 pstmt.executeUpdate(); 87 88 89 mav.addObject("msg", "データを保存しました!"); 90 91 } 92 93 94 95 }catch(SQLException e) { 96 97 e.printStackTrace(); 98 mav.addObject("msg", "エラーが発生しました!" + e); 99 100 101 102 } 103 104 105 mav.setViewName("index"); 106 107 return mav; 108 109 } 110 111 112} 113 114

試したこと

select文を使って、DB内の情報を取得すれば良いと思ったのですが、現在の日付を取得し、DBの中にその日付のデータがあるのかを比べるコードが自信がない。

補足情報(FW/ツールのバージョンなど)

・DBイメージ

テーブル名:kintai_daily_todoke

ymdstart_timeend_time

・ツール、アプリ
Eclipse spring boot
pgadmin4

s.k👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sossy

2020/03/14 15:35

修正しました。 ご指摘ありがとうございます。
hoshi-takanori

2020/03/14 16:50

上手くいかないというのは、具体的に何がどううまくいかないのでしょうか? エラーが出ますか? また、ymd, start_time, end_time の型はどうなってますか? ymd は primary key でしょうか? ちなみに、データがなければ insert、あれば update という処理は俗に upsert と言われていて、PostgreSQL 9.5 以降では INSERT 〜 ON CONFLICT 〜 という構文があるようです。 https://qiita.com/bluesDD/items/fdebbccd5ba8a6aaa565
javahack

2020/03/14 18:58

パッと見、動かないだろうなとは思いますが、一応テーブルのカラムの定義がわかるようにCREATE TABLEの情報を追記してください。
jimbe

2020/03/14 21:25

ymd で探して得たレコードの ymd と比較しても意味はないと思いますけど... 自信が有っても無くても, プログラムは書いたようにしか動きません. select でレコードが無かった時にどうなるのかをお調べになったり動かしてみたりされたのでしょうか.
guest

回答1

0

ベストアンサー

try{}の部分を同じ様な動きで書いてみました。 ご参考程度にお願いします。
SELECTで有ったらUPDATE、無ければINSERTとしております。

java

1import java.sql.Date; 2 3 try{ 4 5 Connection conn; 6 Date date = Date.valueOf("2020-03-15"); 7 8 conn = DriverManager.getConnection("jdbc:postgresql://127.0.0.1:5432/testdb", "user", "passwd"); 9 10 PreparedStatement pstmt2 = conn.prepareStatement("select * from kintai_daily_todoke where ymd = ?"); 11 pstmt2.setDate(1, date); 12 13 ResultSet rs = pstmt2.executeQuery(); 14 15 if (rs.next()){ 16 PreparedStatement pstmt = conn.prepareStatement("update kintai_daily_todoke set start_time = ?, end_time = ? where ymd = ?"); 17 18 pstmt.setString(1, start); 19 pstmt.setString(2, end); 20 pstmt.setDate(3, date); 21 pstmt.executeUpdate(); 22 23 System.out.println("更新しました"); 24 }else{ 25 PreparedStatement pstmt = conn.prepareStatement("insert into kintai_daily_todoke values(?,?,?)"); 26 pstmt.setDate(1, date); 27 pstmt.setString(2, start); 28 pstmt.setString(3, end); 29 pstmt.executeUpdate(); 30 31 System.out.println("データを保存しました!"); 32 } 33 34 }catch(SQLException e) { 35 System.out.println("エラーが発生しました!"); 36 } 37

投稿2020/03/15 10:19

編集2020/03/15 10:26
amura

総合スコア333

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sossy

2020/03/16 14:14

ありがとうございます。 上手く動きました。 next()の動きを理解していないまま使っていましたので、また調べて理解した上で理解を深めていきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問