スマフォアプリ(java/kotlin/Swift/Unity)からサーバ(java)のmariadbを操作する.2
●前提
同時接続は多数
サーバ言語:java+mariaDB+JDBCドライバ
MySQLのrootユーザー名root,passwordは1234abcde
クライアント言語:android-java/android-kotlin/iOS-Swift/unityC#
通信ポート:3456
では、mariaDBからデータを引き出してみましょう。
しかし、データがまだ無いのでデータがありませんと表示されます。
[ScoerServe.java]
import java.sql.*;
public class ScoreServer {
static Connection con = null;
final static String MySQL_URL = "jdbc:mysql://localhost:3306/test906"; // 接続するMySQLのURL(ローカルホスト:madiadb/MySQLは3306番ポート)
final static String MySQL_USR = "root"; // MySQLのユーザー名
final static String MySQL_PASS = "1234abcde"; // MySQLのユーザーのパスワード
//
// MySQL(mariaDB)に接続
//
public static boolean SQLOpen() {
try {
// mariaDBへ接続するためにJDBCドライバ読み込む
Class.forName("org.mariadb.jdbc.Driver").newInstance();
// 接続する
con = DriverManager.getConnection(MySQL_URL, MySQL_USR,MySQL_PASS);
System.out.println("MySQL(mariaDB)に接続できました");
return true;
} catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
System.out.println("JDBCドライバのロードに失敗しました");
} catch (SQLException e) {
System.out.println("MySQL(mariaDB)に接続できませんでした");
if (con != null) {
try {
con.close();
con=null;
} catch (SQLException ex) {
System.out.println("MySQL(mariaDB)のCloseに失敗しました");
}
}
}
return false;
}
//
// スコア順に表示する
//
public static void GetScoreRank() {
try {
//
// データを取得するには Statement を作成して executeQuery() でSQL文を投げると ResultSet の object で返ってくる
//
Statement stm = con.createStatement();
String sql = "SELECT * FROM hiscore ORDER BY score DESC";
ResultSet rs = stm.executeQuery(sql);
// rs.next()はこのカラムがあるかだけでは無く、次のカラムに移動させるので、このような方法をとっています。
boolean f=false;
while(rs.next()){
f=true;
int id = rs.getInt("id");
String name = rs.getString("name");
int score = rs.getInt("score");
System.out.println("id" + id + ":name=" + name + ":score=" + score);
}
if(f==false){
System.out.println("データがありません");
}
return;
} catch (SQLException e) {
System.out.println("MySQL(mariaDB)に接続できませんでした2");
}
}
//
// メイン
//
public static void main(String[] args) {
// データベースへ接続する
if(!SQLOpen()){
System.out.println("データベースに接続できませんでした");
return;
}
GetScoreRank();
}
}
java側でとりあえず一人分登録することにしました。コードはそう変わっていません。
import java.sql.*;
public class ScoreServer {
static Connection con = null;
final static String MySQL_URL = "jdbc:mysql://localhost:3306/test906"; // 接続するMySQLのURL(ローカルホスト:madiadb/MySQLは3306番ポート)
final static String MySQL_USR = "root"; // MySQLのユーザー名
final static String MySQL_PASS = "1234abcde"; // MySQLのユーザーのパスワード
//
// MySQL(mariaDB)に接続
//
private static boolean openSQL() {
try {
// mariaDBへ接続するためにJDBCドライバ読み込む
Class.forName("org.mariadb.jdbc.Driver").newInstance();
// 接続する
con = DriverManager.getConnection(MySQL_URL, MySQL_USR,MySQL_PASS);
System.out.println("MySQL(mariaDB)に接続できました");
return true;
} catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
System.out.println("JDBCドライバのロードに失敗しました");
} catch (SQLException e) {
System.out.println("MySQL(mariaDB)に接続できませんでした");
if (con != null) {
try {
con.close();
con=null;
} catch (SQLException ex) {
System.out.println("MySQL(mariaDB)のCloseに失敗しました");
}
}
}
return false;
}
//
// 値を返さないsqlクエリを実行
//
private static boolean execUpdate(String sql) {
try {
Statement stm = con.createStatement();
stm.executeUpdate(sql);
stm.close(); // close
return true;
} catch (SQLException e) {
return false;
}
}
//
// スコア順に表示する
//
public static void getScoreRank() {
try {
//
// データを取得するには Statement を作成して executeQuery() でSQL文を投げると ResultSet の object で返ってくる
//
Statement stm = con.createStatement();
ResultSet rs = stm.executeQuery("SELECT * FROM hiscore ORDER BY score DESC");
// rs.next()はこのカラムがあるかだけでは無く、次のカラムに移動させるので、このような方法をとっています。
boolean f=false;
while(rs.next()){
f=true;
int id = rs.getInt("id");
String name = rs.getString("name");
int score = rs.getInt("score");
System.out.println("id" + id + ":name=" + name + ":score=" + score);
}
if(f==false){
System.out.println("データがありませんので一人分追加します");
initScore();
}
rs.close(); // close
stm.close(); // close
return;
} catch (SQLException e) {
System.out.println("MySQL(mariaDB)に接続できませんでした3");
}
}
//
// だれもデータベースに登録されていない場合、とりあえず一人分追加します、
//
private static void initScore() {
if(!execUpdate("INSERT INTO hiscore (name,score) VALUES('けんぢ',1)")){
System.out.println("追加出来ませんでした");
}
}
//
// メイン
//
public static void main(String[] args) {
// データベースへ接続する
if(!openSQL()){
System.out.println("データベースに接続できませんでした");
return;
}
getScoreRank();
}
}
次はクライアントサーバでソケット通信をしてハイスコアの表示をしてみます(両言語java)
戻る