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

  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值