IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android 直连MySQL数据库实现增删改查 -> 正文阅读

[移动开发]Android 直连MySQL数据库实现增删改查

前言

最近在重构老项目 在原来的基础上加了mysql数据库的使用 主要是为了记录一些重要数据!
第一次使用记得还是三四年前 现在很久没操作了 先写个demo练习一下
这里记录一下流程和使用方法!

效果图

show

导入mysql-connector-java-5.1.30-bin.jar包

mysql-connector-java-5.1.30-bin.jar包 CSDN下载地址

将jar下载后,在新建的demo项目app/src/main 目录下 创建libs文件夹,将jar包复制到该文件夹下,然后右键选择 Add As Library 进行导入即可

目录结构

等待gradle同步jar包后,打开gradle文件依赖内容如下说明导入成功 如下图所示
2

xml文件

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/btn_select_for_id"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="2dp"
        android:text="根据字段查询"
        android:textSize="16sp"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/btn_select_table"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="2dp"
        android:text="整表查询"
        android:textSize="16sp"
        app:layout_constraintTop_toBottomOf="@id/btn_select_for_id" />

    <Button
        android:id="@+id/btn_insert"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:padding="10dp"
        android:text="插入数据"
        android:textSize="16sp"
        app:layout_constraintTop_toBottomOf="@id/btn_select_table" />

    <Button
        android:id="@+id/btn_delete"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:padding="10dp"
        android:text="删除表数据"
        android:textSize="16sp"
        app:layout_constraintTop_toBottomOf="@id/btn_insert" />

    <TextView
        android:id="@+id/tv_data_for_id"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:gravity="center"
        android:padding="10dp"
        android:text="显示单个查询的数据"
        android:textSize="16sp"
        app:layout_constraintTop_toBottomOf="@id/btn_delete" />

    <TextView
        android:id="@+id/tv_data_show"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:padding="10dp"
        android:text="显示整个表的数据"
        android:textSize="16sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

MySQL 数据库

代码层面 就是 先连接到mysql数据库 然后对其操作 增删改查
一起来看下demo的实现吧

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";

    private Button btnSelectForId, btnSelectTable, btnInsert, btnDelete;
    private TextView tvShowId, tvShowTable;

    @SuppressLint("HandlerLeak")
    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case 0x11:
                case 0x12:
                    String s = (String) msg.obj;
                    tvShowId.setText(s);
                    break;
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //initView
        btnSelectForId = findViewById(R.id.btn_select_for_id);
        btnSelectTable = findViewById(R.id.btn_select_table);
        btnInsert = findViewById(R.id.btn_insert);
        btnDelete = findViewById(R.id.btn_delete);
        tvShowId = findViewById(R.id.tv_data_for_id);
        tvShowTable = findViewById(R.id.tv_data_show);
        //设置监听事件
        initListener();
    }

    private void initListener() {
        // 查询单个字段
        btnSelectForId.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 创建一个线程来连接数据库并获取数据库中对应表的数据
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        // 调用数据库工具类DBUtils的getInfoByName方法获取数据库表中数据
                        HashMap<String, Object> map = DBUtils.getInfoById();
                        Message message = handler.obtainMessage();
                        if (map != null) {
                            StringBuilder s = new StringBuilder();
                            for (String key : map.keySet()) {
                                s.append(key).append(":").append(map.get(key)).append("\n");
                            }
                            message.what = 0x12;
                            message.obj = s.toString();
                        } else {
                            message.what = 0x11;
                            message.obj = "查询结果为空";
                        }
                        // 发消息通知主线程更新UI
                        handler.sendMessage(message);
                    }
                }).start();

            }
        });

        //查询整个表
        btnSelectTable.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        //查询整表数据
                        final List<LogBean> logBeanData = DBUtils.getLogBeanData();
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                //展示整个表数据
                                tvShowTable.setText(logBeanData.toString());
                                Log.e(TAG, "table data ---" + logBeanData.toString());
                            }
                        });
                    }
                }).start();
            }
        });

        //插入
        btnInsert.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        int status = 0;
                        try {
                            status = DBUtils.insertData("身份证识别模块",
                                    "正常", "0", "{姓名:小明,性别:男,出生日期:20180219}");
                        } catch (SQLException e) {
                            e.printStackTrace();
                        }
                        Log.e(TAG, "insert data status ------" + status);
                        if (status == 1) {
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    Toast.makeText(MainActivity.this, "插入成功", Toast.LENGTH_SHORT).show();
                                }
                            });
                        } else {
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    Toast.makeText(MainActivity.this, "插入失败", Toast.LENGTH_SHORT).show();
                                }
                            });
                        }
                    }
                }).start();
            }
        });


        //删除表数据
        btnDelete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        int code = DBUtils.deleteDataForTable("身份证识别模块");
                        Log.e(TAG, "code ---" + code);
                        if (code == 1) {
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    Toast.makeText(MainActivity.this, "删除成功", Toast.LENGTH_SHORT).show();
                                }
                            });
                        } else {
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    Toast.makeText(MainActivity.this, "删除失败", Toast.LENGTH_SHORT).show();
                                }
                            });
                        }
                    }
                }).start();
            }
        });

    }
}

