今からはじめるプログラミング(目次)

自己紹介

(作成中・・・というか以下の記事内に過去自分が参加したプロジェクトなどについて書いているので、いつかまとめます。)

 

----------------index---------------

・最初なので大したことは書いておりませんが。最初の記事。目標はeclipseのインストールとぐぐれること。

今から始めるプログラミング1 - yo2an’s blog

・2ページ目・・・とにかく1画面表示してみるプログラム。ステップ数10行ぐらい。

今から始めるプログラミング2 - yo2an’s blog

・3ページ目・・・画面プログラムの解説、クラスの解説、イベント処理の解説。ステップ数20行弱。

今から始めるプログラミング3 - yo2an’s blog

・4ページ目・・・入力画面と出力画面、画面遷移。ステップ数40行ぐらい。

今から始めるプログラミング4 - yo2an’s blog

・5ページ目・・・クラス分割。こちらは60行ぐらい。

今から始めるプログラミング5 - yo2an’s blog

・6ページ目・・・画像の表示。40行は書いていない?くらい。

今から始めるプログラミング6 - yo2an’s blog

・7ページ目・・・HTMLを取得するプログラム。いつも使っているだけのブラウザについて考えてみる。30ステップよりおおい。

今から始めるプログラミング7(ぶれいく) - yo2an’s blog

・8ページ目・・・フラグについて。ノベルゲームの途中のクラス群。

今から始めるプログラミング8 - yo2an’s blog

・9ページ目・・・とりあえず画面遷移を何ページか進める。

今からはじめるプログラミング9 - yo2an’s blog

・10ページ目・・・フラグについて。ノベールゲームのなんとか形になったもの?全部で200ステップぐらい。

今からはじめるプログラミング10 - yo2an’s blog

 ・11ページ目・・・RPGをつくれないかなぁという感じ。テーブルで画像を表示してドラクエみたいなフィールドを構成してみる。

今からはじめるプログラミング11 - yo2an’s blog

・12ページ目・・・フィールドの上にキャラクターを表示して、東西南北(東のみ)に移動する。

今からはじめるプログラミング12 - yo2an’s blog

・13ページ目・・・移動したフィールドでモンスターに遭遇する。(タイトルがミスってるw)

今からはじめるプログラミング12 - yo2an’s blog

・14ページ目・・・戦闘画面というかモーダルダイアログについて、参照などの話。

今からはじめるプログラミング14 - yo2an’s blog

 ・15ページ目・・・キャラクターのステータス画面を。

今からはじめるプログラミング15 - yo2an’s blog

・16ページ目・・・休憩。実用性のある?プログラムを。

今からはじめるプログラミング16(休憩) - yo2an’s blog

・17ページ目・・・モンスターの実装。抽象化と具現化について少し。

今からはじめるプログラミング17 - yo2an’s blog

・18ページ目・・・テキストを表示して、メッセージを追加していく。

今からはじめるプログラミング18 - yo2an’s blog

・19ページ目・・・モンスターを仲間にする仕組みを中途半端に実装。

今からはじめるプログラミング19 - yo2an’s blog

 ・20ページ目・・・マップからマップの移動を階段で実装。移動できない属性を持つフィールドも追加。RPGは最後かな?

今からはじめるプログラミング20 - yo2an’s blog

 ・21ページ目・・・電卓を作ろうと思った。初心に返って。

今からはじめるプログラミング21 - yo2an’s blog

・22ページ目・・・電卓を完成?(バグが残ってます。)

今からはじめるプログラミング22 - yo2an’s blog

・23ページ目・・・電卓に余計な機能を追加。グラフ。

今からはじめるプログラミング23 - yo2an’s blog

・24ページ目・・・システムの情報を取得する。多言語対応のプログラムについて。

今からはじめるプログラミング24 - yo2an’s blog

・25ページ目・・・「戦闘?」のプログラム

今からはじめるプログラミング25 - yo2an’s blog

・ 26ページ目・・・閑話休題その2、マイニングとか

