[Java] 29 戻り値がリストのメソッド

前回の続きです。

第2メソッドはリストを戻り値にして第3メソッドに渡しました。第3メソッドでも新たにリストを作成しますが、JavaではPythonのように戻り値を複数にできないので第3メソッド内で結合させるつもりです。

また変数名をJavaのルールに従って単語を直接連結かつ先頭語以外は大文字で始まるようにしました。Pythonでは全て小文字かつアンダーバー(アンダースコア)で連結します。

<importは省略>

public class AppTest {
    static String url = "jdbc:mysql://localhost:3306";
    static String user = "ユーザ名";
    static String password = "パスワード";

    public static void main(String args[]) {
        String ID = IDSearch();
        List<String> raceList = raceSearch(ID);
        raceSearch2(raceList);}

      <第1メソッドは省略>
    
    // 第2メソッド
    public static List<String> raceSearch(String ID) {
        System.out.println("第2メソッド内出力 " + ID);

        String birthYear = ID.substring(0,4);
        Integer birthYearInt = Integer.parseInt(birthYear);
        Integer startYear = birthYearInt + 2;
        String startYearStr = startYear.toString();

        System.out.println("最速デビュー年 " + startYear);

        ArrayList<String> raceList = new ArrayList<String>();
        List<String> columnList = new ArrayList<String>();
        List<String> columnNameList = new ArrayList<String>();
        int count = 1; // カラム名取得用

        for (int i = startYear; i < 2022; i++){
            System.out.println("検索年 " + i);
            try (Connection conn = DriverManager.getConnection(url, user, password)){

                String sql = String.format("SELECT 着順,枠番,馬番,斤量,騎手,タイム,通過,上り,単勝,人気,馬体重,賞金,raceID FROM horse_race_result.race_r_%d WHERE horseID = %s",i,ID);
                PreparedStatement ps = conn.prepareStatement(sql);
                ResultSet rs = ps.executeQuery();

                ResultSetMetaData rsmd = rs.getMetaData();
                int columnCount = rsmd.getColumnCount();

                int i2 = 1;
                if (count == 1){
                    while(i2 <= columnCount) {
                        columnNameList.add(rsmd.getColumnName(i2++));}}
                count = count + 1;

                while (rs.next()) {
                    ArrayList<String> raceResultList = new ArrayList<>(columnCount);

                    int i3 = 1;
                    while(i3 <= columnCount) {
                        raceResultList.add(rs.getString(i3++));}
                    System.out.println(raceResultList);

                    raceList.add("[" + raceResultList + "]");}}

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

        System.out.println(columnNameList);
        System.out.println(raceList);
        
     // カラム名のリストを先頭に結合
        raceList.add(0,"[" + columnNameList + "]");
        System.out.println(raceList);

        System.out.println("出走数 " + (raceList.size()-1));

        return raceList;}

    // 第3メソッド
    public static void raceSearch2(List<String> raceList) {
        System.out.println("第3メソッド内出力 " + raceList);}}
--------------------------------------------------

出力
--------------------------------------------------
該当馬のIDは201805165です
mainメソッド出力 201805165
第2メソッド内出力 201805165
最速デビュー年 2020
検索年 2020
[1, 7, 13, 55.0, 福永祐一, 1:49.9, 6-4, 34.6, 2.3, 1, 450(0), 700.0, r202008040605]
検索年 2021
[3, 8, 11, 56.0, 福永祐一, 1:48.0, 7-8-8, 33.4, 4.9, 2, 448(-2), 956.1, r202105010611]
[1, 6, 6, 56.0, 川田将雅, 1:43.9, 4-4, 34.1, 2.9, 2, 448(0), 3,833.6, r202109020111]
[着順, 枠番, 馬番, 斤量, 騎手, タイム, 通過, 上り, 単勝, 人気, 馬体重, 賞金, raceID]
[[[1, 7, 13, 55.0, 福永祐一, 1:49.9, 6-4, 34.6, 2.3, 1, 450(0), 700.0, r202008040605]], [[3, 8, 11, 56.0, 福永祐一, 1:48.0, 7-8-8, 33.4, 4.9, 2, 448(-2), 956.1, r202105010611]], [[1, 6, 6, 56.0, 川田将雅, 1:43.9, 4-4, 34.1, 2.9, 2, 448(0), 3,833.6, r202109020111]]]
[[[着順, 枠番, 馬番, 斤量, 騎手, タイム, 通過, 上り, 単勝, 人気, 馬体重, 賞金, raceID]], [[1, 7, 13, 55.0, 福永祐一, 1:49.9, 6-4, 34.6, 2.3, 1, 450(0), 700.0, r202008040605]], [[3, 8, 11, 56.0, 福永祐一, 1:48.0, 7-8-8, 33.4, 4.9, 2, 448(-2), 956.1, r202105010611]], [[1, 6, 6, 56.0, 川田将雅, 1:43.9, 4-4, 34.1, 2.9, 2, 448(0), 3,833.6, r202109020111]]]
出走数 3
第3メソッド内出力 [[[着順, 枠番, 馬番, 斤量, 騎手, タイム, 通過, 上り, 単勝, 人気, 馬体重, 賞金, raceID]], [[1, 7, 13, 55.0, 福永祐一, 1:49.9, 6-4, 34.6, 2.3, 1, 450(0), 700.0, r202008040605]], [[3, 8, 11, 56.0, 福永祐一, 1:48.0, 7-8-8, 33.4, 4.9, 2, 448(-2), 956.1, r202105010611]], [[1, 6, 6, 56.0, 川田将雅, 1:43.9, 4-4, 34.1, 2.9, 2, 448(0), 3,833.6, r202109020111]]]

[Java] 28 mySQL検索結果のメタデータ取得

前回の続きです。

PythonではmySQLの検索結果を自動的にリストとして取得できますが、Javaではメタデータを取得しその情報を元にリストを作成するのが便利です。

ここまでくるとブログ情報はほとんど見当たらず、業務系の領域に入っているようです。趣味でmySQLをJavaで操作する好事家は僅少みたいです。

package mysql_test6;

import java.util.Arrays;
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;
import java.sql.ResultSetMetaData;

public class AppTest {
    static String url = "jdbc:mysql://localhost:3306";
    static String user = "ユーザ名";
    static String password = "パスワード";

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

