MySQL Connector/JをAndroidから使ってみる

本チュートリアルの内容

■ 開発環境の確認

前提とする環境

このチュートリアルでは、以下の環境を想定します。Androidの開発環境としては、Android Studioを想定しますが、Android Studioの設定は済んでいるものとして説明を進めます。

開発の準備

開発に使用するMySQLはMySQLのページからダウンロードして、インストールする必要があります。以下のチュートリアルを参考にして、MySQLを設定しましょう。

DBは上のチュートリアルで作成したものを利用します。また、MySQL Connector/JもMySQLのホームページからダウンロードしておきます。

MySQL Connector/Jのダウンロード
図 MySQL Connector/Jのダウンロード

mysql-connector-java-(version).zipがダウンロードされたら、zipを解凍して、出てきたフォルダをわかりやすいところに保存しておきます。(※mysql-connector-javaのバージョンですが、JDKのバージョンとの整合性があるようですので、最新のものを使用すると動かないことがあるかもしれません。その場合には、少し前の安定したバージョンを使用してみ下さい)

実際に使用するのは、このフォルダ内のmysql-connector-java-(version)-bin.jarです。

ページの先頭へ

■ Android端末からDB接続する

では、さっそく、Android Studioを立ち上げて、新しいプロジェクトを作成します。ここではEmpty Activityを利用します。

プロジェクトの作成
図 Androidプロジェクトの作成

ここでは、DBConnectというプロジェクトを作成しました。

プロジェクトの設定
図 プロジェクトの設定

作成されたプロジェクトから、activity_main.xmlを選択し、デザインビューで表示してみます。

デザインビュー
図 初期デザインビュー

中央にTextViewが配置されている画面が表示されていると思います。今回は、DBの検索結果を表示するだけなので、この初期画面を利用します。

ここで、画面に表示されているTextViewに名前をつけておきます。レイアウトをグラフィカルレイアウトから、テキストエディタで開いたものに変えてください。画面右上の「Code」と書かれたアイコンを選択することで画面が切り替わります。デフォルトで記述されているTextViewにIDの記述を追加しておきます。また、初期の文字は「Result here!」と変更しておきます。TextViewのタグの中身は以下のようになります。

        <TextView
        android:id="@+id/textview1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Result here!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
          

これで、textview1を指定することで、このTextViewを参照することができます。レイアウトは特に変更しませんので、タブは閉じてしまってかまいません。

次に、srcフォルダの中の、MainActivity.javaを開きます。まず、使用するライブラリを追加しておきます。importのところに以下のものを追加しておきましょう。

    import java.sql.Connection;
    import java.sql.ResultSet;
    import java.sql.Statement;
    import java.sql.DriverManager;
    import android.widget.TextView;
    import android.os.AsyncTask;
          

アプリケーションですが、動きとしては、単純にアプリケーションを起動したら、そのまま、DBにアクセスして、結果を画面に表示するというだけのものとします。ただし、単純にUIを制御するスレッドでDB接続や、SQL文を送るればよいのではなく、接続は、非同期でおこなう必要があります。

そこで、処理としては、UIのスレッドで、非同期クラスのインスタンスを作成し、それを実行することでDB接続をするという流れになります。

では まず、メインのクラスとは別に、非同期のクラスを作成してみます。ここでは、TaskDbConnectというクラスを作成します。AsyncTaskクラスを継承するこのクラスは、3つのパラメータの方の型を指定する必要があります。

    class TaskDbConnect extends AsyncTask<Void, Void, String>{
    // この中をこれから記述
    }
          

最初が、読み出し元でメソッドが実行される時に渡される引数の型、2つ目は進捗を表現する時に使用する型、3つ目はスレッド終了時に返す値の型 です。ここでは、起動時の引数は渡さないのでVoid、進捗も表示しないのでVoidとし、SQLのSelect文の結果を引き渡すために3つ目だけをStringとしました。

では、実際にクラスの中身を書いていきます。まずは、呼び出し側のMainActivityをそのままインスタンス生成時の引数としてしまうこととしました (この方法が適しているかは不明です)。

