[Java] 27 コードの分割と戻り値

前回の続きです。

mainメソッドが各メソッドを順次実行する構成とし、変数を引き継いでいくようにしました。細かいところでハマりそうになりながらも、何とか書けました。

Pythonで書くときはコードが長くなると分割してライブラリにしそれぞれimportしていましたが、mainメソッドに各メソッドをぶら下げるやり方も便利ですね。Pythonでも長いベタ書きになりそうなときはこの方法も選択肢に入れようと思います。

ところで、おまじない扱いしていたvoidが戻り値なしという意味だということをようやく知りました。今まで何が空っぽなんだろうとぼんやり考えていました。

package mysql_test5;

import java.util.ArrayList;
import java.util.List;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class AppTest {
    public static void main(String args[]) {
        String ID = ID_search();
        System.out.println("mainメソッド出力 " + ID);
        race_search(ID);}

    // 第1メソッド
    public static String ID_search() {
        String url = "jdbc:mysql://localhost:3306";
        String user = "ユーザ名";
        String password = "パスワード";

        InputStreamReader isr = new InputStreamReader(System.in);
        BufferedReader br = new BufferedReader(isr);

        System.out.println("競走馬名を入力してください");

        String name = null;
        try {
            name = br.readLine();}

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

        System.out.println("競走馬名は「" + name + "」です");

        List<String> ID_list = new ArrayList<String>();
        for (int i = 1986; i < 2019; i++){
            try (Connection conn = DriverManager.getConnection(url, user, password)){
                String sql = String.format("SELECT horseID FROM horse_list.horse%d WHERE 検索馬名 = '%S'",i,name);
                PreparedStatement ps = conn.prepareStatement(sql);
                ResultSet rs = ps.executeQuery();

                String ID = null;
                while (rs.next()) {
                    ID = rs.getString("horseID");
                    System.out.println(ID);
                    ID_list.add(ID);
                    System.out.println(ID_list);}}

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

        if (ID_list.size() >= 2){
            System.out.println("該当する馬が複数います。番号を入力してください。");
            int i = 1;
            for (String s : ID_list) {
                System.out.println(i + " " + s);
                i = i + 1;}

            InputStreamReader isr2 = new InputStreamReader(System.in);
            BufferedReader br2 = new BufferedReader(isr2);

            String num = null;
            try {
                num = br2.readLine();}
            catch (IOException e) {
                e.printStackTrace();}

            Integer num_int = Integer.parseInt(num);
            String ID = ID_list.get(num_int - 1);
            System.out.println("該当馬のIDは" + ID + "です");

            return ID;}

        else if (ID_list.size() == 0){
            System.out.println("該当する馬はいません");
            String ID = null;
            System.exit(0);

            return ID;}

        else {
            String ID = ID_list.get(0);
            System.out.println("該当馬のIDは" + ID + "です");

            return ID;}}}
    
    // 第2メソッド
    public static void race_search(String ID) {
        System.out.println("メソッド内出力 " + ID);}}
--------------------------------------------------

出力
--------------------------------------------------
競走馬名を入力してください
ヒシマサル
競走馬名は「ヒシマサル」です
198908574
[198908574]
201405934
[198908574, 201405934]
該当する馬が複数います。番号を入力してください。
1 198908574
2 201405934
2
該当馬のIDは201405934です
mainメソッド出力 201405934
メソッド内出力 201405934

[Java] 26 if文,リスト内要素数,文字列の整数への変換

前回の続きです。

検索結果が複数の場合、番号を入力して該当馬を選択するコードです。

書いていてさほど違和感はありませんでした。

<前回の続き>

// IDリストの要素数による条件式
if (ID_list.size() >= 2){
    System.out.println("該当する馬が複数います。番号を入力してください。");

    int i = 1;
    for (String s : ID_list) {
        System.out.println(i + " " + s);
        i = i + 1;}

        InputStreamReader isr2 = new InputStreamReader(System.in);
        BufferedReader br2 = new BufferedReader(isr2);

        String num = null;
        try {
            num = br2.readLine();}
        catch (IOException e) {
            e.printStackTrace();}
     
     // 整数への変換
        Integer num_int = Integer.parseInt(num);
     // リスト内要素の取得
        String ID = ID_list.get(num_int - 1);
        System.out.println("該当馬のIDは" + ID + "です");}

else if (ID_list.size() == 0){
    System.out.println("該当する馬はいません");
    // システム終了
    System.exit(0);}

else {
    String ID = ID_list.get(0);
    System.out.println("該当馬のIDは" + ID + "です");}}}
--------------------------------------------------

