【序言】
移动平台这个课程要做一个app的课设,我打算后期增加功能改成毕设,就想要使用MySQL来作为数据库,相对于SQLlite来说,我更熟悉MySQL一点。
【遇到的问题】
一直无法连接上数据库,开始的时候查了很多资料,说是MySQL8.0版本比较高,密码验证插件是caching_sha2_password,Android Studio中的JDBC驱动可能不支持这种加密方式。(但我并不确定是否是这个原因,就是一直连不上)
我最开始用的是下面的代码(连接数据库):
private static final String TAG="DBUtils";// 用于日志打印private static Connection conn=null;// 定义连接变量conn//数据库连接函数public static Connection getConnection(String dbname) {//定义connection类函数,需要返回一个connection对象,即在上面定义的connString ip = "192.168.0.146";//ip地址,win+R,输入cmd打开控制台,输入ipconfig /all查看本机ipv4地址,最上面那个int port = 3306;//MySQL安装时的默认端口号,无需更改String user = "root";//打开Navicat,点击用户,如果显示root@localhost,请修改为root@%或新加一个root@%,%表示任意,任意ip地址都可以连接String password = "123456";//密码String url = "jdbc:mysql://172.19.221.130:3306/course_design?useUnicode=true&characterEncoding=UTF-8&useSSL=true";
// "?useUnicode=true&characterEncoding=UTF-8"添加中文信息时不会乱码
// 注册JDBC驱动的固定语句try {Class.forName("com.mysql.jdbc.Driver");//这是一个目录,你可以找到这个目录点进去就懂了Log.d(TAG, "加载JDBC驱动成功");} catch (ClassNotFoundException e) {Log.d(TAG, "加载JDBC驱动失败");}
// 创建与mysql的连接对象conn,当然你也可以直接把上面定义的那些变量url的值直接写进去,就不用上面写一堆定义try {conn = DriverManager.getConnection(url, user, password);System.out.println("数据库连接成功");Log.d(TAG, "数据库连接成功");} catch (SQLException e) {Log.d(TAG, "数据库连接失败");}return conn;//connection类,返回一个connection连接对象}
但是一直都是打印“数据库连接失败”。原博主的方法他自己是成功的,可能是我哪一步出错了我没发现吧。参考链接:Android studio 连接MYQSL8.0_android studio下载适配mysql8-CSDN博客。最后我试了别的方法成功了。
【5.11补充】
重大发现,上面这个代码可以连接数据库!!!不过也是要开新线程,在调用函数的时候调用就可以连接了!如图:
【我的解决方法】
1、开启远程访问3306端口
步骤1:依次点击控制面板—系统和安全—windows防火墙—高级设置-入站规则
步骤2:如图
步骤3:如图。填好端口号3306后,一直点击下一步即可。
2.进入MySQL页面
步骤1:Win+R,输入cmd,进入命令行窗口,输入mysql -u root -p后回车,再输入你的数据库密码
步骤2:
输入命令并回车:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION
该命令表示允许从所有IP进行连接,其中123456为数据库密码
3.需要新开一个线程运行,才能连接MySQL数据库
代码如下:
public void initConnect(String table) {// 必须新开线程才能连接MySQL数据库new Thread(new Runnable() {@Overridepublic void run() {// 数据库驱动String CLS="com.mysql.jdbc.Driver";String URL="jdbc:mysql://172.19.221.130:3306/course_design?serverTimezone = GMT&characterEncoding=UTF-8";String USER="root";String PWD="123456";try {Class.forName(CLS).newInstance();// 加载数据库驱动Connection conn=(Connection) DriverManager.getConnection(URL,USER,PWD);// 连接数据库String sql="select * from "+table;Statement stmt=conn.createStatement();ResultSet rs=stmt.executeQuery(sql);// 执行sqlList<User> users = new ArrayList<>();while (rs.next()) {User user = new User(rs.getInt("id"),rs.getString("username"),rs.getString("password"));user.setId(rs.getInt("id"));user.setName(rs.getString("username"));user.setPassword(rs.getString("password"));users.add(user);System.out.println(users);}System.out.println("连接成功");} catch (ClassNotFoundException | SQLException | IllegalAccessException | InstantiationException e) {System.out.println("连接失败");e.printStackTrace();}}}).start();}
顺带说一下导入jar包和添加权限
4、导入jar包
步骤1:到官网下载:MySQL :: Download MySQL Connector/J (Archived Versions)
我这里用的版本是5.1.49,建议用5.几的版本,版本高的似乎会出错
步骤2:下载后找到对应版本的jar包,复制粘贴到libs的文件夹下(没有libs就建一个)
步骤3:选中libs目录下的jar包,右击鼠标,点击最下面的Add as Library即可。这样系统就会自动在app目录下的build.gradle中帮你添加依赖。(如图)
注意:如果你的jar包用不了重新导入了别的版本,记得到build.gradle中将上一个版本的jar包删掉,不然会因为系统找不到该文件而报错
5、在AndroidManifest.xml中添加网络权限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
然后就可以连接MySQL啦!