今からはじめるプログラミング26(ぶれいく2) - yo2an’s blog

 ・27ページ目・・・ハードウェアよりのプログラム。

今からはじめるプログラミング27 - yo2an’s blog

 ・28ページ目・・・27ページ目の続き。

今からはじめるプログラミング28 - yo2an’s blog

・29ページ目・・・ (比較的)新しいグラフのプログラム、サンプルコードを変更して、自分の思うデータを使うようにする・

今からはじめるプログラミング29 - yo2an’s blog

・30ページ目・・・グラフのデータ作成、グラフ化するプログラムの連携?みたいな。

今からはじめるプログラミング30 - yo2an’s blog

 ・31ページ目・・・朝のルーティン。

今からはじめるプログラミング31 - yo2an’s blog

・32ページ目・・・NFTでつかえるかも?乱数のプログラムを作りました。

今からはじめるプログラミング32 - yo2an’s blog

・ 33ページ目・・・キーで動く。

今からはじめるぷろぐらみんぐ33 - yo2an’s blog

・34ページ目・・・起動するたびに異なる画像を表示する。

今からはじめるプログラミング34 - yo2an’s blog

・35ページ目・・・画像の組み合わせでたくさんの画像をつくろうとしました。

今からはじめるプログラミング35 - yo2an’s blog

・36ページ目・・・オリジナルカードの作成?。

今からはじめるプログラミング36 - yo2an’s blog

・37ページ目・・・簡単な画像を量産する?みたいな。

今からはじめるプログラミング37 - yo2an’s blog

・38ページ目・・・オブジェクト指向的な?プログラミング。その1。

今からはじめるプログラミング38 - yo2an’s blog

・39ページ目・・・オブジェクト指向的な?プログラミング。その2。 

今からはじめるプログラミング39 - yo2an’s blog

・40ページ目・・・オブジェクト指向的な?プログラミング。その3。

今からはじめるプログラミング40 - yo2an’s blog

・41ページ目・・・複数の画像をひとつに合体。

今からはじめるプログラミング41 - yo2an’s blog

・42ページ目・・・ガチャガチャの概念?

今からはじめるプログラミング42 - yo2an’s blog

・43ページ目・・・合体からの分割。

今からはじめるプログラミング43 - yo2an’s blog

・44ページ目・・・画像のフォーマットの話かな?

今からはじめるプログラミング44 - yo2an’s blog

・44.5ページ目・・・システムを移行する話。PCを交換してて思ったこと。

今から始めるプログラミング44.5(移行) - yo2an’s blog

・44。51ページ目・・・なくてもいいです。

今からはじめるプろグラミング44.51(用語?などをとりとめもなく) - yo2an’s blog

・45ページ目・・・画像をドットえに変換する?

今からはじめるプログラミング45(ごめんなさい) - yo2an’s blog

・46ページ目・・・プログラムができても僕はこれができません?みたいな。

今からはじめるプログラミング46(構成の難しさ) - yo2an’s blog

・47ページ目・・・ノベルゲームふたたび

今からはじめるプログラミング47(ノベルゲームふたたび?) - yo2an’s blog

・48ページ目・・・ゲームエンジンについて?ソース管理とか?

今からはじめるプログラミング(ゲームエンジン) - yo2an’s blog

・49ページ目・・・システム監視のヒントアプリ1

今からはじめるプログラミング48(本当は49?)システム監視① - yo2an’s blog

・50ページ目・・・システム監視のヒントアプリ2

今からはじめるプログラミング50(システム監視②) - yo2an’s blog

・51ページ目・・・なんだっけ?

 

・52ページ目・・・WSADキーで移動する

今からはじめるプログラミング52(WASDで移動) - yo2an’s blog

 

 

・0.1ページ目・・・基本?

今からはじめるプログラミング0.1(いまさら基本まとまってないまとめ) - yo2an’s blog

 ・0.2ページ目・・・ビットコインについて少しまじめに。