MySQL封装工具类 DBUtils

该工具类主要是链接mysql数据库 还有增删改查的方法 如果要借用
记得改掉表名和ip地址 还有数据库名字

/**
 * Author by Lyu
 * Date on 2021/10/27-10:58
 * Description: 数据库的ip地址记得写本机IPV4地址,然后手机与电脑连接同一个网络,只有这样条件下,手机才能成功的连接上本机的mysql数据库。
 */
public class DBUtils {

    private static final String DATA_BASE_TABLE_NAME = "xwc_android_log";

    private static Connection getConn() {
        Connection connection = null;
        try {
            // MySql驱动
            String driver = "com.mysql.jdbc.Driver";
            Class.forName(driver);// 动态加载类
            String ip = "192.168.31.7";// 写成本机地址,不能写成localhost,同时手机和电脑连接的网络必须是同一个

            // 尝试建立到给定数据库URL的连接
            // 用户名
            String LogBean = "root";
            // 密码
            String password = "****";
            connection = DriverManager.getConnection("jdbc:mysql://" + ip + ":3306/" + "xwc-client",
                    LogBean, password);

        } catch (Exception e) {
            e.printStackTrace();
        }

        return connection;
    }

    static HashMap<String, Object> getInfoById() {
        HashMap<String, Object> map = new HashMap<>();
        // 根据数据库名称,建立连接
        Connection connection = getConn();
        try {
            // mysql简单的查询语句。这里是根据MD_CHARGER表的NAME字段来查询某条记录
            String sql = "select * from " + DATA_BASE_TABLE_NAME + " where content = ?";
            // connection不为null表示与数据库建立了连接
            if (connection != null) {
                PreparedStatement ps = connection.prepareStatement(sql);
                if (ps != null) {
                    // 设置上面的sql语句中的?的值为id
                    ps.setString(1, "id");
                    // 执行sql查询语句并返回结果集
                    ResultSet rs = ps.executeQuery();
                    if (rs != null) {
                        int count = rs.getMetaData().getColumnCount();
                        Log.e("DBUtils", "列总数:" + count);
                        while (rs.next()) {
                            // 注意:下标是从1开始的
                            for (int i = 1; i <= count; i++) {
                                String field = rs.getMetaData().getColumnName(i);
                                map.put(field, rs.getString(field));
                            }
                        }
                        closeAll(connection, ps);
                        return map;
                    } else {
                        return null;
                    }
                } else {
                    return null;
                }
            } else {
                return null;
            }
        } catch (Exception e) {
            e.printStackTrace();
            Log.e("DBUtils", "异常:" + e.getMessage());
            return null;
        }

    }

