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)。
程式碼如下:此時Android工程關係如下,可以看出直連MySQL的jar包的匯入方式還是按照Java工程的匯入方式來的。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();
}
}
}
安裝到虛擬機器並執行:
點選“連結資料庫”按鈕,可以發現LogCat裡面報了一堆錯。
第一個錯誤就是找不到com.mysql.jdbc.Connection:
現在,讓我們換一種匯入jar包的方式。在Android工程下新建一個名為“libs”(不是“lib”)的資料夾,然後複製jar包貼上到該資料夾,再看一下Android工程關係,現在可以看到Android工程裡多了一個AndriodPrivate Libraries的Libraries,這麼做是因為在Android工程裡生成的是一個APP,需要有實際的jar包做支援,而原先那種匯入路徑的方式則不再可行,安裝到虛擬機器上後會因為找不到jar包而報錯!
好了,再來執行一次看看效果!
之前找不到驅動的錯誤也消失了!
最後,介紹一下真機除錯需要注意的事項!
經過測試,直接真機除錯還是會連不上電腦的MySQL。我使用的是小米手機,用小米手機助手軟體開啟了網路共享,之後就可以正常訪問MySQL了。具體原因不是很明確,感覺應該和網路資料交換方式有關。所以大家要想通過jdbc真機除錯,就先把真機連線上電腦的網路吧(照理應該WiFi也可行,不過USB也得連上,未經親測)!
真機測試成功!