java出身,近期想做一些Android项目,就想先做个简单的crud小试牛刀,结果第一jio就踩坑了。
mysql用的8.0.27,jar包是官网Community配套下载的从Connector J 8.0.27,
安卓部署环境,工具用的AS,导入jar包正常,gradle正常
gradle添加java8依赖
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
AndroidManifest添加网络权限
<uses-permission android:name="android.permission.INTERNET"/>
接下来就是测试链接了
mysql高版本Driver目录移动至"com.mysql.cj.jdbc.Driver"
private static final String TAG = "testsql----->";
public static void mymysql(){
String url = "jdbc:mysql://192.168.0.142:3306/test" +
"?useUnicode=true" +
"&characterEncoding=utf8" +
"&useSSL=false" +
"&serverTimezone=GMT" +
"&rewriteBatchedStatements=true";
String user = "root";
String password = "123456";
try{
Class.forName("com.mysql.cj.jdbc.Driver");
}catch(Exception e){
Log.e(TAG, e.toString());
}
try {
DriverManager.getConnection(url,user, password);
Log.e(TAG, "已过");
}catch(Exception e){
Log.e(TAG, e.toString());
}
测试链接写好之后直接开冲。结果直接给了当头一棒
2022-01-11 10:42:10.197 22381-22381/com.example.test E/testsql----->: java.sql.SQLNonTransientConnectionException: Could not create connection to database server.
然后开始各种百度方案,像检查防火墙,检查驱动和数据库版本是否匹配,检查驱动地址正确,增加ssl配置,增加时区参数,各种重启服务等,均无果。今天早上就想,为什么不能问问神奇的Java呢?说干就干,直接在eclipse开了一个java的test工程,导入同样的版本mysql-connector-java-8.0.27,写了同样的代码。
public Connection getConnection() throws SQLException {
String driver = "com.mysql.cj.jdbc.Driver";
String url = "jdbc:mysql://192.168.0.142:3306/test" +
"?useUnicode=true" +
"&characterEncoding=utf8" +
"&useSSL=false" +
"&serverTimezone=GMT" +
"&rewriteBatchedStatements=true";
String user = "root";
String password = "123456";
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return DriverManager.getConnection(url, user, password);
}
结果更是当头一棒。
public static void main(String[] args) {
try {
System.out.println(DbUtil.getInstance().getConnection());
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
显示的结果竟然是
com.mysql.cj.jdbc.ConnectionImpl@59e84876
惊呆了,同样的jar包,同样的数据库,同样的url,nusername,password,在java工程就能连,在android工程就连不上,头发快掉光了也没查到有效的解决方案,希望大家帮帮小弟在编程的道路上能茁壮成长~
该问题已解决!
解决方案其实是java思路向Android思路的转变,在Android程序中有一条规则,就是任何拖慢主程序的程序都会被干掉。重新梳理了一遍丢出来的Exception,里面有一条
W/System.err: Caused by: java.net.SocketException: android.os.NetworkOnMainThreadException
如果大家也有相关问题可以仔细查看下是否也出现了这个异常,如果也有,则可以参考本文解决方案。
所以有关连接数据库的部分需要单开一个线程,修改后代码如下
public static void mymysql() {
String url = "jdbc:mysql://192.168.0.142:3306/test"
+ "?useUnicode=true"
+ "&characterEncoding=utf8"
+ "&autoReconnect=true"
+ "&useSSL=false"
+ "&serverTimezone=GMT";
String user = "root";
String password = "123456";
new Thread(new Runnable() {
@Override
public void run() {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
dbCon.conn = DriverManager.getConnection(url,user, password);
String sql = "select * from testdb where 1=1 ";
stmt = conn.prepareStatement(sql);
rs = stmt.executeQuery();
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();
while (rs.next()) {
for (int i = 1; i <= columnCount; i++) {
Log.e(rsmd.getColumnLabel(i)+"------------>", rs.getObject(i).toString());
}
}
} catch (Exception e) {
e.printStackTrace();
}finally {
dbCon.disconnect();
}
}
}).start();
}
效果显示
至此,mysql的连接查询已无问题,crud也就迎刃而解了,下一篇将会记录查询后的结果显示至Activity的TextView中。