JDBC为java程序访问各种类型的关系型数据库提供了统一的接口,用户不必针对不同数据库写出不同的代码,但是使用JDBC必须得下载相应的驱动,比如我这里是要连接mysql,于是就到mysql官网去下载x相应驱动 https://dev.mysql.com/downloads/connector/j/

这里我下载解压得到 mysql-connector-java-5.1.43-bin.jar

在Eclipse中新建java项目只需要Build Path --> Add External Archives把该jar包的路径添加进来就可以使用。在Android Studio中更是只需要复制粘贴到项目目录的app\libs下即可,IDE会自动加载。——看似如此。

本地Android Studio的配置

我的Android Studio版本是Community Edition2016.2.5,系统是win7 64位。在添加该jar文件后,build出错。

按照提示,需要在项目最外层的build.gradle文件中的allprojects { ... }区域(具体见代码下的图片,之后就不附图了)内添加下列代码

    tasks.withType(JavaCompile) {sourceCompatibility = '1.7'targetCompatibility = '1.7'}

这还没完,此时会提示Error: Unable to find a JDK,起初我怀疑jdk没添加进环境变量,但是cmd窗口测试无误,而且Android Studio新建项目也能编译运行。那么,还是jar包的问题。查了很久后找到了解决方案,看起来是java8的不兼容所致,所以需要全面改为Java7来编译

Android Studio2.1.2 Java8环境下引用Java Library编译出错

1、在所有module的build.gradle文件中的android { ... }区域中添加

    compileOptions {sourceCompatibility JavaVersion.VERSION_1_7targetCompatibility JavaVersion.VERSION_1_7}

就我这个新建的项目,没有添加module,所以需要修改的文件就只有app\build.gradle

2、在主module的build.gradle文件(也就是app\build.gradle)的android { defaultConfig { ... } }区域中添加

jackOptions {enabled true}

此时编译成功了,但是注意,这才是第一步,仅仅只是成功引用了java库。Android Studio默认是不允许访问Internet的。

因此需要在app/src/main/AndroidManifest.xml中的<manifest>...</manifest>区域内添加一行

<uses-permission android:name="android.permission.INTERNET"/>

远程mysql的配置

然后我的mysql是安装在Linux虚拟机(Ubuntu 16.04)上的,默认mysql是禁止远程连接的,所以在Linux上也要进行配置

首先是要让mysql支持中文字符,登陆mysql用户后,输入命令STATUS;可以看到几个字符集是这样的

Server characterset:    latin1
Db     characterset:    latin1
Client characterset:    utf8
Conn.  characterset:    utf8

因此需要用超级用户权限修改/etc/mysql/my.cnf,添加下列代码(这里顺便绑定了端口为3306,虽然一般默认端口也是3306)

[client]
default-character-set=utf8[mysqld]
default-storage-engine=INNODB
character-set-server=utf8
collation-server=utf8_general_ciport=3306

然后重启mysql,命令如下

$ /etc/init.d/mysql stop
$ /etc/init.d/mysql start

之后再登陆mysql后使用STATUS命令就可以看到字符集全部变成了utf8。

然后mysql默认绑定的IP是127.0.0.1,端口3306,在shell下可以通过shell命令netstat -apn | grep 3306查看端口占用情况,若端口3306对应的第三项(Local Address)是127.0.0.1:3306,那么mysql绑定的就是本地地址,不能远程连接。

还是用超级用户权限修改/etc/mysql/my.cnf,添加下列代码并重启mysql

bind-address=0.0.0.0

重启后再用netstat -apn | grep 3306查看第三项就会变成0.0.0.0:3306,那么mysql就支持了远程连接。

还没完,虽然mysql赋予了远程连接的权限,但是mysql用户并没有。我这里的mysql用户名是team,密码是java123,用root登陆mysql后输入下列命令

mysql> grant all on *.* to team@'%' identified by 'java123' with grant option;
mysql> flush privileges;

team@'%'代表用户team支持远程连接,team@'localhost'则代表用户team支持本地连接

代码实现

