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,但是涉略较广,所以一些理解还是比较浅的,欢迎指正。