    public static int insertData(String name, String type, String status, String content) throws SQLException {
        // 根据数据库名称,建立连接
        Connection connection = getConn();
        //向course表插入数据,其中id字段插入的值对应第一个问号,type字段插入的值对应第二个问号
        String sql = "insert into " + DATA_BASE_TABLE_NAME + " (type,name,status,content,create_time) values (?,?,?,?,?);";
        PreparedStatement ps = connection.prepareStatement(sql);
        //通过setString赋值
        ps.setString(1, type);
        ps.setString(2, name);
        ps.setString(3, status);
        ps.setString(4, content);
        ps.setTimestamp(5, new Timestamp(System.currentTimeMillis()));
        //执行更新数据库 返回一个状态码 可以根据这个码 判断是否插入成功
        int insertCode = ps.executeUpdate();
        closeAll(connection, ps);//关闭相关操作
        return insertCode;
    }

    /**
     * 查整个表的数据
     *
     * @return
     */
    public static List<LogBean> getLogBeanData() {
        //结果存放集合
        List<LogBean> list = new ArrayList<>();
        PreparedStatement ps = null;
        ResultSet rs = null;
        //MySQL 语句
        String sql = "select * from " + DATA_BASE_TABLE_NAME;
        //获取链接数据库对象
        Connection conn = getConn();
        try {
            if (conn != null && (!conn.isClosed())) {
                ps = conn.prepareStatement(sql);
                if (ps != null) {
                    rs = ps.executeQuery();
                    if (rs != null) {
                        while (rs.next()) {
                            LogBean log = new LogBean();
                            log.setId(rs.getString("id"));
                            log.setName(rs.getString("name"));
                            log.setType(rs.getString("type"));
                            log.setContent(rs.getString("status"));
                            log.setStatus(rs.getString("content"));
                            log.setCreate_time(rs.getTimestamp(6));
                            list.add(log);
                        }
                    }
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        closeAll(conn, ps, rs);//关闭相关操作
        return list;
    }

    /**
     * 修改数据库中某个对象的状态  改
     */

    public int updateUserData(String name) {
        int result = -1;
        PreparedStatement ps = null;
        //获取链接数据库对象
        Connection conn = getConn();
        if (!TextUtils.isEmpty(name)) {
            //获取链接数据库对象
            //MySQL 语句
            String sql = "update " + DATA_BASE_TABLE_NAME + " set status=? where name=?";
            try {
                boolean closed = conn.isClosed();
                if (!closed) {
                    ps = conn.prepareStatement(sql);
                    ps.setString(1, "1");//第一个参数status 一定要和上面SQL语句字段顺序一致
                    ps.setString(2, name);//第二个参数name 一定要和上面SQL语句字段顺序一致
                    result = ps.executeUpdate();//返回1 执行成功
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        closeAll(conn, ps);//关闭相关操作
        return result;
    }


    /**
     * 根据字段删除
     *
     * @return
     */
    public static int deleteDataForTable(String name) {
        int result = -1;
        PreparedStatement ps = null;
        //获取链接数据库对象
        Connection conn = getConn();
        if (!TextUtils.isEmpty(name)) {
            //MySQL 语句
            String sql = "delete from " + DATA_BASE_TABLE_NAME + " where name=?";
            try {
                boolean closed = conn.isClosed();
                if (!closed) {
                    ps = conn.prepareStatement(sql);
                    ps.setString(1, name);
                    result = ps.executeUpdate();//返回1 执行成功
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        closeAll(conn, ps);//关闭相关操作
        return result;
    }


    /**
     * 关闭数据库 三参
     *
     * @param conn
     * @param ps
     * @param rs
     */
    public static void closeAll(Connection conn, PreparedStatement ps, ResultSet rs) {
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (ps != null) {
            try {
                ps.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

    }

    /**
     * 关闭数据库 两参
     *
     * @param conn
     * @param ps
     */

    public static void closeAll(Connection conn, PreparedStatement ps) {
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (ps != null) {
            try {
                ps.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

    }

}

网络权限

mysql数据库 就是实现客户端向服务器发送 所以网络权限一定要的
1

总结

很早以前学习过mysql数据库的操作方法 那时候还是用jdbc的原始方法
好多年没用了 今天复习了一下 感觉记忆有加深了不少!
又多了一项技能 哈哈哈 温故而知新,可以为师矣。

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章           查看所有文章
加:2021-11-01 11:36:24  更:2021-11-01 11:36:28 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 0:50:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码