Android下使用JDBC连接Mysql实现创建账号

毕设选到了一个Android应用的选题,自学了一个多月开始动手,大概就是一个家政app,要能发布需求等等。

既然有这方面的需求,就肯定需要实现数据同步,网上教学视频里一般都是教的SQLite,那玩意是本地数据库,跟需求有差别,所以我就去查了下,发现可以使用java中的JDBC(JavaDataBaseConnection)直连数据库对数据进行操作。

因本人初入门,技术有限。有错误或遗漏请指出!!!


创建账号实际上就是往数据库中用户表插入一条数据,让我们先看一下用户表是怎样的:

Android下使用JDBC连接Mysql实现创建账号

至于怎么搞一台服务器就是你自己的问题了,当然如果是拿来练手的话用虚拟机就可以了。

我这台是vultr的vps,买来搭了个ss,结果项目刚好要一个服务器弄mysql就拿来用的。

我vultr的邀请链接:https://www.vultr.com/?ref=7360147

还有在Linux里开放3306端口啊,装mysql啊,创一个远程访问用户这种我就不在这篇文章中提及了,网上很多教程

好了废话不多说,进入代码部分吧!

以下为注册界面示意图:

Android下使用JDBC连接Mysql实现创建账号

可以看到一共只有三个EditText,实际上只输入了账号和密码,数据表中的什么touxiang这种都是用硬解码插入。

以下代码就是主要代码:

package com.example.enz.Housekeeping;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Looper;
import android.support.annotation.Nullable;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * Created by Administrator on 2018/3/26.
 */

public class Register extends Activity {
    private Button bt;
    private EditText Etext1,Etext2,Etext3;
    private String bt_username,bt_password,bt_password2;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.register);
        bt = (Button) findViewById(R.id.register_bt);
        Etext1= (EditText) findViewById(R.id.register_username);
        Etext2= (EditText) findViewById(R.id.register_passwd);
        Etext3= (EditText) findViewById(R.id.register_passwd2);
        /*
            监听 注册 按钮点击事件
         */
        bt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                /*
                    获取EditText中用户输入的信息
                 */
                bt_username=Etext1.getText().toString().trim();
                bt_password=Etext2.getText().toString().trim();
                bt_password2=Etext3.getText().toString().trim();
                /*
                    做简单的过滤判断
                 */
                if (bt_username.equals("")){
                    Toast.makeText(Register.this, "用户名不能为空!", Toast.LENGTH_SHORT).show();
                }
                else if (bt_password.equals("")){
                    Toast.makeText(Register.this, "密码不能为空!", Toast.LENGTH_SHORT).show();
                }
                else if (!bt_password.equals(bt_password2)){
                    Toast.makeText(Register.this, "两次输入的密码不一致!", Toast.LENGTH_SHORT).show();
                }
                else {
                    /*
                        加载loading动画
                     */
                    final LoadingDialog loadingDialog = new LoadingDialog(Register.this);
                    loadingDialog.setMessage("正在注册...").show();

                    new Thread()
                    {
                        public void run() {
                            Connection conn = null;
                            Statement stmt = null;
                            ResultSet rs = null;
                            try {
                                //使子进程可以显示toast
                                Looper.prepare();
                                //调用JDBC类的静态方法连接Mysql
                                conn = JDBC.JDBC_connection();

                                //操纵数据库
                                   stmt = conn.createStatement();
                                String sql_select = "select * from UserTable where username='"+bt_username+"'";
                                rs = stmt.executeQuery(sql_select);
                                if(rs.next()){
                                    //rs不为null---代表查询出来有数据
                                    Toast.makeText(Register.this, "用户已存在!", Toast.LENGTH_SHORT).show();
                                    //关闭loading动画
                                    loadingDialog.dismiss();
                                }
                                else {
                                    String sql = "INSERT INTO UserTable VALUES ('"+bt_username+"','"+bt_password+"','testtouxiang',123456,'testaddress')";
                                    stmt.executeUpdate(sql);

                                    Toast.makeText(Register.this, "新建用户成功!", Toast.LENGTH_SHORT).show();
                                    /*
                                        跳转至Login
                                     */
                                    Intent intent = new Intent(Register.this,Login.class);
                                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                                    startActivity(intent);
                                }
                                Looper.loop();
                            }
                            catch(ClassNotFoundException e) {
                                e.getMessage();
                            }
                            catch (SQLException e) {
                                e.getMessage();
                            }
                            /*
                                关闭连接
                             */
                            finally {
                                if (rs != null){
                                    try {
                                        rs.close();
                                    } catch (SQLException e) {
                                        e.printStackTrace();
                                    }
                                }
                                if (stmt != null){
                                    try {
                                        stmt.close();
                                    } catch (SQLException e) {
                                        e.printStackTrace();
                                    }
                                }
                                if (conn != null){
                                    try {
                                        conn.close();
                                    } catch (SQLException e) {
                                        e.printStackTrace();
                                    }
                                }
                            }

                        }
                    }.start();
                }
            }
        });
    }

}

