質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

JDBC

JDBC(Java DataBase Connectivity)は、Javaとリーレーショナルデータベースに接続させる基本的なAPIです。Java上でSQLステートメントを発行することで、データベースの種類に影響を受ないDB操作を可能とします。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

4回答

6144閲覧

MySQLのレコード数を配列String[]の要素数にして他クラスから参照したい

fufun

総合スコア10

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

JDBC

JDBC(Java DataBase Connectivity)は、Javaとリーレーショナルデータベースに接続させる基本的なAPIです。Java上でSQLステートメントを発行することで、データベースの種類に影響を受ないDB操作を可能とします。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2016/11/10 09:53

MySQLのレコード数を配列String[]の要素数にして、他クラスから参照したいと考えています。
具体的には、
「SELECT count(*) FROM table");」の結果nを、
String[] a = new String[n]として、中身にデータを与え、それを他クラスから参照したいと考えています。

###該当のソースコード

tst.java

1public class tst { 2 public static void main(String args[]) throws SQLException, ClassNotFoundException { 3 tst2.MainMethod(); 4 for (int i = 0; i < tst2.a.length; i++) { 5 tst2.a[i] = Integer.toString(i); 6 System.out.println(tst2.a[i]); 7 } 8 } 9 10}

tst2.java

1public class tst2 { 2 public static int n; 3 public static String[] a = new String[n]; 4 5 public static void MainMethod() throws SQLException, ClassNotFoundException { 6 String url = "jdbc:mysql://localhost/data1"; 7 String user = "user"; 8 String password = "pass"; 9 Class.forName("com.mysql.jdbc.Driver"); 10 Connection conn = DriverManager.getConnection(url, user, password); 11 Statement stmt = conn.createStatement(); 12 13 count(stmt); 14 String[] a = new String[n]; //冗長な宣言 15 16 stmt.close(); 17 conn.close(); 18 } 19 20 public static void count(Statement stmt) throws SQLException { 21 ResultSet rset2 = stmt.executeQuery("SELECT count(*) FROM table"); 22 rset2.next(); 23 n = Integer.parseInt(rset2.getString(1)); 24 rset2.close(); 25 } 26 27}

tst2.javaでは、
・レコード数nを代入するint n;
・n個分の要素数を持つ配列String[] a;
が宣言されています。
グローバル変数となっていますので、プログラムを実行した時にはnの中身は0が代入されており、結果的にString[] aの要素数も0となるので配列として機能しません。
そこでtst2.javaでは、レコード数をjdbcドライバで取得した後にも宣言しています。

String[] a = new String[n]; //冗長な宣言

明らかに二度手間な変数宣言ですが、グローバル変数のString[] a の行を無くし、こちらで宣言すると、tst2.javaではString a[レコード数]として扱うことが出来るのですが、tst.javaから参照することが出来ません(グローバル変数で無いため)。

上記プログラム(tst.java)ではtst2.a[i]の値にString型のiを代入していますが、MySQLからロードした文字列を代入したいと考えています。

###まとめ

  • tst.javaで、tst2.javaの配列a[n]に代入、または参照したい。

  • そのためには配列aはグローバル変数である必要がある。

  • グローバル変数で宣言すると、レコード数nの値が0になってしまい、必要な要素数が確保できない

となります。
拙文となりますが、よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

明らかに二度手間な変数宣言

「二度手間」ではなく「間違っている」というべきですね。メソッドの中での宣言とnewによる初期化は削除すべきです。

  1. nが決まるところでa = new String[n]とすればよいです。

aをstatic変数にしてますが、nがわからない状況でnewしようとしているから問題なのです。
nの値がわかった時点(countメソッドの中など)でnewすればいいのですよ?
2. tst2クラスのstaticフィールドnは不要です。aに配列を代入した後でa.lengthとすれば何個配列要素があるかはわかるからです。冗長な情報はプログラムの明快さを損なうことがあるので明確な目的がない限り省く方がよいと思います。

投稿2016/11/10 10:13

KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fufun

2016/11/10 23:14

コメントありがとうございます。おかげ様で解決しました。 > nがわからない状況でnewしようとしているから問題なのです。 知りたい事がこの一文にありました。非常に分かりやすかったです。 > aに配列を代入した後でa.lengthとすれば何個配列要素があるかはわかるからです。 目から鱗でした。ありがとうございます。
guest

0

全データをString[][]に入れる例です
あくまでも全データがString型だったらの場合に限ります

java

1String sql="SELECT * FROM table"; 2 ResultSet rs=stmt.executeQuery(sql); 3 ArrayList<String[]> wee=new ArrayList<>(); 4 while (rs.next()) { 5 ArrayList<String> we=new ArrayList<>(); 6 int count=0; 7 8 while(true){ 9 count++; 10 String r=new String(); 11 try{ 12 r=rs.getString(count);} 13 catch(Exception e){ 14 break; 15 } 16 we.add(r); 17 18 19 } 20 String[] r2=we.toArray(new String[0]); 21 wee.add(r2); 22 23 } 24 String[][] r3=wee.toArray(new String[0][0]); 25 26 for(String[] r4:r3){ 27 for(String r5:r4){ 28 System.out.print(r5+" "); 29 } 30 System.out.println(); 31 32 } 33

投稿2016/11/10 14:35

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KiyoshiMotoki

2016/11/10 15:13

変数 r を宣言する際に毎回、new String() を代入している理由は何ですか? また、 > あくまでも全データがString型だったらの場合 とのことですが、そうでない場合は何が起きるのか教えていただけますか?
退会済みユーザー

退会済みユーザー

2016/11/10 15:41

>変数 r を宣言する際に毎回、new String() を代入している理由 データベースの表の中に空白がある場合空オブジェクトをaddして空白である事を示すデータをArrayListに入れておくためです これがないと空白がある時上下に対して表示がずれ、いくつ目のデータかも分からなくなります >そうでない場合は何が起きるのか r=rs.getString(count);の部分で何らかのエラーが出ると思います データ一行に複数の型の変数が入っている場合は r=rs.getObject(count);とするべきですが その場合String[]を作ってデータを格納することができそうにありません
KiyoshiMotoki

2016/11/10 16:27 編集

返信ありがとうございます。 > データベースの表の中に空白がある場合空オブジェクトをadd 「空白」とは NULL のことでしょうか? 何にせよ、変数 we に「空オブジェクト」が add されることはあり得ません。  r=rs.getString(count); が実行された時点で変数 r にはDBから取得した値が代入される上に、 この行で例外が発生した場合は直ちに break しているためです。 それ以前に、ループの中でString型の引数無しのコンストラクタを実行するのは、メモリのムダ遣いです。 毎回、新しいインスタンスを生成してしまうからです。 http://docs.oracle.com/javase/jp/7/api/java/lang/String.html#String() > String は不変なので、このコンストラクタを使う必要はありません。 単に String r = "" で、十分です。 (もし、実行する必要があれば、の話ですが) また、 > r=rs.getString(count);の部分で何らかのエラーが出ると思います について、少なくとも MySQL では、テーブルのデータ型が何であっても getString() の実行で例外が発生することはなく(※)、 正常に各カラム型の文字列表現を取得することができます。 ResultSet インターフェースのAPIリファレンスでも > 指定された列の値を、Java プログラミング言語の String 【として】取り出します。 とあるので、おそらくこの動作はどのDBでも同様と考えられます。 http://docs.oracle.com/javase/jp/7/api/java/sql/ResultSet.html#getString(int) ※ int, datetime, timestamp, decimal, float, binary, varbinary, blob で確認
退会済みユーザー

退会済みユーザー

2016/11/10 18:59

そうですか それではString r = ""でよく、getString()に全てのデータが入れられるのかも知れませんね
guest

0

直接関係ないかもしれませんがとりあえず別名をつけることをお勧めします

SQL

1SELECT count(*) as count FROM table

投稿2016/11/10 12:11

yambejp

総合スコア114839

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

SELECT count(*) FROM table

の結果は常に1行なので、String[] で受ける必要はないでしょう。

投稿2016/11/10 11:37

A-pZ

総合スコア12011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問