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

彼女からは、おいちゃんと呼ばれています

ウェブ技術や日々考えたことなどを綴っていきます

Jakarta Commons HttpClient によるSBI証券での自動売買(7) - 会社四季報の企業概要をデータベースへ格納編(実行&ログ)

自動売買 Java


これまで会社四季報の企業概要データをデータベースへ格納するコードを書いてきましたが,今日の内容はそれらのコードを呼び出すところです。


ついでにログをログテーブルに書き込みます。ログの書込みは別クラスに担当させています。

サンプルコード

public class ImportCampany {

    public static void main(String[] args) {

        // ログ
        Log log = new Log();    // ログを書き込むクラス(後述)
        log.setStartTime();
        System.out.println("開始時刻: " + log.getStartTime());
        System.out.println("------------------------------------------------------------");

        SBI_Client sbi = new SBI_Client();  // これまで書いてきたコードは,
                                            // 実はこういう名前のクラスでした

        try {
            sbi.login();

        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("ログインに失敗しました。");
            return;
        }

        String minCd = "1001";
        String maxCd = "9999";
        int count = sbi.importCampany(minCd, maxCd);

        if (count == 0) {
            System.out.println("企業概要データの取込に失敗しました。");
            return;
        }

        System.out.println("------------------------------------------------------------");
        System.out.println(count + " 件の企業概要データを格納しました。");
        log.setEndTime();
        System.out.println("終了時刻: " + log.getEndTime());
        System.out.println("処理時間: " + log.getDiffTime());

        // ログを書き込む
        log.setWork("企業概要");
        log.setCount(count);
        log.setRemark("最小コード: " + minCd + ", 最大コード: " + maxCd + ", HttpClient - Java");
        log.writeLog();
    }
}


次にログを書き込むクラスです。以前紹介した Appache Commons Lang を使っています。2つの時間(時刻)の差を HH:mm:ss 形式で表現できるので,まさに今回の分野で大活躍してくれています。

サンプルコード 2

import java.sql.SQLException;
import java.text.DateFormat;
import java.util.Date;
import org.apache.commons.lang.time.DurationFormatUtils;

public class Log {

    /**
     * 処理の開始時刻
     */
    private Date startTime;

    /**
     * 処理の終了時刻
     */
    private Date endTime;

    /**
     * 処理時間
     */
    private String diffTime;

    /**
     * 処理内容
     */
    private String work;

    /**
     * 処理数
     */
    private int count;

    /**
     * 備考
     */
    private String remark;

    /**
     * DateFormat
     *
     * yyyy/MM/dd HH:mm;ss
     */
    private DateFormat dateFormat =
        DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM);

    /**
     * 開始時刻をセットする
     */
    public void setStartTime() {
        this.startTime = new Date();
    }

    /**
     * 終了時刻をセットする
     * 処理時間を計算する
     */
    public void setEndTime() {
        this.endTime = new Date();
        this.setDiffTime();
    }

    /**
     * 処理時間を計算する
     */
    public void setDiffTime() {
        this.diffTime = DurationFormatUtils.formatPeriod(
                this.startTime.getTime(), this.endTime.getTime(), "HH:mm:ss");
    }

    /**
     * 処理内容をセットする
     */
    public void setWork(String str) {
        this.work = str;
    }

    /**
     * 処理数をセットする
     */
    public void setCount(int i) {
        this.count = i;
    }

    /**
     * 備考をセットする
     */
    public void setRemark(String str) {
        this.remark = str;
    }

    /**
     * 開始時刻を返す
     */
    public String getStartTime() {
        String ret = this.dateFormat.format(this.startTime);
        return ret;
    }

    /**
     * 終了時刻を返す
     */
    public String getEndTime() {
        String ret = this.dateFormat.format(this.endTime);
        return ret;
    }

    /**
     * 処理時間を返す
     */
    public String getDiffTime() {
        return this.diffTime;
    }

    /**
     * ログを書き込む
     */
    public void writeLog() {
        DB db = new DB();   // 自作クラスです。
                            // 詳細は関連エントリーを参照してください

        try {
            db.getConnection();
            String sql = this.writeLogSQL();
            db.excuteUpdate(sql);

        } catch (ClassNotFoundException e) {
            e.printStackTrace();

        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * ログを書き込む SQL
     */
    private String writeLogSQL() {
        String sql = "INSERT INTO logtbl("
            + "start_time,"
            + "end_time,"
            + "diff_time,"
            + "work,"
            + "count,"
            + "remark"
        + ")"
        + "VALUES("
            + "'" + this.dateFormat.format(this.startTime) + "',"
            + "'" + this.dateFormat.format(this.endTime) + "',"
            + "'" + this.diffTime + "',"
            + "'" + this.work + "',"
            + "'" + this.count + "',"
            + "'" + remark + "'"
        + ")";

        return sql;
    }
}

参考サイト

Date 型のデータをそのまま MySQL の datetime 型のフィールドに書き込もうとするとエラーとなるので,変換してあげないといけません。


今回は DateFormat クラスを使いましたが,次のサイトが分かりやすい説明をしてくれています。