今からはじめるプログラミング0.2(辞書とそれから) - yo2an’s blog

 

ある程度出来上がったら、また下記のBoothさんに100円でプロジェクトファイルを追加したいと思います。

ma2-ys - BOOTH

 

 

 

googleドライブのリンク

sample.zip - Google ドライブ

 

今からはじめるプログラミング77(よくわからない)

意味のあるプログラミンごをしてしまったので、混乱しているw

 

という感じで作っていた意味不明なもの。。。

CharactorData

-------------------------------------------------------------------------

package sample40;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.util.*;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;

/**
 *
 ********/
public class CharactorData extends JFrame implements ActionListener {

    private List<Map<String, String>> properties = new ArrayList<Map<String, String>>();
    private List<String> keyList = new ArrayList<String>();
    private JTable table = null;
    private JCheckBox bxSlct = new JCheckBox("のみ");
    private JTextField txtWord = new JTextField("いっち");

    public CharactorData() {
        init();
    }

    private void init() {
        Container container = this.getContentPane();
        container.setLayout(new BorderLayout());

        // Data read
        File data = new File("./data.txt");
        int cntDt = 0;
        if (data.exists()) {
            try {
                FileReader fr = new FileReader(data);
                BufferedReader br = new BufferedReader(fr);
                while (br.ready()) {
                    String line = br.readLine();
                    System.out.println(line);
                    int indexEq = line.indexOf("=");
                    String key = line.substring(0, indexEq);
                    keyList.add(key);
                    String value = line.substring(indexEq + 1);
                    Map<String, String> mapDt = new HashMap<String, String>();
                    mapDt.put(key, value);
                    properties.add(mapDt);
                    cntDt++;
                }
                br.close();
                fr.close();

                // Configur Table

                table = new JTable(cntDt, 2);
                // set Data
                for (int i = 0; i < cntDt; i++) {
                    Map<String, String> dt = properties.get(i);
                    String key = keyList.get(i);
                    table.setValueAt(dt.get(key), i, 1);
                    table.setValueAt(key, i, 0);

                }
                // Visible
                JScrollPane scr = new JScrollPane(table);
                container.add(scr, BorderLayout.CENTER);

            } catch (IOException e) {
                // TODO 自動生成された catch ブロック
                e.printStackTrace();
            }

        }
        JButton btnTotal = new JButton("たす");
        container.add(btnTotal, BorderLayout.EAST);
        btnTotal.setActionCommand("total");
        btnTotal.addActionListener(this);

        container.add(bxSlct, BorderLayout.WEST);
        bxSlct.setActionCommand("?"); //TODO huyou

        container.add(txtWord, BorderLayout.NORTH);
        txtWord.setActionCommand("match");//TODO huyou


        this.setTitle("よくわからないけれどなんかいろいろある画面");
        this.setSize(new Dimension(800, 600));
        this.setVisible(true);

    }

    private int total(boolean flg) {
        System.out.println("flg=" + flg);

        // 合計
        int rowNum = table.getRowCount();
        int total = 0;
        // いっち
        boolean flg2 = false;
        String moji = txtWord.getText();
        if(!"".equals(moji)){
            flg2 = true;
        }


        if (flg) {
            //on
            for (int i = 0; i < rowNum; i++) {
                try {

                    String datO = (String) table.getValueAt(i, 0);
                    String datS = (String) table.getValueAt(i, 1);

                    if (table.isCellSelected(i, 1)) {

                        if(flg2){
                            if(moji.equals(datO)){
                                total += Integer.parseInt(datS);
                            }
                        }else{
                            total += Integer.parseInt(datS);
                        }
                    }

                } catch (NumberFormatException e1) {
                    System.out.println("数値ではありません[" + table.getValueAt(i, 1)
                            + "]");
                }

            }
        } else {
            //off
            for (int i = 0; i < rowNum; i++) {
                try {

                    String datO = (String) table.getValueAt(i, 0);
                    String datS = (String) table.getValueAt(i, 1);

                    if(flg2){
                        if(moji.equals(datO)){
                            total += Integer.parseInt(datS);
                        }
                    }else{
                        total += Integer.parseInt(datS);

                    }
                } catch (NumberFormatException e1) {
                    System.out.println("数値ではありません[" + table.getValueAt(i, 1)
                            + "]");
                }

            }

        }

        System.out.println("total=" + total);
        return total;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        String command = e.getActionCommand();
        if ("total".equals(command)) {
            //

            int total = this.total(bxSlct.isSelected());
            JOptionPane.showConfirmDialog(this, "ごうけい="+total);
        }
    }