      <第1メソッドは省略>

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

        String birth_year = ID.substring(0,4);
        Integer birth_year_int = Integer.parseInt(birth_year);
        Integer start_year = birth_year_int + 2;
        String start_year_str = start_year.toString();

        System.out.println("最速デビュー年 " + start_year);

        List<String> raceList = new ArrayList<String>();
        
        for (int i = start_year; i < 2022; i++){
            System.out.println("検索年 " + i);
            try (Connection conn = DriverManager.getConnection(url, user, password)){

                String sql = String.format("SELECT 着順,枠番,馬番,斤量,騎手,タイム,通過,上り,単勝,人気,馬体重,賞金,raceID FROM horse_race_result.race_r_%d WHERE horseID = %s",i,ID);
                PreparedStatement ps = conn.prepareStatement(sql);
                ResultSet rs = ps.executeQuery();

                ResultSetMetaData rsmd = rs.getMetaData();
                int columnCount = rsmd.getColumnCount();

                while (rs.next()) {
                    ArrayList<String> raceResultList = new ArrayList<>(columnCount);
                    int i2 = 1;
                    while(i2 <= columnCount) {
                        raceResultList.add(rs.getString(i2++));}
                    System.out.println(raceResultList);

                    raceList.add("[" + raceResultList + "]");}}

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

        System.out.println(raceList);
        System.out.println("出走数 " + raceList.size());
        System.out.println("デビュー戦 " + raceList.get(0));}}
--------------------------------------------------

出力(ダービーのデータはまだ入っていません)
--------------------------------------------------
競走馬名を入力してください
シャフリヤール
競走馬名は「シャフリヤール」です
201805165
[201805165]
該当馬のIDは201805165です
mainメソッド出力 201805165
メソッド内出力 201805165
最速デビュー年 2020
検索年 2020
[1, 7, 13, 55.0, 福永祐一, 1:49.9, 6-4, 34.6, 2.3, 1, 450(0), 700.0, r202008040605]
検索年 2021
[3, 8, 11, 56.0, 福永祐一, 1:48.0, 7-8-8, 33.4, 4.9, 2, 448(-2), 956.1, r202105010611]
[1, 6, 6, 56.0, 川田将雅, 1:43.9, 4-4, 34.1, 2.9, 2, 448(0), 3,833.6, r202109020111]
[[[1, 7, 13, 55.0, 福永祐一, 1:49.9, 6-4, 34.6, 2.3, 1, 450(0), 700.0, r202008040605]], [[3, 8, 11, 56.0, 福永祐一, 1:48.0, 7-8-8, 33.4, 4.9, 2, 448(-2), 956.1, r202105010611]], [[1, 6, 6, 56.0, 川田将雅, 1:43.9, 4-4, 34.1, 2.9, 2, 448(0), 3,833.6, r202109020111]]]
出走数 3
デビュー戦 [[1, 7, 13, 55.0, 福永祐一, 1:49.9, 6-4, 34.6, 2.3, 1, 450(0), 700.0, r202008040605]]