好了,终于可以写代码了,于是迫不可待地在MainAcitivity.java的onCreate()方法内部添加下列代码(先尝试连接)

        // 1.加载JDBC驱动try {Class.forName("com.mysql.jdbc.Driver");Log.v(TAG, "加载JDBC驱动成功");} catch (ClassNotFoundException e) {Log.e(TAG, "加载JDBC驱动失败");return;}// 2.设置好IP/端口/数据库名/用户名/密码等必要的连接信息String ip = "192.168.183.134";int port = 3306;String dbName = "XYZ";String url = "jdbc:mysql://" + ip + ":" + port+ "/" + dbName; // 构建连接mysql的字符串String user = "team";String password = "java123";// 3.连接JDBCtry {Connection conn = DriverManager.getConnection(url, user, password);conn.close();} catch (SQLException e) {Log.e(TAG, "远程连接失败!");return;}

这里使用了andorid.util.Log而不是System.out.println来打印消息,因为可以设置过滤符,通过TAG、日志级别等信息来筛选出特定的日志

这里我就是通过TAG来筛选,也可以通过Message和Package来筛选,并且支持正则表达式,程序运行时会有大量日志混杂在一起,所以使用Log而不是System.out来打印消息更好。

于是,通过日志过滤符筛选,可以发现连接失败了。

这个问题折磨了我一天多,参考了很多网上的代码,和我的基本无异,而且也copy过来测试过都不行,最后在stackoverflow上找到了解答

https://stackoverflow.com/questions/12233145/connecting-to-mysql-from-android-with-jdbchttps://stackoverflow.com/questions/12233145/connecting-to-mysql-from-android-with-jdbc