    public static void main(String[] args) {
        new CharactorData();
    }

}

-----------------------------------------------------------------------------

なおパスにdata.txtというファイルが必要です。

ファイルにある

「~=~」という形式のテキストを「=」で分割して、テーブルに表示します。

数値を「たし」ます。

フラグがあります。

テキスト入力があります。

期間をかけて作ったので、スパゲッティコード化しています。

 

https://amzn.to/3HRYevF

今からはじめるプログラミング76(SQLを発行する・・・その4)

引数のSQLを実行するように変更した

(手順はまぁソースを見ていただければw)

ので、どうせなら、画面で入力したSQLを実行して、結果をテーブルに編集して表示する、というような形に変更したいと思います!

うぉーなんか役に立ちそうなもの作っちゃってるぅ?

というわけで、ざっくりつくった画面です。

とりあえずSQLを実行するまで、無理やり持っていきましたw

※意味のないログアウト画面が出てきますwwwww

(スクショなくてすいません、surfaceのスクショコマンド忘れましたw)

途中でございますが、ちょっと考えれば、更新などもできそうですね。

是非CSEとかObjectbrouserとかに負けないクライアントソフトを作ってみてください!

という感じですw

以下ソースです。

https://aki.teracloud.jp/share/11b1b683d89d4478

 

というかログアウト画面表示しないように作れよ!

 

wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww

今からはじめるプログラミング75(SQLを発行する・・・その3)

データを追加するSQLを発行する場合。。。

あまり行けてないのですが、違うメソッドを呼びます。

preparedstatementのexecuteQuery()というメソッドを使ってSQLを実行しました。

select文はquery=問い合わせなので、データを追加するinsert やデータを更新するupdateはこのメソッドに該当しません。

というか、自分の作ったexecSQLというメソッド自体が、名前とちょっと齟齬がある形になっていますw

まぁそれはおいておいて、というわけで、executeUpdateというメソッドを利用します。

別のメソッドを追加したログアウト画面ですw

queryを実行するメソッドもちょっと修正しましたw

そして、id列がidになっていないというwww

以下ソースです。

--------------------------------------------------------------------------

package sample39;

