连接云数据库MySQL实现用户的登录注册功能。
布局方面:采取LinearLayout线性布局和RelativeLayout相对布局。
代码方面:
1.使用多线程:声明实现Runnable接口的类,重写run方法,实例化Runnable的实现类对象,传入某个线程的构造方法中,开启线程(.start())。
2.通过JDBC访问数据库:注册驱动,获取连接,获取语句执行对象,执行SQL语句,处理结果集,释放资源。
MySQLConnection.java
1.注册驱动:JDBC规范定义驱动接口是java.sql.Driver,MySQL驱动包提供了实现类com.mysql.jdbc.Driver,开发时使用Class.forName()加载一个使用字符串描述的驱动类com.mysql.jdbc.Driver
加载驱动代码:Class.forName(“com.mysql.jdbc.Driver”).newInstance();
2.获取连接:Connection connection=DriverManager.getConnection(“jdbc:mysql://外网地址:端口/数据库名称”,“MySQL用户名”,“MySQL密码”);
关闭connection:connection.close();
public class MySQLConnection { //要连接MySQL数据库的URL URL_MySQL="jdbc:mysql://外网地址:端口/数据库名称" public static final String URL_MySQL="jdbc:mysql://外网地址:端口/数据库名称"; //要连接MySQL数据库的用户名 NAME_MySQL="MySQL用户名" public static final String NAME_MySQL="MySQL用户名"; //要连接MySQL数据库的密码 PASSWORD_MySQL="MySQL密码" public static final String PASSWORD_MySQL="MySQL密码"; //使用PreparedStatement来执行SQL语句查询 public static PreparedStatement preparedStatement; //使用Resultset接收JDBC查询语句返回的数据集对象 public static ResultSet resultSet; //连接数据库 public static Connection connection; public static void connect() { //开启连接数据库 Log.d("注意","开启连接数据库中......"); connection=null; try { //加载驱动 Class.forName("com.mysql.jdbc.Driver").newInstance(); //获取与数据库的连接 connection= DriverManager.getConnection(URL_MySQL,NAME_MySQL,PASSWORD_MySQL); }catch (Exception e){ //对异常情况进行处理 e.printStackTrace(); } } public static void close() { Log.d("注意","正在关闭数据库连接......"); try{ if(resultSet!=null){ resultSet.close();//关闭接收 resultSet=null; } if(preparedStatement!=null){ preparedStatement.close();//关闭sql语句查询 preparedStatement=null; } if(connection!=null){ connection.close();//关闭数据库连接 connection=null; } }catch (Exception e){ //对异常情况进行处理 e.printStackTrace(); } } }
User.java
public class User { private String username; private String userpassword; public User(){} public User(String username,String userpassword) { this.username=username; this.userpassword=userpassword; } public String getUsername(){ return username; } public void setUsername(String username) { this.username = username; } public String getUserpassword() { return userpassword; } public void setUserpassword(String userpassword) { this.userpassword = userpassword; } }
UserDao.java
这里实现查找用户名操作,查找用户名和密码操作
注册功能:实现向数据库中添加用户数据信息操作
String sql=“sql语句”;
PreparedStatement preparedStatement=connection.prepareStatement(sql);
这里connection是数据库连接对象,通过connection连接对象调用prepareStatement()方法就可以获得sql语句的执行对象preparedStatement,然后通过PreparedStatement对象就可以调用方法执行sql语句。
这里主要用到两种方法
方法 | 执行结果 |
---|---|
preparedStatement.executeQuery() | 执行select语句,返回查询结果 |
preparedStatement.executeUpdate() | 执行insert、updata和delete语句,返回值类型为整型,表示受影响行数 |
while (resultSet.next())
{
user=new User();
user.setUsername(resultSet.getString(“username”));
user.setUserpassword(resultSet.getString(“userpassword”));
}
这里使用结果集ResultSet,调用next()方法指向结果集,若结果集不为空,则返回true。resultSet.next()指向某一行记录
public class UserDao extends MySQLConnection{ public User findUserName(String username) { connect(); User user=null; try { //sql语句。我这里是根据我自己的users表的username字段来查询记录 String sql="select * from users where username=?"; //获取用于向数据库发送sql语句的preparedStatement preparedStatement=connection.prepareStatement(sql); //根据账号进行查询 preparedStatement.setString(1,username); //执行sql查询语句并返回结果集 resultSet=preparedStatement.executeQuery(); while (resultSet.next()) { //.next()表示指针先下一行,若有数据则返回true user=new User(); user.setUsername(resultSet.getString("username")); } }catch (Exception e){ e.printStackTrace(); }finally { close(); }return user;//若传入成功返回账号,失败则为null } public User findUser(String username,String userpassword) { connect(); User user=null; try { //sql语句。我这里是根据我自己的users表的username和password字段来查询记录 String sql="select * from users where username=? and password=?"; //获取用于向数据库发送sql语句的preparedStatement preparedStatement=connection.prepareStatement(sql); //根据账号和密码进行查询 preparedStatement.setString(1,username); preparedStatement.setString(2,userpassword); resultSet=preparedStatement.executeQuery(); while (resultSet.next()) { user=new User(); user.setUsername(resultSet.getString("username")); user.setUserpassword(resultSet.getString("userpassword")); } }catch (Exception e){ e.printStackTrace(); }finally { close(); }return user;//若传入成功返回账号和密码,失败则为null } public int registerUser(User user) { int value=0; connect(); try{ String sql="insert into users(username,password) values(?,?)"; preparedStatement=connection.prepareStatement(sql); //将数据插入数据库中 preparedStatement.setString(1,user.getUsername()); preparedStatement.setString(2,user.getUserpassword()); value=preparedStatement.executeUpdate(); }catch (Exception e){ e.printStackTrace(); }finally { close(); }return value; } }
当输入用户名和密码后,若存在,则点击登录按钮登录成功后回到主界面,若不存在,则会弹出提醒对话框并清空输入框;
当输入用户名、密码、用户名和密码为空时,分别弹出提醒对话框;
当点击了记住账号、记住密码后,重新进入登录界面,用户名和密码依旧存在,但若输入的用户名和密码错误,则会取消记住功能,并清空输入框。
activity_login.xml
LoginActivity.java
public void login() { EditText editText_username=findViewById(R.id.editText_username);//获取EditText实例 EditText editText_userpassword=findViewById(R.id.editText_userpassword);//获取EditText实例 final String username=editText_username.getText().toString().trim();//获取用户输入的用户名 final String userpassword=editText_userpassword.getText().toString().trim();//获取用户输入的密码 if(TextUtils.isEmpty(username)&&!TextUtils.isEmpty(userpassword)) { //弹出提醒对话框,提醒用户用户名不能为空 AlertDialog.Builder builder=new AlertDialog.Builder(LoginActivity.this); builder.setIcon(R.mipmap.ic_launcher); builder.setTitle("尊敬的用户"); builder.setMessage("用户名不能为空,请输入!"); builder.setPositiveButton("好的",null); AlertDialog alertDialog=builder.create(); alertDialog.show(); //设计AlertDialog提醒对话框大小 WindowManager.LayoutParams layoutParams=alertDialog.getWindow().getAttributes(); layoutParams.width=700; layoutParams.height=565; alertDialog.getWindow().setAttributes(layoutParams);//设置AlertDialog的宽高 editText_username.requestFocus(); }else if (TextUtils.isEmpty(userpassword)&&!TextUtils.isEmpty(username)) { //弹出提醒对话框,提醒用户密码不能为空 AlertDialog.Builder builder=new AlertDialog.Builder(LoginActivity.this); builder.setIcon(R.mipmap.ic_launcher); builder.setTitle("尊敬的用户"); builder.setMessage("密码不能为空,请输入!"); builder.setPositiveButton("好的",null); AlertDialog alertDialog=builder.create(); alertDialog.show(); //设计AlertDialog提醒对话框大小 WindowManager.LayoutParams layoutParams=alertDialog.getWindow().getAttributes(); layoutParams.width=700; layoutParams.height=565; alertDialog.getWindow().setAttributes(layoutParams);//设置AlertDialog的宽高 editText_userpassword.requestFocus(); }else if(TextUtils.isEmpty(username)&&TextUtils.isEmpty(userpassword)) { AlertDialog.Builder builder=new AlertDialog.Builder(LoginActivity.this); builder.setIcon(R.mipmap.ic_launcher); builder.setTitle("尊敬的用户"); builder.setMessage("请输入用户名和密码!"); builder.setPositiveButton("好的",null); AlertDialog alertDialog=builder.create(); alertDialog.show(); //设计AlertDialog提醒对话框大小 WindowManager.LayoutParams layoutParams=alertDialog.getWindow().getAttributes(); layoutParams.width=700; layoutParams.height=565; alertDialog.getWindow().setAttributes(layoutParams);//设置AlertDialog的宽高 editText_username.requestFocus(); editText_userpassword.requestFocus(); }else { //这里要以线程访问,否则会报错 new Thread(new Runnable() { @Override public void run() { final User user_name=userDao.findUserName(username); final User user=userDao.findUser(username,userpassword); //这里使用Handler类中常用的一个方法,post(Runnable r),立即发送Runnable对象。这里使用已经创建的android.os.Handler对象 handler.post(new Runnable() { @Override public void run() { if(user_name==null) { //创建提醒对话框的建造器 AlertDialog.Builder builder=new AlertDialog.Builder(LoginActivity.this); //设计对话框标题图标 builder.setIcon(R.mipmap.ic_launcher); //设置对话框标题文本 builder.setTitle("尊敬的用户"); //设置对话框内容文本 builder.setMessage("您所输入的账号不存在,请重新输入!"); //设置对话框的肯定按钮文本及其点击监听器 builder.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { editText_username.setText("");//清空editText_username内容 editText_userpassword.setText("");//清空editText_userpassword内容 SharedPreferences.Editor editor=sharedPreferences.edit(); editor.putBoolean("ischeckName",false); editor.putString("username",""); editor.putBoolean("ischeckPassword",false); editor.putString("userpassword",""); editor.commit(); CheckBox checkbox_remember_id=findViewById(R.id.checkbox_remember_id);//获取CheckBox实例 CheckBox checkbox_remember_password=findViewById(R.id.checkbox_remember_password);//获取CheckBox实例 checkbox_remember_id.setChecked(false); checkbox_remember_password.setChecked(false); } }); AlertDialog alertDialog=builder.create();//根据建造器构建提醒对话框对象 alertDialog.show();//显示提醒对话框 //设计AlertDialog提醒对话框大小 WindowManager.LayoutParams layoutParams=alertDialog.getWindow().getAttributes(); layoutParams.width=700; layoutParams.height=565; alertDialog.getWindow().setAttributes(layoutParams);//设置AlertDialog的宽高 return; } if(user==null) { //创建提醒对话框的建造器 AlertDialog.Builder builder=new AlertDialog.Builder(LoginActivity.this); //设计对话框标题图标 builder.setIcon(R.mipmap.ic_launcher); //设置对话框标题文本 builder.setTitle("尊敬的用户"); //设置对话框内容文本 builder.setMessage("您所输入的密码错误,请重新输入!"); //设置对话框的肯定按钮文本及其点击监听器 builder.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { editText_userpassword.setText("");//清空editText_userpassword内容 SharedPreferences.Editor editor=sharedPreferences.edit(); editor.putBoolean("ischeckName",false); editor.putString("username",""); editor.putBoolean("ischeckPassword",false); editor.putString("userpassword",""); editor.commit(); CheckBox checkbox_remember_id=findViewById(R.id.checkbox_remember_id);//获取CheckBox实例 CheckBox checkbox_remember_password=findViewById(R.id.checkbox_remember_password);//获取CheckBox实例 checkbox_remember_id.setChecked(false); checkbox_remember_password.setChecked(false); } }); AlertDialog alertDialog=builder.create();//根据建造器构建提醒对话框对象 alertDialog.show();//显示提醒对话框 //设计AlertDialog提醒对话框大小 WindowManager.LayoutParams layoutParams=alertDialog.getWindow().getAttributes(); layoutParams.width=700; layoutParams.height=565; alertDialog.getWindow().setAttributes(layoutParams);//设置AlertDialog的宽高 return; }else { //如果勾选了"记住账号"复选框,就把账号保存到共享参数里 if(isRememberUserName) { SharedPreferences.Editor editor=sharedPreferences.edit();//获取编辑器对象 editor.putBoolean("ischeckName",true); editor.putString("username",editText_username.getText().toString());//添加名为username的账号 editor.commit();//提交编辑器修改 } //如果勾选了“记住密码"复选框,就把密码保存到共享参数里 if(isRememberUserPassword) { SharedPreferences.Editor editor=sharedPreferences.edit(); editor.putBoolean("ischeckPassword",true); editor.putString("userpassword",editText_userpassword.getText().toString());//添加名为userpassword的密码 editor.commit(); } //创建一个意图对象,准备跳转到指定的活动页面 Intent intent=new Intent(LoginActivity.this,MainActivity.class); //跳转到意图对象指定的活动页面 startActivity(intent); } } }); } }).start(); } } //设计读取button按钮点击的功能函数onClick() @RequiresApi(api = Build.VERSION_CODES.N) @Override public void onClick(View v) { if(v.getId()==R.id.button_register_no) { //创建一个意图对象,准备跳转到指定的活动页面 Intent intent=new Intent(this,RegisterActivity.class); //跳转到意图对象指定的活动页面 startActivity(intent); } if(v.getId()==R.id.button_login) { login(); } }
当输入的账号已在数据库中存在时,则会弹出提醒对话框,并清空所有输入框,若不存在,且之后操作无误,则点击注册按钮注册成功返回登录界面;
当输入的密码与确认密码不同时,则弹出提醒对话框,并清空输入框;
当输入框为空,则会弹出提醒对话框;
当点击显示密码、显示确认时,会显示隐藏的内容。
activity_register.xml
RegisterActivity.java
public void register() { EditText editText_username=findViewById(R.id.editText_username);//获取EditText实例 EditText editText_userpassword=findViewById(R.id.editText_userpassword);//获取EditText实例 EditText editText_userpassword_define=findViewById(R.id.editText_userpassword_define);//获取EditText实例 final String username=editText_username.getText().toString().trim();//获取用户输入的用户名 final String userpassword=editText_userpassword.getText().toString().trim();//获取用户输入的密码 if(TextUtils.isEmpty(username)&&!TextUtils.isEmpty(userpassword)) { //弹出提醒对话框,提醒用户用户名不能为空 AlertDialog.Builder builder=new AlertDialog.Builder(RegisterActivity.this); builder.setIcon(R.mipmap.ic_launcher); builder.setTitle("尊敬的用户"); builder.setMessage("用户名不能为空,请输入!"); builder.setPositiveButton("好的",null); AlertDialog alertDialog=builder.create(); alertDialog.show(); //设计AlertDialog提醒对话框大小 WindowManager.LayoutParams layoutParams=alertDialog.getWindow().getAttributes(); layoutParams.width=700; layoutParams.height=565; alertDialog.getWindow().setAttributes(layoutParams);//设置AlertDialog的宽高 editText_username.requestFocus(); }else if (TextUtils.isEmpty(userpassword)&&!TextUtils.isEmpty(username)) { //弹出提醒对话框,提醒用户密码不能为空 AlertDialog.Builder builder=new AlertDialog.Builder(RegisterActivity.this); builder.setIcon(R.mipmap.ic_launcher); builder.setTitle("尊敬的用户"); builder.setMessage("密码不能为空,请输入!"); builder.setPositiveButton("好的",null); AlertDialog alertDialog=builder.create(); alertDialog.show(); //设计AlertDialog提醒对话框大小 WindowManager.LayoutParams layoutParams=alertDialog.getWindow().getAttributes(); layoutParams.width=700; layoutParams.height=565; alertDialog.getWindow().setAttributes(layoutParams);//设置AlertDialog的宽高 editText_userpassword.requestFocus(); }else if(TextUtils.isEmpty(username)&&TextUtils.isEmpty(userpassword)) { AlertDialog.Builder builder=new AlertDialog.Builder(RegisterActivity.this); builder.setIcon(R.mipmap.ic_launcher); builder.setTitle("尊敬的用户"); builder.setMessage("请输入用户名和密码!"); builder.setPositiveButton("好的",null); AlertDialog alertDialog=builder.create(); alertDialog.show(); //设计AlertDialog提醒对话框大小 WindowManager.LayoutParams layoutParams=alertDialog.getWindow().getAttributes(); layoutParams.width=700; layoutParams.height=565; alertDialog.getWindow().setAttributes(layoutParams);//设置AlertDialog的宽高 editText_username.requestFocus(); editText_userpassword.requestFocus(); }else { final User user=new User(); user.setUsername(username); user.setUserpassword(userpassword); new Thread(new Runnable() { @Override public void run() { final int value=userDao.registerUser(user); //这里使用Handler类中常用的一个方法,post(Runnable r),立即发送Runnable对象。这里使用已经创建的android.os.Handler对象 handler.post(new Runnable() { @Override public void run() { //创建一个意图对象,准备跳转到指定的活动页面 Intent intent=new Intent(RegisterActivity.this,LoginActivity.class); //跳转到意图对象指定的活动页面 startActivity(intent); } }); } }).start(); } } //设计读取button按钮点击的功能函数onClick() @RequiresApi(api = Build.VERSION_CODES.N) @Override public void onClick(View v) { if(v.getId()==R.id.button_return_login) { //创建一个意图对象,准备跳转到指定的活动页面 Intent intent=new Intent(this,LoginActivity.class); //跳转到意图对象指定的活动页面 startActivity(intent); } if(v.getId()==R.id.button_register_yes) { EditText editText_username=findViewById(R.id.editText_username);//获取EditText实例 EditText editText_userpassword=findViewById(R.id.editText_userpassword);//获取EditText实例 EditText editText_userpassword_define=findViewById(R.id.editText_userpassword_define);//获取EditText实例 final String username=editText_username.getText().toString().trim();//获取用户输入的用户名 String password1=editText_userpassword.getText().toString(); String password2=editText_userpassword_define.getText().toString(); if(password1.equals(password2)) { //密码和确认密码相同 //这里要以线程访问,否则会报错 new Thread(new Runnable() { @Override public void run() { final User user_name=userDao.findUserName(username); //这里使用Handler类中常用的一个方法,post(Runnable r),立即发送Runnable对象。这里使用已经创建的android.os.Handler对象 handler.post(new Runnable() { @Override public void run() { if(user_name!=null) { //创建提醒对话框的建造器 AlertDialog.Builder builder=new AlertDialog.Builder(RegisterActivity.this); //设计对话框标题图标 builder.setIcon(R.mipmap.ic_launcher); //设置对话框标题文本 builder.setTitle("尊敬的用户"); //设置对话框内容文本 builder.setMessage("您所输入的账号已存在,请重新输入!"); //设置对话框的肯定按钮文本及其点击监听器 builder.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { editText_username.setText("");//清空editText_username内容 editText_userpassword.setText("");//清空editText_userpassword内容 editText_userpassword_define.setText("");//清空editText_userpassword_define内容 } }); AlertDialog alertDialog=builder.create();//根据建造器构建提醒对话框对象 alertDialog.show();//显示提醒对话框 //设计AlertDialog提醒对话框大小 WindowManager.LayoutParams layoutParams=alertDialog.getWindow().getAttributes(); layoutParams.width=700; layoutParams.height=565; alertDialog.getWindow().setAttributes(layoutParams);//设置AlertDialog的宽高 return; }else { register(); } } }); } }).start(); }else { //不同 //创建提醒对话框的建造器 AlertDialog.Builder builder=new AlertDialog.Builder(RegisterActivity.this); //设计对话框标题图标 builder.setIcon(R.mipmap.ic_launcher); //设置对话框标题文本 builder.setTitle("尊敬的用户"); //设置对话框内容文本 builder.setMessage("密码和确认密码不同,请重新输入!"); //设置对话框的肯定按钮文本及其点击监听器 builder.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { editText_userpassword.setText("");//清空editText_userpassword内容 editText_userpassword_define.setText("");//清空editText_userpassword_define内容 } }); AlertDialog alertDialog=builder.create();//根据建造器构建提醒对话框对象 alertDialog.show();//显示提醒对话框 //设计AlertDialog提醒对话框大小 WindowManager.LayoutParams layoutParams=alertDialog.getWindow().getAttributes(); layoutParams.width=700; layoutParams.height=565; alertDialog.getWindow().setAttributes(layoutParams);//设置AlertDialog的宽高 return; } } }
GitHub链接: Android登录注册功能(连接云数据库MySQL)
当某个程序第一次启动的时候,Android会启动一条主线程负责接收用户的输入以及操作结果的反馈,也称UI线程,创建子线程是为了执行一些可能产生阻塞操作而新启动的线程。
这里使用Handler类中的一个常用方法post(Runnable r),立即发送Runnable对象,可以方便地使用Handler来进行消息传递。