Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

JDBCを使用してのDB接続

開発環境
JDK:JDK6 ud13
IDE:Netbeans6.5.1
-------
現在DBとの連携の所で悩んでおります。
このプログラムで実行したところ、エラーは出ないのですが、その内容も表示されないまま、処理落ちしたかの様に止まってしまいます。
申し訳ありませんが、正常に出力を出来るようなヒントを頂けると助かります。
行数が多くなるので、メインになってくる部分のみ抜き出しとします。

public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new NewJFrame().setVisible(true);
                Connection con = null;
    Statement stmt = null;
    ResultSet rs = null;

    String sqlStr;

    try {
        //ドライバクラスをロード
        Class.forName("org.gjt.mm.mysql.Driver");

        //MySQLへの接続
        con =       (Connection) DriverManager.getConnection("jdbc:mysql://localhost:1527/testsystem", "ADMIN", "admin");

        //ステートメントの生成
        stmt =      (Statement) con.createStatement();

        //SQL文の入力
        sqlStr = "SELECT * FROM T_CUSTOMER";

        //SQL文の実行
        rs = stmt.executeQuery(sqlStr);

        //検索結果数のループ
        while(rs.next()){
            //レコードから値
            int id = rs.getInt("顧客ID");
            String name = rs.getString("顧客名");

            //出力
            System.out.println(id + ":" + name);
        }

        //事後処理
        rs.close();
        stmt.close();
        con.close();

    } catch (Exception ex) {
        try {
            //事後処理
            if (rs != null) rs.close();
            if (stmt != null) stmt.close();
            if (con != null) con.close();
        } catch (Exception e) {
        }
        //エラーの場合
        ex.printStackTrace();
    }
    
            }
        });
    }

20

回答

9018

閲覧

20件の回答

評価

0

EventQueueに格納してるみたいだけど、
ディスパッチはどこで行われているの?

評価

0

ふむ・・・。
この場合はSwingUtilities.invokeLaterを呼び出してないからって事になるのですか?

評価

0

不良社員さんと同じこと言うけど

そもそもrunされているの?

このコードだけでは
それがわからないわ。

評価

0

スレッドなんぞ使うの、やめなさい。
んなもんが必要になるのは、
お絵かきプログラムとか、イベント順序の制御が
シビアな場合だけ。

もしかして、main()にDBへのアクセスコードを書いて、
うまくいかなかったから、んなことやろうとしたの?
JFrameのmain()に、DBへのアクセス・コードなんか書かない。
書くのは、JFrame#setVisible(true)までだ。
DBへのアクセスは、ActionListenerの中で、
ロジック・メソッドを呼び出すようにしよう。

評価

0

いろいろと試行錯誤を繰り返しています。

[てんこ様]
今回は全文載せました。
分からない部分を載せてしまい申し訳ありません。

[不良社員様]
何を思ったか良く見たらスレッドの中にぶち込んでありました・・・。
ご指摘有難う御座います。
ひとまず、スレッドの中からは救出し、ボタンを押したらという記述に変えました。
相変わらず画面は止まったまま動いてくれません。




package testsample;



import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;


public class NewJFrame extends javax.swing.JFrame {

   
    public NewJFrame() {
        initComponents();
    }

   
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        jTextArea1 = new javax.swing.JTextArea();
        jButton1 = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);

        jTextArea1.setColumns(20);
        jTextArea1.setRows(5);
        jScrollPane1.setViewportView(jTextArea1);

        jButton1.setText("jButton1");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(150, 150, 150)
                .addComponent(jButton1)
                .addContainerGap(175, Short.MAX_VALUE))
            .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 400, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(jButton1)
                .addGap(84, 84, 84)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 190, javax.swing.GroupLayout.PREFERRED_SIZE))
        );

        pack();
    }// </editor-fold>

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
    
    Connection con = null;
    Statement stmt = null;
    ResultSet rs = null;

    String sqlStr;

    try {
        //ドライバクラスをロードする
        Class.forName("org.gjt.mm.mysql.Driver");

        //MySQLに接続
        con =       (Connection) DriverManager.getConnection("jdbc:mysql://localhost:1527/testsystem", "ADMIN", "admin");

        //ステートメント生成
        stmt =      (Statement) con.createStatement();

        //SQL文
        sqlStr = "SELECT * FROM T_CUSTOMER";

        //SQL文実行
        rs = stmt.executeQuery(sqlStr);

        //検索結果数だけループ
        while(rs.next()){
            //レコードの値
            int id = rs.getInt("顧客ID");
            String name = rs.getString("顧客名");

            //表示
                jTextArea1.setText(id + ":" + name);
        }

        //クローズ
        rs.close();
        stmt.close();
        con.close();

    } catch (Exception ex) {
        try {
            //クローズ
            if (rs != null) rs.close();
            if (stmt != null) stmt.close();
            if (con != null) con.close();
        } catch (Exception e) {
        }
        //エラー
        ex.printStackTrace();
    }  
    }

  
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new NewJFrame().setVisible(true);

    
            }
        });
    }

  
    private javax.swing.JButton jButton1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTextArea jTextArea1;
 

}