import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Logout extends JFrame implements ActionListener {

    @Override
    public void actionPerformed(ActionEvent e) {
        // ボタンなどが押された時の処理を描く(イベントドリブンという?)

        String eventName = e.getActionCommand();
        // 確認
        System.out.println(eventName);
        if ("cancel".equals(eventName)) {
            this.setVisible(false);
            // 特に意味はないですが、終了時に数値を通知できます。
            System.exit(99);
        }

    }

    public Logout() {
        init();
    }

    private void init() {
        // コンポーネントの入れ物
        Container container = this.getContentPane();

        JButton btnLogout = new JButton("ログアウト");
        JButton btnCancel = new JButton("キャンセル");
        // コンポーネントのおおきさ
        btnLogout.setSize(100, 30);
        btnCancel.setSize(100, 30);
        // コンポーネントの場所
        btnLogout.setLocation(100, 100);
        btnCancel.setLocation(250, 100);
        // イベント実行時のきりわけに
        btnLogout.setActionCommand("logout");
        btnCancel.setActionCommand("cancel");
        // <b>ログアウトボタンを使用不能に</b>
        btnLogout.setEnabled(false);
        // イベントの登録
        btnLogout.addActionListener(this);
        btnCancel.addActionListener(this);

        JPanel pnl = new JPanel();
        pnl.add(btnLogout);
        pnl.add(btnCancel);

        container.add(pnl);

        this.setTitle("ろぐあうと?");
        this.setSize(600, 400);

        this.setLocation(200, 200);
        this.setVisible(true);

    }

    public void exec(String sql, String params) {

        final String URL = "jdbc:sqlite:E:\\resource\\sqlite_win\\test.db";
        // final String USER = "";
        // final String PASS = ""; Connection conn = null;
        Connection conn = null;
        PreparedStatement ps = null;

        try {
            conn = DriverManager.getConnection(URL);
            ps = conn.prepareStatement(sql);
            // パラメータのセット
            for (int i = 0; i < params.length; i++) {
                ps.setString(i + 1, params[i]);

            }
            // SQL実行
            ResultSet rs = ps.executeQuery();

            // /MetaDataから列名とかを取得する
            ResultSetMetaData mDat = rs.getMetaData();
            int colCnt = mDat.getColumnCount();
            // 列名をいれる配列
            String names = new String[colCnt];

            for (int i = 0; i < colCnt; i++) {
                // 列名をmetadataから配列に入れて表示(System.out)
                names[i] = mDat.getColumnName(i + 1);
                System.out.print(names[i] + " | ");

            }
            // 見ずらいので改行
            System.out.println(" ");

            while (rs.next()) {
                for (int i = 0; i < colCnt; i++) {
                    System.out.print(rs.getString(names[i]) + " | ");

                }
                System.out.println(" ");

            }
            rs.close();
            ps.close();
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (conn != null) {
                    conn.close();

                }
            } catch (SQLException e) {
                // TODO 自動生成された catch ブロック
                e.printStackTrace();
            }
            System.out.println("処理が完了しました");
        }

    }

    public void execUpd(String sql, String params) {

        final String URL = "jdbc:sqlite:E:\\resource\\sqlite_win\\test.db";
        // final String USER = "";
        // final String PASS = ""; Connection conn = null;
        Connection conn = null;
        PreparedStatement ps = null;

        try {
            conn = DriverManager.getConnection(URL);
            ps = conn.prepareStatement(sql);
            if (params != null) {

                // パラメータのセット
                for (int i = 0; i < params.length; i++) {
                    ps.setString(i + 1, params[i]);

                }
            }

            // SQL実行
            int result = ps.executeUpdate();
            System.out.println("処理が完了しました(" + result + "件)");

        } catch (SQLException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (conn != null) {
                    conn.close();

                }
            } catch (SQLException e) {
                // TODO 自動生成された catch ブロック
                e.printStackTrace();
            }
            System.out.println("処理が完了しました");
        }

    }

    /**
     * SQLを実行するメソッドを追加して、ポインタから実行できるようにした
     * */
    public void execSQL() {

        final String URL = "jdbc:sqlite:E:\\resource\\sqlite_win\\test.db";
        // final String USER = "";
        // final String PASS = "";
        final String SQL = "select * from area where id =? ;";
        Connection conn = null;
        PreparedStatement ps = null;

        try {
            conn = DriverManager.getConnection(URL);
            ps = conn.prepareStatement(SQL);

            ps.setInt(1, 1);

            ResultSet rs = ps.executeQuery();

            // /MetaDataから列名とかを取得する
            ResultSetMetaData mDat = rs.getMetaData();
            int colCnt = mDat.getColumnCount();
            // 列名をいれる配列
            String names = new String[colCnt];

            for (int i = 0; i < colCnt; i++) {
                // 列名をmetadataから配列に入れて表示(System.out)
                names[i] = mDat.getColumnName(i + 1);
                System.out.print(names[i] + " | ");

            }
            // 見ずらいので改行
            System.out.println(" ");

            while (rs.next()) {
                for (int i = 0; i < colCnt; i++) {
                    System.out.print(rs.getString(names[i]) + " | ");

                }
                System.out.println(" ");

            }
            rs.close();
            ps.close();
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (conn != null) {
                    conn.close();

                }
            } catch (SQLException e) {
                // TODO 自動生成された catch ブロック
                e.printStackTrace();
            }
            System.out.println("処理が完了しました");
        }
    }

    public static void main(String args) {
        Logout frame = new Logout();
        // //SQLを実行する
        frame.execSQL();
        frame.exec("select * from area where id =? ;", new String
{ "1" });
        frame.execUpd("insert into area values (1,'name',2,1,'cm');", null);

    }

}