クラス側でMainActivityのインスタンスを定義し、コンストラクタにおいて引数として渡されてきたアクティビティを代入します。

    MainActivity activity;
    
    public TaskDbConnect(MainActivity activity){
        this.activity = activity;
    }
          

次に、実際の処理を記述します。AsyncTaskでは、doInBackgroundメソッドを実装する必要があり、今回はそのメソッドにDBアクセスのコードを記述します。記述の内容は、通常のConnctor/Jの記述とほとんど同じです。取り出す値のところは、ID、場所ID、タグID、 時間となります。テーブルの2番目、3番目、5番目、4番目の順に文字列型の変数に追記します。この結果をスレッド終了時のメソッド(onPostExecute)にreturnとして渡します。

DBのURL、ユーザー名、パスワードは皆さんの環境に合わせて設定してください。

    @Override
    protected String doInBackground(Void... params) {
        String text1="";
        
        try{
            Class.forName("com.mysql.jdbc.Driver");
            Connection conn= DriverManager.getConnection("jdbc:mysql://192.168.0.2:3306/picklog_db?autoReconnect=true&useSSL=false","user名","パスワード");
            Statement stmt=conn.createStatement();
            ResultSet rs=stmt.executeQuery("Select * from log_tbl");
            
            while(rs.next()){
                int id=rs.getInt(1);
                int location=rs.getInt(2);
                String tid=rs.getString(3);
                String time=rs.getString(4);
                text1+=id+" "+location+" "+tid+" "+time+" "+"\r\n";
            }

        }catch(Exception e){
            text1=e.getMessage();
        }
        
        return text1;
    }
          

次に、終了時に呼ばれるメソッドです。

    protected void onPostExecute(String result){
        super.onPostExecute(result);
        TextView tv = (TextView)activity.findViewById(R.id.textview1);
        tv.setText(result);
    }
          

ここで、tvというインスタンスを定義していますが、R.id.textview1が、先ほどレイアウトで指定したTextViewです。

以上で、TaskDbConnectクラスの作成は終わりです。

次に、メインのクラスの修正をします。

こちらは、Asyncクラスのインスタンスを作成し、メソッドを呼ぶだけの単純な追加となります。

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        // Asyncタスククラスのインスタンスを作成し、実行する
        TaskDbConnect task = new TaskDbConnect(this);
        task.execute();
    }
          

コードの作成については以上の終わりです。このアプリケーションは通信をおこないますので、Manifestファイルの書き 換えを忘れずにしておきましょう。具体的には以下をManifestファイルに追加します。

        <uses-permission android:name="android.permission.INTERNET" />

コードの記述は以上です。次に、MySQLConnector/Jをこのアプリケーションで利用できるようにします。

ページの先頭へ

■ Android StudioでのJarの読み込み

次に、mysql-connector-java-(version)-bin.jarファイルの読み込み方について説明します。

まず、jarファイルをAndroidStudioの開発中のプロジェクトのlibsフォルダにコピーします。


図 Jarファイルのコピー

次に、AndroidStudioでjarファイルのモジュール登録の仕方を説明します。ナビゲーションから「Project」ビューを選択して、先ほど、libsフォルダに保存した、jarファイルを見つけます。


図 Jarファイルの選択

続いて、jarファイルを右クリックして、メニューから「Add As Library」を選びます。


図 Add As Libraryの選択

すると、ライブラリをどこに追加するかを確認する画面が開きますので、そのまま現在使用しているプロジェクトが表示されている状態で、OKを押下します。


図 ライブラリの追加

以上でモジュールは登録されます。登録されたことを確認するためには、appフォルダのbuild.gradleを開いて、dependenciesをみます。すると、先ほど追加したjarファイルが追加されていることが確認できると思います。


図 Jarファイルの記述の確認

これでjarファイルの読み込みは終了しましたので、プロジェクトを実行します。

DBと接続がうまくいくと、以下のような画面が表示されます。


図 実行結果


ページの先頭へ