1. 程式人生 > >android jdbc直連mysql

android jdbc直連mysql

有朋友問我怎麼做物聯網的app,我說一個方式可以直連,另一個用web伺服器來跟資料庫連線,最後他們決定直連資料庫。

第二天,朋友說遇到了各種問題,我想不對啊,我以前大二17年的時候很簡單就連上了,所以打算給做一個demo。

結果真的遇到了問題,花了4個小時查原因,最後解決了。上網找資訊結果都是一些錯誤的比如android 不能直連資料庫什麼的說法。這些我也不評價了。

這次我用的是android studio。

1.首先新建專案,helloword就行了。

2.第二步下載JDBC驅動

百度查mysql connector java一般第一個就是了

或者這個連結https://dev.mysql.com/downloads/connector/j/



下載這個就好了



問你是否登個錄,你有oracle的賬號想登就等吧,懶得登就no thanks。

下載後開啟zip


裡面的jar包就是編譯好的驅動程式了

3.匯入驅動進工程

project檢視下能看到libs 拖進去就行了


然後加入dependencies

專案檢視->專案名->右鍵->open modle setting(f4)


選擇你拖進來的jar包


4.載入驅動並使用

驅動是5.1版本,用的是JAVA JDK1.8

所以要在專案檢視->專案名->右鍵->open modle setting(f4)

設定


並且新增jackOption


本來是直接

Class.forName("com.mysql.jdbc.Driver");//載入驅動
java.sql.Connection cn= DriverManager.getConnection("jdbc:mysql://IP:埠/資料庫名","使用者","密碼");//連線
String sql="select * from a";
Statement st=(Statement)cn.createStatement();
ResultSet rs=st.executeQuery(sql);
結果怎麼也連不上

排除了防火牆,埠不對,使用者遠端許可權還是無法連線

下面的一個webview是用來測試網路連線的,那時候懷疑是網路問題。


private TextView text1;
private WebView webView;
private String ip="192.168.31.148";
private Connection connection;
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化空間
TextView text1=(TextView)findViewById(R.id.text1);
webView = (WebView)findViewById(R.id.web);//new WebView(this);
webView.loadUrl("http://"+ip);          //呼叫loadUrl方法為WebView加入連結
    //setContentView(webView);
webView.setWebViewClient(new WebViewClient(){
        @Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {

            webView.loadUrl(url);
//返回值為true的時候控制網頁在WebView中開啟,為false時呼叫系統瀏覽器呀第三方瀏覽器
return false;
}
    });
//啟用支援JavaScript
WebSettings settings=webView.getSettings();
settings.setJavaScriptEnabled(true);
//WebView載入頁面優先使用快取載入
settings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
    try {
        Class.forName("com.mysql.jdbc.Driver");
connection = DriverManager.getConnection("jdbc:mysql://192.168.31.168:3306/test?useUnicode=true&characterEncoding=gbk","test","1234");
//connection = DriverManager.getConnection("jdbc:mysql://192.168.31.168:3306;DatabaseName=test" + "?user=test&password=1234");
        //connection = DriverManager.getConnection("jdbc:mysql://192.168.31.168:3306/test?user=test&password=1234");
if (connection!=null) {
            try {
                String sql = "select * from user";        //查詢表名為“user”的所有內容
Statement stmt = connection.createStatement();        //建立Statement
ResultSet rs = stmt.executeQuery(sql);          //ResultSet類似Cursor
                //<code>ResultSet</code>最初指向第一行
Bundle bundle = new Bundle();
                while (rs.next()) {
                    bundle.clear();
text1.setText(rs.getString("username"));
}

                rs.close();
stmt.close();
} catch (SQLException e) {

            } finally {
                if (connection != null)
                    try {
                        connection.close();
} catch (SQLException e) {
                    }
            }
        }
    } catch (ClassNotFoundException e1) {
        text1.setText("驅動初始化失敗"+e1);
} catch (SQLException e1) {
        text1.setText("資料庫連結失敗"+e1);
}
}

網路訪問正常,但是JDBC連線不成功,差點我就懷疑官方BUG了,查官方的JDBC驅動包

最後 發現要使用多執行緒才能連線上,好像是從某個API版本後直連就不支援了,需要用子執行緒進行連線

code:

private TextView text1;//即hello word那行的
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
text1=(TextView)findViewById(R.id.test1);//獲取控制元件
    new Thread(new Runnable() {//新建執行緒
        @Override
public void run() {
            try {
                Log.v("tag","run");//除錯資訊
Class.forName("com.mysql.jdbc.Driver");//載入驅動
java.sql.Connection cn= DriverManager.getConnection("jdbc:mysql://192.168.31.168:3306/test","test","1234");//連線
String sql="select * from a";//準備語句
Statement st=(Statement)cn.createStatement();
ResultSet rs=st.executeQuery(sql);//執行
                while(rs.next()){//遍歷結果
                    final String mybook=rs.getString("name");//查詢欄位
Log.v("tag",mybook+"");//除錯資訊
text1.post(new Runnable() {//子執行緒post方法更新UI,否則會FALUT丟擲
                        @Override public void run() {
                            text1.setText(""+mybook);//更新textview
}
                    });
Log.i("Mainactivity",mybook);
}
                cn.close();//記得關閉 不然記憶體洩漏
st.close();
rs.close();
Log.v("tag","end");
} catch (ClassNotFoundException e) {
                e.printStackTrace();
text1.setText("驅動初始化失敗"+e);
} catch (SQLException e) {
                e.printStackTrace();
text1.setText("資料庫連結失敗"+e);
}
        }
    }).start();//執行執行緒

表裡的資料就一個1,用來測試的

完成了,網上很多直連文章都過時了,或者是錯誤的,也可能是工具原因。

因為本人目前並不寫android和java,但是涉略較廣,所以一些理解還是比較淺的,歡迎指正。