mysql的连接必须在异步任务类中,也就是说必须新建线程来连接mysql,而不能在主线程中执行代码。

        final Thread thread = new Thread(new Runnable() {@Overridepublic void run() {// 反复尝试连接,直到连接成功后退出循环while (!Thread.interrupted()) {try {Thread.sleep(100);  // 每隔0.1秒尝试连接} catch (InterruptedException e) {Log.e(TAG, e.toString());}// 2.设置好IP/端口/数据库名/用户名/密码等必要的连接信息String ip = "192.168.183.134";int port = 3306;String dbName = "XYZ";String url = "jdbc:mysql://" + ip + ":" + port+ "/" + dbName; // 构建连接mysql的字符串String user = "team";String password = "java123";// 3.连接JDBCtry {Connection conn = DriverManager.getConnection(url, user, password);Log.i(TAG, "远程连接成功!");conn.close();return;} catch (SQLException e) {Log.e(TAG, "远程连接失败!");}}}});thread.start();

成功了,总算可以继续下一步,向远程连接的mysql发送命令了,将上述代码稍作修改

                    // 3.连接JDBCConnection conn = null;try {conn = DriverManager.getConnection(url, user, password);Log.i(TAG, "远程连接成功!");} catch (SQLException e) {Log.e(TAG, "远程连接失败!");}if (conn != null) {String sql = "SELECT * FROM pokemon";try {// 创建用来执行sql语句的对象java.sql.Statement statement = conn.createStatement();// 执行sql查询语句并获取查询信息ResultSet rSet = statement.executeQuery(sql);// 迭代打印出查询信息Log.i(TAG, "宝可梦列表");Log.i(TAG, "ID\tName\tAttr1\tAttr2");while (rSet.next()) {Log.i(TAG, rSet.getString("id") + "\t" + rSet.getString("name")+ "\t" + rSet.getString("attr1") + "\t" + rSet.getString("attr2"));}} catch (SQLException e) {Log.e(TAG, "createStatement error");}try {conn.close();} catch (SQLException e) {Log.e(TAG, "关闭连接失败");}

懒得仔细研究java格式化字符串,直接把结果打印出来了,这里只用到了执行查询语句的executeQuery,返回结果到一组迭代对象。

而execute则可以执行任何sql语句,更多API可以参考JDBC官方教程 http://docs.oracle.com/javase/tutorial/jdbc/basics/index.html

转载于:https://www.cnblogs.com/Harley-Quinn/p/7389681.html

Android Studio使用JDBC远程连接mysql的注意事项(附示例)相关推荐

  1. android studio用mysql_Android Studio使用JDBC远程连接mysql的注意事项(附示例)

    JDBC为java程序访问各种类型的关系型数据库提供了统一的接口,用户不必针对不同数据库写出不同的代码,但是使用JDBC必须得下载相应的驱动,比如我这里是要连接mysql,于是就到mysql官网去下载 ...

  2. Android Studio 使用jdbc远程连接阿里云主机web数据库(逃坑)

    Android Studio 使用jdbc远程连接阿里云主机web数据库(逃坑) Tip1:主线程不能访问网络需要再写一个线程,访问web数据库. Test 1 : 接下来开始配置一些东西: < ...

  3. ANDROID STUDIO 通过JTDS远程连接SQLSERVER

    近日客户有需求用手机查询,如果按网上报价我基本没利润,而且也不利于以后的业务.于是决定自己写一套简单的.第一个问题就是如何跟SQLSERVER连接.查了好些文章,就这个符合:Android Studi ...

  4. android jdbc 连接mysql数据库,android怎么用JDBC方法连接mysql数据库

    2016-11-21 回答 用android程序去直连mysql数据库,觉得这样做不好,出于安全等方面考虑.数据库地址,用户名密码,查询sql什么的都存在程序里,很容易被反编译等方法看到. 建议把表示 ...

  5. jdbc远程连接mysql url_jdbc连接mysql之url书写

    #autoReconnect 当数据库连接丢失时是否自动连接,取值true/false false #maxReconnects 如果autoReconnect为true,此参数为重试次数,缺省为3次 ...

  6. centos6.5 mysql 远程访问_CentOS 6.5 中安装 Mysql 5.6,并远程连接Mysql

    ι 版权声明:本文为博主原创文章,未经博主允许不得转载. 1.在安装CentOS时,若选择的是Basic Server(可支持J2EE开发),则新安装好的CentOS系统中默认是已经安装了一个mysq ...

  7. Android Studo 真机调试连接 Mysql数据库

    Android Studo 真机调试连接 Mysql数据库失败了,无法访问数据库. 报错如下: 尝试过的手段 1.关闭防火墙   (没必要) 2.连接电脑的热点网络 (必要) 3.修改mysql数据库 ...

  8. 【Android教程】Android Studio找不到连接的手机完全解决办法

    Android Studio找不到连接的手机完全解决办法 1.问题背景 现在Android大多都用谷歌的Android Studio来开发 但是 一开始使用Android Studio都不会那么顺利 ...

  9. 远程连接 Mysql 失败的解决方法

    2019独角兽企业重金招聘Python工程师标准>>> 今天在虚拟机Ubuntu上折腾了一晚上mysql,然后试着用java连接,搞了很久都没成功,但是同学配好的Debian上却连接 ...

最新文章

  1. 有哪些高效看文献的方法?
  2. 解决kalilinux: E: 无法获得锁 /var/lib/apt/lists/lock - open (11: 资源暂时不可用) E: 无法对目录 /var/lib/apt/lists/
  3. RedHat8 配置本地yum源
  4. mysql如何按行数匹配_mysql – 是否可以使用MATCH AGAINST计算每行匹配的单词数
  5. Android自定义控件之轮播图控件
  6. Android序列化的存储和读取
  7. git 工具_Github开源工具分享之自托管GIT服务工具Gogs
  8. java向后兼容吗_Java向后不兼容历史的观察
  9. 刚毕业就要求月薪10K?我觉得没毛病
  10. .pyc文件还原.py文件_Python文件.py转换为.exe可执行程序,制作.exe文件图标
  11. xslt调用自定义函数(C#/Js/Java)
  12. SIR模型 matlab模拟
  13. IsPostBack介绍
  14. WES分析1-外显子测序
  15. 判断矩形是否在矩形中
  16. login.defs文件基础
  17. Lowest Common Ancestor
  18. php 读取docx,PHP怎么获取docx里面内容
  19. H3C路由器清空ARP表
  20. 不吹不黑,三年赶超阿里云,华为这次是认真的!

热门文章

  1. mysql 5.6 my.cnf配置文件_mysql 5.6 my.cnf 配置
  2. android skype 无法用蓝牙耳机,Skype发布更新 增加蓝牙耳机稳定性
  3. matlab08a调节字体大小,MATLAB低通滤波器的设计代码
  4. asp.net Ajax表单提交 二种方式数据处理 asp.net
  5. CentOS 7 搭建 Ceph 集群(nautilus 版本)
  6. JVM面试重点总结(二)——垃圾收集器(GC)与内存分配策略
  7. Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.12.4
  8. 【NOI OpenJudge】【1.2】编程基础之变量定义、赋值及转换
  9. 【搞事情】英文文档单词对比自动翻译
  10. 样条线怎么挤出平面_最速降线的故事