当前位置:   article > 正文

Android Studio连接数据库Mysql_android studio连接mysql数据库

android studio连接mysql数据库

最近在做安卓课设时有连接数据库的需求,但程序一直报错,查了很多方法,最后总算成功。

在此记录并分享我的方法,希望能帮助到大家。

Android Stidio版本:3.5.2

MySQL版本:5.7

jar包版本:mysql-connerctor-java-5.1.48

(官网:MySQL :: Download MySQL Connector/J (Archived Versions)

数据库部分:

在数据库中建好测试表:

数据库名:test

表名:users

这里需要注意数据库用户的权限,如果权限不够,后面在连接时可能报message from server: “Host is not allowed to connect to this MySQL server“错误。

打开数据库

 

输入密码后依次输入:

use mysql;

update user set host = '%' where user = 'root';(root就是你的数据库用户名) 

select host, user from user;

FLUSH PRIVILEGES;

成功后如图 

 Android Studio部分

概览如图:

 点击Android切换Project视图

 依次点击app、src、main

右键main创建文件夹libs

 将下好的jar包复制或者拖入libs中

 右键jar包点击Add As Library...(这里因为我导入过了,所以用其他jar包演示了一下)

 再切回Android视图,找到Grade Scripts文件下的build.gradle(app)

 查看是否有如下代码

 如果曾导入过其他版本jar包,记得删除对应语句,只留你需要的版本!否则报错

在java文件夹下创建

DBUtils.java

  1. package com.example.mysql;
  2. import android.util.Log;
  3. import java.sql.Connection;
  4. import java.sql.DriverManager;
  5. import java.sql.PreparedStatement;
  6. import java.sql.ResultSet;
  7. import java.sql.ResultSetMetaData;
  8. import java.util.HashMap;
  9. //数据库工具类:连接数据库用、获取数据库数据用
  10. public class DBUtils {
  11. private static String driver = "com.mysql.jdbc.Driver";// MySql驱动
  12. private static String user = "root";// 用户名
  13. private static String password = "sise";// 密码
  14. private static Connection getConn(String dbname){
  15. Connection connection = null;
  16. try{
  17. Class.forName(driver);// 动态加载类
  18. String ip = "172.17.9.108"; // 写成本机地址,不能写成localhost
  19. // 尝试建立到给定数据库URL的连接
  20. connection = DriverManager.getConnection("jdbc:mysql://" + ip
  21. + ":3306/" + dbname, user, password);
  22. }catch (Exception e){
  23. Log.i("DBUtils","Exception");
  24. e.printStackTrace();
  25. }
  26. return connection;
  27. }
  28. public static HashMap<String, Object> getAllInfo(){
  29. HashMap<String, Object> map = new HashMap<>();
  30. // 根据数据库名称,建立连接
  31. Connection connection = getConn("test");
  32. try {
  33. String sql = "select * from users;";
  34. if (connection != null){// connection不为null表示与数据库建立了连接
  35. PreparedStatement ps = connection.prepareStatement(sql);
  36. if (ps != null){
  37. // 执行sql查询语句并返回结果集
  38. ResultSet rs = ps.executeQuery();
  39. if (rs != null){
  40. while (rs.next()){
  41. // String rsm = rs.getMetaData().getColumnName(1);
  42. // Log.i("DBUtils","记录rsm :" + rsm);
  43. // 通过字段检索
  44. String id = rs.getString("nums");
  45. String name = rs.getString("name");
  46. String passw = rs.getString("passw");
  47. int age = rs.getInt("age");
  48. String adress = rs.getString("adress");
  49. Log.i("DBUtils","记录全 :" + id + name + passw + age + adress);
  50. map.put(id,","+name+","+passw+","+age+","+adress);
  51. }
  52. connection.close();
  53. ps.close();
  54. return map;
  55. }else {
  56. Log.i("DBUtils","结果为空");
  57. return null; }
  58. }else {
  59. Log.i("DBUtils","sql");
  60. return null; }
  61. }else {
  62. Log.i("DBUtils","连接失败");
  63. return null; }
  64. }catch (Exception e){
  65. e.printStackTrace();
  66. Log.e("DBUtils","异常:" + e.getMessage());
  67. return null;
  68. }
  69. }
  70. public static HashMap<String, Object> getInfoByName(String names){
  71. HashMap<String, Object> map = new HashMap<>();
  72. // 根据数据库名称,建立连接
  73. Connection connection = getConn("test");
  74. try {
  75. // mysql简单的查询语句。这里是根据users表的name字段来查询某条记录
  76. String sql = "select * from users where name = ? ;";
  77. if (connection != null){ // connection不为null表示与数据库建立了连接
  78. PreparedStatement ps = connection.prepareStatement(sql);
  79. if (ps != null){
  80. // 设置上面的sql语句中的?的值为name
  81. // ps.setString(1, names);
  82. ps.setNString(1,names);
  83. // 执行sql查询语句并返回结果集
  84. ResultSet rs = ps.executeQuery();
  85. // rs.beforeFirst();
  86. if (rs != null && rs.next()){
  87. Log.i("DBUtils","记录 count :" + rs.getMetaData().getColumnCount());
  88. rs.previous();
  89. while (rs.next()){
  90. // 通过字段检索
  91. String id = rs.getString("nums");
  92. String name = rs.getString("name");
  93. String passw = rs.getString("passw");
  94. int age = rs.getInt("age");
  95. String adress = rs.getString("adress");
  96. Log.i("DBUtils","记录全 :" + id + name + passw + age + adress);
  97. map.put(id,","+name+","+passw+","+age+","+adress);
  98. }
  99. connection.close();
  100. ps.close();
  101. return map;
  102. }else {
  103. Log.i("DBUtils","结果为空");
  104. return null; }
  105. }else {
  106. Log.i("DBUtils","sql");
  107. return null; }
  108. }else {
  109. Log.i("DBUtils","连接失败");
  110. return null; }
  111. }catch (Exception e){
  112. e.printStackTrace();
  113. Log.e("DBUtils","异常:" + e.getMessage());
  114. return null;
  115. }
  116. }
  117. }

查看注释要求,用户密码就是数据库的用户密码

主机地址填本机的地址,可在命令行中用查询。

MainActivity.java

  1. package com.example.mysql;
  2. import androidx.appcompat.app.AppCompatActivity;
  3. import android.os.Bundle;
  4. import android.os.Handler;
  5. import android.os.Message;
  6. import android.view.View;
  7. import android.widget.Button;
  8. import android.widget.TextView;
  9. import java.util.HashMap;
  10. public class MainActivity extends AppCompatActivity {
  11. private TextView tv_data;
  12. private Button btn_get_data; //声明组件
  13. private Button btn_get_all; //声明组件
  14. private final Handler handler = new Handler(new Handler.Callback() {
  15. @Override
  16. public boolean handleMessage(Message msg) {
  17. switch (msg.what){
  18. case 0x11:
  19. String s = (String) msg.obj;
  20. tv_data.setText(s);
  21. break;
  22. case 0x12:
  23. String ss = (String) msg.obj;
  24. tv_data.setText(ss);
  25. break;
  26. }
  27. return true;
  28. }
  29. });
  30. @Override
  31. protected void onCreate(Bundle savedInstanceState) {
  32. super.onCreate(savedInstanceState);
  33. setContentView(R.layout.activity_main);
  34. // 控件的初始化
  35. btn_get_data = findViewById(R.id.btn_get_data);
  36. btn_get_all = findViewById(R.id.btn_get_all);
  37. tv_data = findViewById(R.id.tv_data);
  38. setListener();
  39. }
  40. //设置监听
  41. private void setListener() {
  42. // 按钮点击事件
  43. btn_get_data.setOnClickListener(new View.OnClickListener() {
  44. @Override
  45. public void onClick(View v) {
  46. // 创建一个线程来连接数据库并获取数据库中对应表的数据
  47. new Thread(new Runnable() {
  48. @Override
  49. public void run() {
  50. // 调用数据库工具类DBUtils的getInfoByName方法获取数据库表中数据
  51. HashMap<String, Object> map = DBUtils.getInfoByName("张三");
  52. Message message = handler.obtainMessage();
  53. if(map != null){
  54. String s = "";
  55. for (String key : map.keySet()){
  56. s += key + ":" + map.get(key) + "\n";
  57. }
  58. message.what = 0x12;
  59. message.obj = s;
  60. }else {
  61. message.what = 0x11;
  62. message.obj = "查询结果为空";
  63. }
  64. // 发消息通知主线程更新UI
  65. handler.sendMessage(message);
  66. }
  67. }).start();
  68. }
  69. });
  70. // 按钮点击事件
  71. btn_get_all.setOnClickListener(new View.OnClickListener() {
  72. @Override
  73. public void onClick(View v) {
  74. // 创建一个线程来连接数据库并获取数据库中对应表的数据
  75. new Thread(new Runnable() {
  76. @Override
  77. public void run() {
  78. // 调用数据库工具类DBUtils的getInfoByName方法获取数据库表中数据
  79. HashMap<String, Object> map = DBUtils.getAllInfo();
  80. Message message = handler.obtainMessage();
  81. if(map != null){
  82. String s = "";
  83. for (String key : map.keySet()){
  84. s += key + ":" + map.get(key) + "\n";
  85. }
  86. message.what = 0x12;
  87. message.obj = s;
  88. }else {
  89. message.what = 0x11;
  90. message.obj = "查询结果为空";
  91. }
  92. // 发消息通知主线程更新UI
  93. handler.sendMessage(message);
  94. }
  95. }).start();
  96. }
  97. });
  98. }
  99. }

activity_main.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. xmlns:tools="http://schemas.android.com/tools"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. tools:context=".MainActivity"
  8. android:orientation="vertical">
  9. <Button
  10. android:id="@+id/btn_get_data"
  11. android:layout_margin="2dp"
  12. android:textSize="16sp"
  13. android:text="查询名为张三的数据"
  14. android:layout_width="match_parent"
  15. android:layout_height="wrap_content"/>
  16. <Button
  17. android:id="@+id/btn_get_all"
  18. android:layout_margin="2dp"
  19. android:textSize="16sp"
  20. android:text="查询所有的数据"
  21. android:layout_width="match_parent"
  22. android:layout_height="wrap_content"/>
  23. <TextView
  24. android:id="@+id/tv_data"
  25. android:padding="10dp"
  26. android:textSize="16sp"
  27. android:layout_width="match_parent"
  28. android:layout_height="wrap_content"/>
  29. </LinearLayout>

 AndroidMainifest.xml

在其中加入

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

 获取网络权限

至此,所有配置完成,运行。

成功! 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/279691
推荐阅读
相关标签
  

闽ICP备14008679号