-----------------------------------------------------------------------

実行結果は以下になります。

(何回実行したかがわかるという?)

-------------------------------------------------------------------------

id | name | sort | res_flg | comment |  
1 | minamino-huchuu | 1 | 0 | test data |  
1 | name | 2 | 1 | cm |  
1 | name | 2 | 1 | cm |  
処理が完了しました
id | name | sort | res_flg | comment |  
1 | minamino-huchuu | 1 | 0 | test data |  
1 | name | 2 | 1 | cm |  
1 | name | 2 | 1 | cm |  
処理が完了しました
処理が完了しました(1件)
処理が完了しました
cancel

----------------------------------------------------------------------------

あれだ、コミットについて忘れてますw

実行結果を見るとauto commitがされているようですがwww

 

 

今からはじめるプログラミング74(SQLを発行する・・・その2)

結果が見ずらいので、コネクション(DBへの接続)とかリザルトセット(結果)からメタデータ(データの補完データ?とか設定?)を取得して、結果に列名を加えてみました。

こうすると実行結果をより見やすくできます。

まぁ何ができるか確認するには、メタデータをSystemアウトしてしまうといいです。使える関数とかも確認できます。

 

修正したexecSQL

----------------------------------------------------------------------------------------

    /**
     * SQLを実行するメソッドを追加して、ポインタから実行できるようにした
     * */
    public void execSQL() {

        final String URL = "jdbc:sqlite:E:\\resource\\sqlite_win\\test.db";
        // final String USER = "";
        // final String PASS = "";
        final String SQL = "select * from area where id =? ;";

        try (Connection conn = DriverManager.getConnection(URL);
                PreparedStatement ps = conn.prepareStatement(SQL)) {

            ps.setInt(1, 1);

            try (ResultSet rs = ps.executeQuery()) {
                ///MetaDataから列名とかを取得する
                ResultSetMetaData mDat = rs.getMetaData();
                int colCnt = mDat.getColumnCount();
                //列名をいれる配列
                String[] names = new String[colCnt];

                for(int i=0;i<colCnt ;i++){
                    //列名をmetadataから配列に入れて表示(System.out)
                    names[i] = mDat.getColumnName(i+1);
                    System.out.print(names[i] + " | ");

                }
                //見ずらいので改行
                System.out.println( " ");

                while (rs.next()) {
                    for(int i=0;i<colCnt ;i++){
                        System.out.print(rs.getString(names[i]) + " | ");

                    }
                    System.out.println( " ");

                }
            }
            ;
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            System.out.println("処理が完了しました");
        }
    }

 

------------------------------------------------------------------------------

SQLを現場で使う場合は、件数が多い場合など、ページングを行うことがほとんどですが、そのために実際のSQLの前に件数カウントのSQLを発行することが多いですね。

また、コスト(時間とか処理の重さ)を計測して、必要ならチューニングする必要もあります。データベーススペシャリストなんて資格もあるくらいですから、深い分野であるので、体制の充実したプロジェクトだったら、逐次相談して進めましょう。

ものによっては、プリントアウトするとA4数枚とかのSQLを書くこともあります。。。商用DBでストアドとかプロシジャなど多用したり、何をどこまで使用するか、たいていルールが決まっているので、確認する必要があります。

 

・・・というかよく見たらコネクションクローズしてないですねwwww

 

 

 

 

今からはじめるプログラミング73(SQLを発行する)

いきなりSQLを発行するといわれても。

