1. 程式人生 > >Android採用jdbc直連MySQL,實現虛擬機器和手機訪問資料庫

Android採用jdbc直連MySQL,實現虛擬機器和手機訪問資料庫

本文將介紹在Android平臺下如何利用jdbc方式連線電腦伺服器的MySQL。

值得注意的是:由於資料庫賬號和密碼均寫入Android程式碼中,通過反編譯很有可能獲得你的賬號密碼。所以採用jdbc方式安全性不高,不建議使用這種方式!

下面通過例項來詳細說明。前提是安裝好MySQL和eclipse並配置好環境。

通過cmd命令列開啟MySQL:



再通過Navicat for MySQL管理軟體新建一個名為test的資料庫,右鍵匯入db.sql檔案,這個sql檔案生成的就是這次示例要用到的資料庫。最後可以看到如下的介面。


經過實踐發現,Java工程能夠輕鬆實現通過匯入直連jar包訪問MySQL,但Android工程則沒有那麼容易。可以先寫一個簡單的Java工程來測試你的MySQL是否能夠被正常訪問。

       程式碼如下:

package testmysql;

/**

 *

 */

import java.sql.*;

public class testmysql {

 public static void main(String args[]) {

   try {

     Class.forName("com.mysql.jdbc.Driver");     //載入MYSQL JDBC驅動程式   

     //Class.forName("org.gjt.mm.mysql.Driver");

     System.out.println("Success loadingMysql Driver!");

    }

   catch (Exception e) {

     System.out.print("Error loading Mysql Driver!");

     e.printStackTrace();

    }

   try {

     //Connection connect = DriverManager.getConnection(

      //   "jdbc:mysql://localhost:3306/test","root"," yourpassword");

           Connection connect=DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8","root","yourpassword");

     //連線URL為  jdbc:mysql//伺服器地址/資料庫名  ,後面的2個引數分別是你資料庫的登入使用者名稱和密碼

 //test為你之前建的資料庫的名字,root替換成你的資料庫的登入使用者名稱(預設是root),yourpassword換成你的密碼

     System.out.println("Success connect Mysql server!");

     Statement stmt = connect.createStatement();

     ResultSet rs = stmt.executeQuery("select * from student");

     while (rs.next()) {

       System.out.println(rs.getString("S_Name"));

     }

    }

   catch (Exception e) {

     System.out.print("get data error!");

     e.printStackTrace();

    }

  }

}

具體的工程關係如下:


成功後會有如下的顯示:


值得一提的是這個直連jar包的匯入方式,在Java工程和Android工程中要求不同,從上面的工程關係圖其實可以看出Java工程實質上只是引用了這個jar包的路徑,這種匯入方式是通過BuildPath匯入的,這種方式在Android工程中不可行!!



另外還有一點需要說明,就是程式碼中"jdbc:mysql://localhost:3306/test","root","yourpassword ");中的localhost,在Java工程中可以這麼寫,但是在Android工程就需要替換成你計算機的IP地址或者Android預設電腦主機IP10.0.2.2了,這是因為虛擬機器或真機會將自身認為是localhost,也就不會去訪問電腦的資料庫。而Java工程則不會出現這個問題。


接下來用一個Android工程加以示範(源工程來自CSDN博主xxzqyall)。

程式碼如下:

package com.hl;

import java.sql.DriverManager;

import java.sql.ResultSet;

import com.mysql.jdbc.Connection;

import com.mysql.jdbc.Statement;

import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.TextView;

public class AndroidMsql extends Activity {

    @Override

    public voidonCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);

       setContentView(R.layout.main);

        Button btn=(Button)findViewById(R.id.btn);

       btn.setOnClickListener(new OnClickListener() {

               @Override

               publicvoid onClick(View v) {

                       sqlCon();                          

               }

        });   

    }

    private voidmSetText(String str){

     TextViewtxt=(TextView)findViewById(R.id.txt);

     txt.setText(str);

    }

    private voidsqlCon(){

    try {

        Class.forName("com.mysql.jdbc.Driver");  

        } catch(Exception e) {

               e.printStackTrace();

        }

        try {

               //jdbc:mysql://Android預設電腦主機IP 10.0.2.2或者你電腦的IP

           String url="jdbc:mysql://10.0.2.2:3306/test?user=root&password=yourpassword&useUnicode=true&characterEncoding=UTF-8";//連結資料庫語句

           Connection conn= (Connection) DriverManager.getConnection(url); //連結資料庫

           Statement stmt=(Statement)conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);

           String sql="select * from manager";//查詢manager表語句

           ResultSet rs=stmt.executeQuery(sql);//執行查詢

            StringBuilder str=newStringBuilder();

           while(rs.next()){

            str.append(rs.getString(1)+"\n");  

            }

            mSetText(str.toString());

           rs.close();   

           stmt.close();

           conn.close();     

        } catch(Exception e) {

               e.printStackTrace();

        }

}

}

此時Android工程關係如下,可以看出直連MySQL的jar包的匯入方式還是按照Java工程的匯入方式來的。


安裝到虛擬機器並執行:


點選“連結資料庫”按鈕,可以發現LogCat裡面報了一堆錯。


第一個錯誤就是找不到com.mysql.jdbc.Connection:

現在,讓我們換一種匯入jar包的方式。在Android工程下新建一個名為“libs”(不是“lib”)的資料夾,然後複製jar包貼上到該資料夾,再看一下Android工程關係,現在可以看到Android工程裡多了一個AndriodPrivate Libraries的Libraries,這麼做是因為在Android工程裡生成的是一個APP,需要有實際的jar包做支援,而原先那種匯入路徑的方式則不再可行,安裝到虛擬機器上後會因為找不到jar包而報錯!

好了,再來執行一次看看效果!


之前找不到驅動的錯誤也消失了!

最後,介紹一下真機除錯需要注意的事項!

經過測試,直接真機除錯還是會連不上電腦的MySQL。我使用的是小米手機,用小米手機助手軟體開啟了網路共享,之後就可以正常訪問MySQL了。具體原因不是很明確,感覺應該和網路資料交換方式有關。所以大家要想通過jdbc真機除錯,就先把真機連線上電腦的網路吧(照理應該WiFi也可行,不過USB也得連上,未經親測)!

真機測試成功!


附上資源下載連結: 資料庫  http://download.csdn.net/detail/tracelessle/8740515 安卓直連MySQL工程原始碼 AndroidMsql.zip  http://download.csdn.net/detail/tracelessle/8740527