出力
--------------------------------------------------
競走馬名を入力してください
ヒシマサル
競走馬名は「ヒシマサル」です
198908574
[198908574]
201405934
[198908574, 201405934]
該当する馬が複数います。番号を入力してください。
1 198908574
2 201405934
2
該当馬のIDは201405934です

[Java] 25 リストとfor文

前回の続きです。

競走馬名に対して登録が複数ある場合に競走馬IDをリスト化するコードを書きました。

Listを使うために一々ライブラリをimportするのには少し驚きました。

for文の書き方はPythonよりこちらの方が好みかも。

package mysql_test3;

import java.util.ArrayList;
import java.util.List;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class AppTest {
    public static void main(String args[]) {
        String url = "jdbc:mysql://localhost:3306";
        String user = "ユーザ名";
        String password = "パスワード";

        InputStreamReader isr = new InputStreamReader(System.in);
        BufferedReader br = new BufferedReader(isr);

        System.out.println("競走馬名を入力してください");

        String name = null;
        try {
            name = br.readLine();}

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

        System.out.println("競走馬名は「" + name + "」です");

        List<String> ID_list = new ArrayList<String>();
        for (int i = 1986; i < 2019; i++){
            try (Connection conn = DriverManager.getConnection(url, user, password)){
                String sql = String.format("SELECT horseID FROM \
                horse_list.horse%d WHERE 検索馬名 = '%S'",i,name);
                PreparedStatement ps = conn.prepareStatement(sql);
                ResultSet rs = ps.executeQuery();

                String ID = null;
                while (rs.next()) {
                    ID = rs.getString("horseID");
                    System.out.println(ID);
                    ID_list.add(ID);
                    System.out.println(ID_list);}}

            catch (Exception e) {
                    e.printStackTrace();}}}}
--------------------------------------------------

出力
--------------------------------------------------
競走馬名を入力してください
ヒシマサル
競走馬名は「ヒシマサル」です
198908574
[198908574]
201405934
[198908574, 201405934]

[Java] 24 標準入力取得とformatメソッド

前回の続きです。

ターミナルに競走馬名を入力しそれを元にSQL文を作成、そして競走馬IDを検索するコードを書きました。

特に引っかかるところはなかったです。

package mysql_test2;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class AppTest {
    public static void main(String args[]) {
        String url = "jdbc:mysql://localhost:3306";
        String user = "ユーザ名";
        String password = "パスワード";

        InputStreamReader isr = new InputStreamReader(System.in);
        BufferedReader br = new BufferedReader(isr);

        System.out.println("競走馬名を入力してください");

        String name = null;
        try {
            name = br.readLine();}

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

        System.out.println("競走馬名は「" + name + "」です");

        try (Connection conn = DriverManager.getConnection(url, user, password)){
            String sql = String.format("SELECT horseID FROM horse_list.horse2018 \
            WHERE 検索馬名 = '%S'",name);
            PreparedStatement ps = conn.prepareStatement(sql);
            ResultSet rs = ps.executeQuery();

            while (rs.next()) {
                System.out.println(rs.getString("horseID"));}}

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

[Java] 23 mySQLへの接続

以前Pythonで書いたmySQL検索コードをJavaに取り込めないか調べたところ、Jython(ジャイソンと読むらしい)ならできることが判明。しかしPython2のみ対応とのことで断念し、素直にJavaで書き直します。

昨年の4月に相当苦労してVScodeでのJava開発環境を構築しMavenプロジェクトを作成できるようにしましたが、そのおかげでデータベースAPIであるJDBCを簡単に導入できました。

mySQLの自製競馬データベースに接続し、ダービー馬”シャフリヤール”の競走馬IDを検索するコードを以下に記します。

しかしこのシンプルなコードを書くだけで、Javaの取っつきにくさを知るハメになりました。

Pythonのようにfinallyを安易には使えないようです。[Java]21の記事でCSVファイルを閉じられなかった理由がわかりました。

今回はtry-with-resources文でそれなりのコードにしました。この内容でもPreparedStatementとResultSetを閉じておらず不完全ですが、とりあえずよしとします。

package mysql_test;

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

public class AppTest {
    public static void main(String args[]) {
        String url = "jdbc:mysql://localhost:3306";
        String user = "ユーザ名";
        String password = "パスワード";

        try (Connection conn = DriverManager.getConnection(url, user, password)){
            String sql = "SELECT horseID FROM horse_list.horse2018 WHERE \
            検索馬名 = 'シャフリヤール'";
            PreparedStatement ps = conn.prepareStatement(sql);
            ResultSet rs = ps.executeQuery();

            while (rs.next()) {
                System.out.println(rs.getString("horseID"));}}

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