前言:在最近学习安卓开发的过程中,需要连接MySQL数据库,这里面遇到了很多问题,也翻阅了网上大量资料,都层次不齐,有的还存在问题,于是我这里完整的记录一下我是如何正确连接MySQL数据库并记录一下自己踩过的坑,真的耗费了我很多时间,希望对大家有帮助。
目录
一、正确连接MySQL数据库
代码都是博主亲自测试无误后写的,里面的坑我都替大家踩完了,大家可以放心参考。
1.1、JDBC工具类
jar包驱动版本如图所示:
亲测可用,这个版本很好用,我的本地数据库是8.0的版本,也是可以正常连接的。
SELECT VERSION();
这里采用的是单例模式,全程只会获取一次连接,避免不必要的开销。
工具类完整代码:
package com.example.studentsystem.utils;
import java.sql.Connection;
import java.sql.DriverManager;
public class JDBCUtil {
private static JDBCUtil jdbcUtil;
private Connection connection;
private JDBCUtil() {
}
public static JDBCUtil getInstance() {
if(jdbcUtil == null) {
jdbcUtil = new JDBCUtil();
}
return jdbcUtil;
}
public Connection getConnection() throws Exception {
if(connection == null) {
//1、装载驱动
Class.forName("com.mysql.jdbc.Driver");
//2.定义连接url
String url="jdbc:mysql://ip地址:3306/数据库名称?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF-8&useSSL=false";
//3.定义账号和密码
String username="账号";
String password="密码";
//4.获得连接对象
connection = DriverManager.getConnection(url, username, password);
}
return connection;
}
}
注:这里的ip地址需要自己打开cmd窗口,使用ipconfig命令获取本机的IPV4地址,不能用localhost!!!
1.2、UserDao层
这里简单的展示一下我是如何连接数据库进行查询操作的。
完整代码:
package com.example.studentsystem.dao;
import android.util.Log;
import com.example.studentsystem.utils.JDBCUtil;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class UserDao {
public void test(){
try {
Connection connection = JDBCUtil.getInstance().getConnection();
String sql = "select * from sys_user";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
ResultSet resultSet = preparedStatement.executeQuery();
while (resultSet.next()) {
int userId = resultSet.getInt("user_id");
String usr = resultSet.getString("username");
String pwd = resultSet.getString("password");
String role = resultSet.getString("role");
// 处理每一行数据,您可以根据需求进行相应的操作
System.out.println("user: " + userId);
System.out.println("username: " + usr);
System.out.println("password: " + pwd);
System.out.println("role: " + role);
}
resultSet.close();
preparedStatement.close();
} catch (Exception e) {
System.out.println(e);
Log.e("jdbc",e.getMessage());
}
}
}
1.3、自定义事件
这里需要自己自定义一个点击事件进行测试,因为数据库连接需要耗费一定时间,所以需要一定要放在线程当中去处理,否则会报错。
完整代码:
package com.example.studentsystem;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import com.example.studentsystem.dao.UserDao;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void login(View view){
new Thread(){
@Override
public void run() {
UserDao userDao = new UserDao();
userDao.test();
}
}.start();
}
}
1.4、项目结构
我是这样建包的,大家可以参考一下,activity_main.xml主页面加了个按钮,去触发login这个方法的,这里就不贴出来了。
1.5、开启外网访问权限
找到AndroidManifest.xml文件,添加如下两行代码。
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
到这里就可以了。
二、踩坑记录
这里我给大家整理了几种常见的报错,以及我的解决方案,仅供参考。
2.1、报错一
问题详情:
Could not create connection to database server
如图所示:
解决办法:
第一种情况:是因为的ip地址写的是localhost了,应该是本机的IPV4地址。
第二种情况:是你的jar包驱动和MySQL版本不匹配,这里我推荐的稳定版本是:5.1.49的驱动jar包,既可以连接MySQL8.0也可以连接MySQL5.0版本的。
第三种情况:你的有关数据库的连接操作必须在线程当中实现。
这三个问题自己一个个排查过去,大部分都是以上三种原因。
2.2、报错二
问题详情:
Access denied for user 'root'@'HTT' (using password: YES)
解决办法:
账号密码检查过了都是对的,就是连接不上,后来才发现是因为没有开启远程访问的权限,如图所示:
依次输入如下三行命令:
use mysql
update user set host = '%' where user = 'root';
FLUSH PRIVILEGES;
执行完以后,就连接上了。
2.3、报错三
问题详情:
E/AndroidRuntime: FATAL EXCEPTION: Thread-2
Process: com.example.studentsystem, PID: 10636
java.lang.NoClassDefFoundError: Failed resolution of: Ljava/sql/SQLType;
at com.mysql.cj.jdbc.ConnectionImpl.getMetaData(ConnectionImpl.java:1170)
at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:447)
at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:246)
at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:197)
at java.sql.DriverManager.getConnection(DriverManager.java:580)
at java.sql.DriverManager.getConnection(DriverManager.java:218)
at com.example.studentsystem.utils.JDBCUtil.getConnection(JDBCUtil.java:33)
at com.example.studentsystem.dao.UserDao.test(UserDao.java:15)
at com.example.studentsystem.MainActivity$1.run(MainActivity.java:25)
Caused by: java.lang.ClassNotFoundException: Didn't find class "java.sql.SQLType" on path: DexPathList[[dex file "/data/data/com.example.studentsystem/code_cache/.overlay/base.apk/classes4.dex", zip file "/data/app/~~43pk1avwKCpcsqDTUZz4XA==/com.example.studentsystem-57z9E8XIRruRPRJVm4fHhg==/base.apk"],nativeLibraryDirectories=[/data/app/~~43pk1avwKCpcsqDTUZz4XA==/com.example.studentsystem-57z9E8XIRruRPRJVm4fHhg==/lib/x86_64, /system/lib64, /system_ext/lib64]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:259)
at java.lang.ClassLoader.loadClass(ClassLoader.java:637)
at java.lang.ClassLoader.loadClass(ClassLoader.java:573)
at com.mysql.cj.jdbc.ConnectionImpl.getMetaData(ConnectionImpl.java:1170)
at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:447)
at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:246)
at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:197)
at java.sql.DriverManager.getConnection(DriverManager.java:580)
at java.sql.DriverManager.getConnection(DriverManager.java:218)
at com.example.studentsystem.utils.JDBCUtil.getConnection(JDBCUtil.java:33)
at com.example.studentsystem.dao.UserDao.test(UserDao.java:15)
at com.example.studentsystem.MainActivity$1.run(MainActivity.java:25)
解决办法:
还是因为jar包驱动的问题,我这里用了8.0版本的驱动jar包,报的这个错误,后来换了5.1.49的驱动jar包就好了。
2.4、报错四
问题详情:
Public Key Retrieval is not allowed
解决办法:
在 JDBC 连接串中加入 allowPublicKeyRetrieval=true 参数。
三、总结
以上就是关于我如何连接MySQL数据的完整分享,希望对大家有帮助,如果写的有问题或者有遗漏的欢迎在评论区补充。
转载自CSDN-专业IT技术社区
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/HJW_233/article/details/140142807