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,但是涉略較廣,所以一些理解還是比較淺的,歡迎指正。