というわけで前回の続きでつくったDBに接続してSQLを発行してみます。

SQLというのはDBを操作するプロギュラミンギュ言語です。

プログラムからプログラムを操作するって妙な感じかもしれませんが、

まぁそれで大量データのやり取りがスムーズになれば、いいじゃん、ぐらいで勘弁してください。

環境構築は、やはり以下のサイトのそのままです。

Java SQLiteにJDBC接続してselectするサンプル | ITSakura

若干、前回DB名を変えたり、列名を変えたりしています。

なので、コピペしたいソースも若干修正しました。

というわけでさらに昔の、ログアウトできない画面にメソッドを追加して、ポインタからメソッドを読んでみるようにしてみました。

まったくもってログアウト画面にそんなメソッドを追加する意味はないのですが、追加しました。

Logout.java

--------------------------------------------------------------------------------

package sample38;

import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Logout extends JFrame implements ActionListener {

    @Override
    public void actionPerformed(ActionEvent e) {
        // ボタンなどが押された時の処理を描く(イベントドリブンという?)

        String eventName = e.getActionCommand();
        // 確認
        System.out.println(eventName);
        if ("cancel".equals(eventName)) {
            this.setVisible(false);
            // 特に意味はないですが、終了時に数値を通知できます。
            System.exit(99);
        }

    }

    public Logout() {
        init();
    }

    private void init() {
        // コンポーネントの入れ物
        Container container = this.getContentPane();

        JButton btnLogout = new JButton("ログアウト");
        JButton btnCancel = new JButton("キャンセル");
        // コンポーネントのおおきさ
        btnLogout.setSize(100, 30);
        btnCancel.setSize(100, 30);
        // コンポーネントの場所
        btnLogout.setLocation(100, 100);
        btnCancel.setLocation(250, 100);
        // イベント実行時のきりわけに
        btnLogout.setActionCommand("logout");
        btnCancel.setActionCommand("cancel");
        // <b>ログアウトボタンを使用不能に</b>
        btnLogout.setEnabled(false);
        // イベントの登録
        btnLogout.addActionListener(this);
        btnCancel.addActionListener(this);

        JPanel pnl = new JPanel();
        pnl.add(btnLogout);
        pnl.add(btnCancel);

        container.add(pnl);

        this.setTitle("ろぐあうと?");
        this.setSize(600, 400);

        this.setLocation(200, 200);
        this.setVisible(true);

    }
/**
 * SQLを実行するメソッドを追加して、ポインタから実行できるようにした
 * */
    public void execSQL() {

        final String URL = "jdbc:sqlite:E:\\resource\\sqlite_win\\test.db";
        // final String USER = "";
        // final String PASS = "";
        final String SQL = "select * from area where id =? ;";

        try (Connection conn = DriverManager.getConnection(URL);
                PreparedStatement ps = conn.prepareStatement(SQL)) {

            ps.setInt(1, 1);

            try (ResultSet rs = ps.executeQuery()) {
                while (rs.next()) {
                    System.out.println(rs.getInt("id") + " "
                            + rs.getString("name") + " "
                            + rs.getString("comment"));
                }
            }
            ;
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            System.out.println("処理が完了しました");
        }
    }

    public static void main(String args[]) {
        Logout frame = new Logout();
        ////SQLを実行する
        frame.execSQL();

    }

}

--------------------------------------------------------------------------------

実行結果

---------------------------------------------------------------

1 minamino-huchuu test data
処理が完了しました
cancel

---------------------------------------------------------------

 

以下、SQLiteJDBCとテストDBとsrcをまとめてアップしました。

https://aki.teracloud.jp/share/11b1cfdcd5c27f27

 

まぁこれでデータベースは完璧だね、なんてとても言えませんが、

javaDBでDB接続をする手順ですw

 

とはいえ、実際の業務アプリで、JDBC接続なんてするんだろうか。。。

実際は、フレームワークにデータベースとの接続を管理するコネクションプールがあって、そこからコネクションを取得する、、、というような使い方をします。