JDBC类的代码:

package com.example.enz.Housekeeping;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

/**
 * Created by Administrator on 2018/4/17.
 */

public class JDBC {
    public static Connection JDBC_connection() throws ClassNotFoundException, SQLException {
        //加载驱动
        Class.forName("com.mysql.jdbc.Driver");

        //获得数据库连接
        String url = "jdbc:mysql://ip地址:端口一般是3306/数据库名字";
        String user = "远程用户";
        String passwd = "远程用户密码";
        Connection conn = null;
        try {
            conn = DriverManager.getConnection(url, user, passwd);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }

}


主要的就是加载驱动跟获取数据库连接的语句,Class.forName(xxxx)这个是固定的,我这里连接的是mysql就填的上面的那一串,JDBC除了Mysql外还可以连接其他数据库,只需要更改xxxx中的数值就好了。

后面三个变量的例子如下:

String url = "jdbc:mysql://192.168.0.1:3306/TestDataBase";
String user = "Roger";
String passwd = "Passwd";

相信什么意思大家也能看懂,就不多解释这个了。

因为我这个项目中其他地方也需要连接到数据库,所以单独分出了这个类以后直接调用就好了。

下面回到正题,上面主要代码中其实注释已经很详细,但是我还是简单说一下吧。

JDBC连接到数据库后,就直接执行sql语句就好了,啥意思?很简单,等于连接成功后你直接insert就可以插入了。

比如我上面的代码中的实现插入数据的代码:

//调用JDBC类的静态方法连接Mysql
conn = JDBC.JDBC_connection();
//操纵数据库
stmt = conn.createStatement();
String sql_select = "select * from UserTable where username='"+bt_username+"'";
rs = stmt.executeQuery(sql_select);
if(rs.next()){
    //rs不为null---代表查询出来有数据
    Toast.makeText(Register.this, "用户已存在!", Toast.LENGTH_SHORT).show();
}
else {
    String sql = "INSERT INTO UserTable VALUES ('"+bt_username+"','"+bt_password+"','testtouxiang',123456,'testaddress')";
    stmt.executeUpdate(sql);
    Toast.makeText(Register.this, "新建用户成功!", Toast.LENGTH_SHORT).show();
}

我删了部分其他功能打代码,可以看到,首先是调用JDBC类去连接到了数据库,然后就可以直接插入数据了,不过在此之前还需要进行一个验证,既然是创建账号,而且用户名是主键,是不允许重复的,所以会先执行查询,使用拼接将EditText中获取到的用户名拼接到sql语句中,然后从用户表中查找该用户,若有返回结果,就代表该用户已经存在,那肯定就不能创建了,如果找不到该用户名的数据,代表数据库中不存在该用户,就可以往里加。插入也很简单,就是一条sql语句的事,把用户名和密码拼接到sql语句里(别问我sql语句是什么),然后什么touxiang、phone、address全部都硬解码插入,反正也用不上。

最后使用stmt.executeUpdate(xx)执行这个语句,过一会就能在数据库中看到这些数据了!


注意:

使用JDBC是需要导入jar包的,具体方式网上很多文章都有。

JDBC属于网络操作,所以需在子进程中进行,并需要在AndroidManifest.xml中添加

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