評価

0

とりあえず気がついた2つだけ。
これで終わるかどうかは知らん。

1.コンストラクタを定義したなら、super()を呼べ。
2.なんでそんなにまでして、EventQueueに入れたがるの?

GUIは表示されてボタンは押せるの?
だったら、jButton1ActionPerformed()の中に
print文をずらずら並べてみては。デバッガでもいいし。

評価

0

あと、DBへの接続切断は、finally節の中だけでやるといいよ。

評価

0

不良社員さんに感動しました・・w

一先ずご指摘があった点の見直しをして参ります。
度々、有難う御座います。

評価

0

>1.コンストラクタを定義したなら、super()を呼べ。
それってSunの指針かなにか?記憶にないんで。
superclassにデフォルトコンストラクタがあれば、super()は勝手に呼ばれるが。
(superclassにデフォルトコンストラクタがないなら、そもそもコンパイルエラー)

評価

0

>superclassにデフォルトコンストラクタがあれば、super()は勝手に呼ばれるが。

それは、今回のコードを例に取れば、
NewJFrameに、コンストラクタの定義がなかった場合、でしょ。

まあ、仕様をきちんと押さえている訳じゃないし、
JFrame直下のクラスなんだから、JFrameのコンストラクタを呼ばないくらい、
どうってこと無いだろうけど、
俺はチキンだし、呼んどいた方が安全だし、
ってことで、いつも呼んでいる。

評価

0

public class FooObj0 {
    public FooObj0() {
        System.out.println("super");
    }
}
public class FooObj1 extends FooObj0 {
    public FooObj1() {
        System.out.println("sub");
    }
    public static void main(String[] args) {
        new FooObj1();
    }
}

こういうことを言ってるんじゃない?私がケースを把握できてないのか。それなら失礼。

評価

0

スレ主殿をうっちゃらかしてなんだが・・・。
「コンストラクタの先頭でsuper(コードに応じて必要な引数)を呼んでおけば、まず間違いはない」
俺が考えているのはそれだけ。
呼ばなくてもいいかどうかはどうでもいいのよ。

評価

0

「こうやっておけばいい」という考え方は、理解を阻害して思考停止する要因になりうる。
昔Cでもっともらしく言われた、

if (1 == a)

なんかも同じ。

評価

0

ん?
それは、定数は左側に置くなっていいたいの?
俺はこだわらんけどな。
リテラルじゃないけど、

if ( "hoge".equals( ugauga ) ) ...

って、普通にやる。

思考停止ってのはなんだかな。
俺は、依存は1箇所に、かつ徹底して依存するべし、
と考えてるし、それには符合してるよ。

・・・この辺にしておいた方がいいんでないかと。

評価

0

不良社員氏がどうというわけじゃないよ。理解して使ってる人間には意味のないことだ。

評価

0

どう書いたものかな。でも、俺が火種のようだし。

>スレ主殿
プログラムのコードというものは、コメントを除けば、
全て、何らかの意味のあるものだ。
スタイルはそれぞれだが、自分の書いたコードについては、
その理由をきちんと説明できるのがいいです。

評価

0

[$様,不良社員様]
お互いの言ってくださっている事はどっちをとっても正解ではない気がします。
今まで出していただいたヒントを元にまたプログラムの開発と見直しに徹したいと思います。

プログラムに関しても意味がある物、と言う事を常に頭に置いて、製作に取り掛かりたいと思います。
お二人とも、有難う御座いました!

評価

0

訂正
>どっちをとっても正解ではない気がします。
どちらも正解という印象を受ける

でお願いします(+_+)

評価

0

|
 |⌒彡   喧嘩は良くないよ
 |冫、)
 |` /
 | /
 |/

評価

0

喧嘩したとは思ってないんだが…口調含め書き方が悪かったということだろう、それはお詫びする。

不良社員氏が出していた

>if ( "hoge".equals( ugauga ) ) 

を例にとると、不良社員氏がこう書くことについてダメだと言ったわけじゃなくて。
人に「文字列の比較はこう書けば間違いない」などと言ったとき、その人が発言者と同様に意味や危険性を理解できるのかを危惧しているに過ぎない。

「こうしておけばいい」という言葉を妄信的に捉えてしまう人間は、けっこういるものでね。
まあこのあたりの考え方も、いわゆる宗教論争なのかも知れん…。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。