というのも、コネクションの接続をいちいち切ったりすると、接続に時間がかかったりするので、コネクションを使いまわして、処理速度を稼ぐということをします。

そのコネクションを管理するのをプールと呼んでいますが、いくつかコネクションを保持して、空いているコネクションをプログラムに渡す、みたいなプログラムです。

いちいち同じ記述をプログラムに施す必要もないし、目的のSQLを実行して返すだけでよくなります。

 

アマゾンのタイムセールのリンクを張ろうと思ったのですが、ありきたりでつまらないので、タイムセールの面白ネタを張ろうとしたのであるけれども、画面コピーのしかたを忘れてしまいましてもうした。

特選タイムセール1%オフってwwwwwwwwwwwwwwwwwwwwwwwwwwwwww

 

今からはじめるプログラミング72(習慣的にしていることのメモ)

僕は当初システムエンジニアというっても、運用の管理をしていたので、

かはわからないけれど。

環境構築とか準備とかの際にコマンドベースの作業では、必ずメモをとる習慣があった。というよりそう教えられた?と思う。

そして僕自身、コマンドの細かいオプションとかを覚えられない人間なので、ということもある。

というわけで、コマンドの履歴はメモとして手書きで残すよりは、windowsならば、ファイルで操作を残しておこう。

あとでインストール手順とかドキュメンテーションエスカレーションにも役立ちます。

 

↓運用監視でも勉強することはいっぱいありますねw

https://amzn.to/3Zl4fcg

今からはじめるプログラミング71(なんとなくわかるかもしれないデータベース)

いままで扱う「前」手順のめんどくささにより、ずっと忌避してきたけれど。

javaでアプリケーションを作る際に外せないのが、データベースの操作。

少量のデータならファイルシステムでも問題ないけれど。

本格的な業務アプリケーションでは9割がた使っているのではないだろうか。

まぁファイルシステムの親玉?みたいなミドルウェアと考えてみていただければ?いやエクセル(←汎用てっきな表現を忘れまして。)かな?

エクセルだと数千件のデータを使おうとするとぷっつり落っこちたり、しませんか?僕は昔事務をやっていたので、資産の償却の計算とかエクセルでやったりしていたのですが、よく落ちてました。

まぁそういうときはデータベースの出番、というわけです。

個人の事業ならファイルシステムでも問題なさそうな気もしますが、データベースを使ったほうが、より信頼性も増すのかも。

そんなわけで、より簡単に使いたいので、名前からも使いやすそうなSQLiteというフリーウェアを使います。

ていうか、以下のサイトを参考にさせていただきました。

Java SQLiteにJDBC接続してselectするサンプル | ITSakura

きれいに整理されているので、こちらのほうが勉強になるようです。

まぁそんなわけで。

ダウンロードした後、一通り(というほどすべては捜査していない。)の履歴を張っておきます。

surfaceのスクショの取り方を忘れてしまったので。

--------------------------------------------------------------------------------------

C:\Windows\system32>e:

E:\>cd resource

E:\resource>cd sqlite_win

E:\resource\sqlite_win>sqlite3 test.db
'sqlite3' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

E:\resource\sqlite_win>sqlite3 test.db
SQLite version 3.40.1 2022-12-28 14:03:47
Enter ".help" for usage hints.
sqlite> create table area(id int(10),name varchar(100),sort int(10),res_flg int(1),comment varchar(50))
   ...> ;
sqlite> insert into area values(1,'minamino-huchuu',1,0,'test data');
sqlite> select * from area;
1|minamino-huchuu|1|0|test data
sqlite>

-------------------------------------------------------------------------

※ちなみに「コマンドとして認識されていたい」というエラーが出ていますが、間違えてdll版をダウンロードしてました。

test.dbというデータベースの入れ物を作成して、

areaという名前のテーブル(id/name/sort/res_flg/commentという列で)を作成して、

1行登録(insert)しています。

 

 

というわけで、環境を作って(しかもjavaで動くか確認してない)終わりました。