这学期安卓开发课程的实验中有一个实现登录功能,我就想使用数据库登录,一开始使用的sql server但最后没有实现,我就改用mysql,一开始使用mysql8.0连接不上,重新安装mysql5.5后成功连接。
先看功能展示:
MainActivity.java
import androidx.appcompat.app.AppCompatActivity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import java.util.Date;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button but_signup;//登录界面注册按钮
private Button but_signin;//登录界面登录按钮
private Button signup_zhuce;//注册界面注册按钮
private EditText textName;//登录界面用户名
private EditText passWord;//登录界面密码
private EditText signup_name;//注册界面的姓名
private EditText id_card;//注册的身份证号
private EditText signup_username;//注册的用户名
private EditText signup_password;//注册的密码
private EditText signup_birthday;//注册用户的生日
private EditText signup_phonenumber;//注册用户的电话
Handler h = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
but_signup = findViewById(R.id.but_Signup);
but_signup.setOnClickListener(MainActivity.this);
but_signin = findViewById(R.id.but_Signin);
but_signin.setOnClickListener(MainActivity.this);
passWord = findViewById(R.id.passWord);
textName = findViewById(R.id.textName);
signup_username = findViewById(R.id.signup_username);
signup_password = findViewById(R.id.signup_password);
signup_name = findViewById(R.id.signup_name);
signup_birthday = findViewById(R.id.signup_birthday);
signup_phonenumber = findViewById(R.id.signup_phonenumber);
id_card = findViewById(R.id.id_card);
SharedPreferences sp = getSharedPreferences("login", Context.MODE_PRIVATE);
textName.setText(sp.getString("username", null));
passWord.setText(sp.getString("password", null));
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.but_Signin:
Log.e("lzx", "登录" );
new Thread(new Runnable() {
@Override
public void run() {
String n = textName.getText().toString().trim();
String psw = passWord.getText().toString().trim();
SharedPreferences sp = getSharedPreferences("login", Context.MODE_PRIVATE);
sp.edit()
.putString("username", textName.getText().toString())
.putString("password", passWord.getText().toString())
.apply();
if(n.equals("")||psw.equals("")){
Looper.prepare();
Toast toast = Toast.makeText(MainActivity.this,"内容不该为空!",Toast.LENGTH_SHORT);
toast.show();
Looper.loop();
}
UserDao ud = new UserDao();
Boolean result = ud.login(n,psw);
Looper.prepare();
Toast toast;
if(!result){
toast = Toast.makeText(MainActivity.this, "用户名不存在或密码错误!", Toast.LENGTH_SHORT);
toast.show();
}else {
toast = Toast.makeText(MainActivity.this, "登录成功!", Toast.LENGTH_SHORT);
toast.show();
Intent intent =new Intent(MainActivity.this,Function.class);
startActivity(intent);
finish();
}
Looper.loop();
}
}).start();
break;
case R.id.but_Signup:
Intent intent = new Intent(MainActivity.this,Test.class);
startActivity(intent);
finish();
Log.e("lzx", "注册" );
break;
}
}
public void Forget(View view) {
Intent intent = new Intent(MainActivity.this,ForgetPassword.class);
startActivity(intent);
finish();
}
}
登录界面xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:orientation="vertical"
tools:context=".MainActivity">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/teal_200"
android:gravity="center_horizontal"
android:text="登录"
android:textSize="40sp"
android:paddingBottom="15dp"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<EditText
android:id="@+id/textName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入用户名"
android:layout_marginLeft="30dp"
android:layout_marginTop="40dp"
android:layout_marginBottom="20dp"
android:layout_marginRight="30dp"
android:ems="20"
android:paddingLeft="20dp"
android:paddingRight="20dp"
android:inputType="textPersonName"
/>
<EditText
android:id="@+id/passWord"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入密码"
android:layout_marginLeft="30dp"
android:layout_marginTop="10dp"
android:layout_marginRight="30dp"
android:paddingLeft="20dp"
android:ems="18"
android:paddingRight="20dp"
android:inputType="textPassword"
/>
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="忘记密码"
android:gravity="right"
android:layout_marginRight="30dp"
android:onClick="Forget"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<Button
android:id="@+id/but_Signin"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="40dp"
android:layout_marginTop="20dp"
android:layout_marginRight="40dp"
android:background="@color/teal_200"
android:text="登 录"
android:textColor="@color/white"
android:textSize="25sp" />
<Button
android:id="@+id/but_Signup"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="40dp"
android:layout_marginRight="40dp"
android:layout_marginTop="20dp"
android:text="注 册"
android:textSize="25sp"
android:textColor="@color/teal_200"
android:background="@color/white"
/>
</LinearLayout>
</LinearLayout>
jdbc连接:
先导入mysql的jdbc包
实现jdbc连接:JdbcUtil.java
import java.sql.Connection;
import java.sql.DriverManager;
public class JdbcUtil {
private static JdbcUtil instance;
public static JdbcUtil getInstance(){
if (instance ==null){
instance = new JdbcUtil();
}
return instance;
}
public static Connection getConnection(String dbName, String name, String password) {
try {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://ip:端口/"+dbName;
return DriverManager.getConnection(url,name,password);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
注册、登录和重置密码功能:
UserDao.java
import android.util.Log;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class UserDao {
JdbcUtil jdbcUtil = JdbcUtil.getInstance();
Connection connection = JdbcUtil.getConnection("数据库名","用户名","密码");
/*
* 注册过程
*
* */
public boolean register(String username,String password,String idcard,String name,String birthday,String phonenumber){
if(connection == null){
Log.e("lzx", "无数据库连接" );
return false;
}else {
String sql ="insert into user(account,password,idcard,name,birthday,phonenumber) values(?,?,?,?,?,?)";
try {
PreparedStatement pre = connection.prepareStatement(sql);
pre.setString(1,username);
pre.setString(2,password);
pre.setString(3,idcard);
pre.setString(4,name);
pre.setString(5,birthday);
pre.setString(6,phonenumber);
return pre.execute();
} catch (SQLException e) {
return false;
}finally {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
//登录过程
public boolean login(String name,String password)
{
if(connection == null){
Log.e("lzx", "无数据库连接" );
return false;
}else {
String sql = "select * from user where account = ? and password = ?";
try {
PreparedStatement pre = connection.prepareStatement(sql);
pre.setString(1,name);
pre.setString(2,password);
ResultSet res = pre.executeQuery();
boolean t = res.next();
return t;
} catch (SQLException e) {
return false;
}
}
}
public boolean select(String username,String userid,String userpn) {
if (connection == null) {
Log.e("lzx", "无数据库连接");
return false;
} else {
String sql = "select * from user where account = ? and idcard = ? and phonenumber = ?";
try {
PreparedStatement pre = connection.prepareStatement(sql);
pre.setString(1, username);
pre.setString(2, userid);
pre.setString(3, userpn);
ResultSet res = pre.executeQuery();
boolean t = res.next();
return t;
} catch (SQLException e) {
return false;
}
}
}
public boolean update(String username,String userid,String userpn,String mima){
if (connection == null){
Log.e("lzx", "无数据库连接");
return false;
}else{
String sql = "update user set password = ? where account = ? and idcard = ? and phonenumber = ? ";
try {
PreparedStatement pre = connection.prepareStatement(sql);
pre.setString(1, mima);
pre.setString(2, username);
pre.setString(3, userid);
pre.setString(4, userpn);
return pre.execute();
} catch (SQLException e) {
return false;
}
}
}
}
注册页面:
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<androidx.appcompat.widget.Toolbar
android:layout_width="match_parent"
android:layout_height="match_parent"
app:title="注册个人信息"
app:navigationIcon="@drawable/ic_baseline_arrow_back_24"
app:titleTextColor="@color/white"
android:background="@color/teal_200"
android:onClick="BackBut"
/>
<EditText
android:id="@+id/signup_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="姓名"
android:layout_marginRight="40dp"
android:layout_marginLeft="40dp"
android:layout_marginTop="40dp"
android:paddingRight="20dp"
android:paddingLeft="20dp"
android:inputType="text"
/>
<EditText
android:id="@+id/id_card"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="身份证号"
android:layout_marginRight="40dp"
android:layout_marginLeft="40dp"
android:layout_marginTop="40dp"
android:paddingRight="20dp"
android:paddingLeft="20dp"
android:inputType="number"
android:digits="0123456789xX"
/>
<EditText
android:id="@+id/signup_username"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="用户名"
android:layout_marginRight="40dp"
android:layout_marginLeft="40dp"
android:layout_marginTop="40dp"
android:paddingRight="20dp"
android:paddingLeft="20dp"
android:inputType="textPersonName"
/>
<EditText
android:id="@+id/signup_password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="密码"
android:layout_marginRight="40dp"
android:layout_marginLeft="40dp"
android:layout_marginTop="40dp"
android:paddingRight="20dp"
android:paddingLeft="20dp"
android:inputType="text"
/>
<EditText
android:id="@+id/signup_birthday"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="生日"
android:layout_marginRight="40dp"
android:layout_marginLeft="40dp"
android:layout_marginTop="40dp"
android:paddingRight="20dp"
android:paddingLeft="20dp"
android:inputType="datetime"
/>
<EditText
android:id="@+id/signup_phonenumber"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="手机号"
android:layout_marginRight="40dp"
android:layout_marginLeft="40dp"
android:layout_marginTop="40dp"
android:paddingRight="20dp"
android:paddingLeft="20dp"
android:inputType="phone"
/>
<Button
android:id="@+id/signup_zhuce"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="40dp"
android:layout_marginTop="30dp"
android:layout_marginRight="40dp"
android:layout_marginBottom="40dp"
android:background="#F6F6F6"
android:gravity="center"
android:text="注册"
android:onClick="onSignupClick"
android:textColor="@color/teal_200"
android:textSize="30sp" />
</LinearLayout>
</ScrollView>
import android.content.Intent;
import android.os.Bundle;
import android.os.Looper;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
public class Test extends AppCompatActivity {
private Button signup_zhuce;
private EditText signup_name;//注册界面的姓名
private EditText id_card;//注册的身份证号
private EditText signup_username;//注册的用户名
private EditText signup_password;//注册的密码
private EditText signup_birthday;//注册用户的生日
private EditText signup_phonenumber;//注册用户的电话
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.logup_item);
signup_username = findViewById(R.id.signup_username);
signup_password = findViewById(R.id.signup_password);
signup_name = findViewById(R.id.signup_name);
signup_birthday = findViewById(R.id.signup_birthday);
signup_phonenumber = findViewById(R.id.signup_phonenumber);
id_card = findViewById(R.id.id_card);
signup_zhuce = findViewById(R.id.signup_zhuce);
}
public void onSignupClick(View view) {
new Thread(new Runnable() {
@Override
public void run() {
String un = signup_username.getText().toString().trim();//username
String psw = signup_password.getText().toString().trim();
String n = signup_name.getText().toString().trim();
String bir = signup_birthday.getText().toString().trim();
String pn = signup_phonenumber.getText().toString().trim();//phonenumber
String id = id_card.getText().toString().trim();
if(un.equals("")||psw.equals("")||n.equals("")||bir.equals("")||pn.equals("")||id.equals("")){
Looper.prepare();
Toast toast = Toast.makeText(Test.this,"所有内容都不能为空!",Toast.LENGTH_SHORT);
toast.show();
Looper.loop();
}
UserDao ud = new UserDao();
ud.register(un,psw,id,n,bir,pn);
Looper.prepare();
Toast toast1 = Toast.makeText(Test.this,"注册成功",Toast.LENGTH_SHORT);
toast1.show();
Intent intent = new Intent(Test.this,MainActivity.class);
startActivity(intent);
finish();
Looper.loop();
}
}).start();
Log.e("lzx", "注册成功" );
}
public void BackBut(View view) {
Intent intent = new Intent(Test.this,MainActivity.class);
startActivity(intent);
finish();
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_BACK){
Intent intent = new Intent(Test.this,MainActivity.class);
startActivity(intent);
finish();
return true;
}
return super.onKeyDown(keyCode, event);
}
}
重置密码界面:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical">
<androidx.appcompat.widget.Toolbar
app:navigationIcon="@drawable/ic_baseline_arrow_back_24"
android:onClick="ForgetBack"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:title="重置密码"
app:titleTextColor="@color/white"
android:background="@color/teal_700"
tools:ignore="MissingConstraints" />
<EditText
android:id="@+id/zhanghao"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入账号"
android:layout_marginLeft="30dp"
android:layout_marginTop="30dp"
android:layout_marginRight="30dp"
android:paddingLeft="20dp"
android:paddingRight="20dp"
android:inputType="textPersonName"
/>
<EditText
android:id="@+id/shenfen"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入身份证号"
android:layout_marginLeft="30dp"
android:layout_marginTop="30dp"
android:layout_marginRight="30dp"
android:paddingLeft="20dp"
android:paddingRight="20dp"
android:inputType="number"
/>
<EditText
android:id="@+id/shoujihao"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入您的手机号"
android:layout_marginLeft="30dp"
android:layout_marginTop="30dp"
android:layout_marginRight="30dp"
android:paddingLeft="20dp"
android:paddingRight="20dp"
android:inputType="number"
/>
<EditText
android:id="@+id/mima"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入您修改的密码"
android:layout_marginLeft="30dp"
android:layout_marginTop="30dp"
android:layout_marginRight="30dp"
android:paddingLeft="20dp"
android:paddingRight="20dp"
android:inputType="text"
/>
<Button
android:onClick="Changepsw"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:layout_marginRight="30dp"
android:layout_marginLeft="30dp"
android:background="@color/white"
android:text="确认修改"
android:textSize="30sp"
android:textColor="@color/teal_700"/>
</LinearLayout>
import android.content.Intent;
import android.os.Bundle;
import android.os.Looper;
import android.view.KeyEvent;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
public class ForgetPassword extends AppCompatActivity {
EditText zhanghao;
EditText shenfen;
EditText shoujihao;
EditText mima;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.forgetpassword_item);
zhanghao = findViewById(R.id.zhanghao);
shenfen = findViewById(R.id.shenfen);
shoujihao = findViewById(R.id.shoujihao);
mima = findViewById(R.id.mima);
}
public void ForgetBack(View view) {
Intent intent = new Intent(ForgetPassword.this,MainActivity.class);
startActivity(intent);
finish();
}
public void Changepsw(View view) {
new Thread(new Runnable() {
@Override
public void run() {
String zh = zhanghao.getText().toString().trim();//username
String sf= shenfen.getText().toString().trim();
String sjh = shoujihao.getText().toString().trim();
String mm = mima.getText().toString().trim();//phonenumber
if(zh.equals("")||sf.equals("")||sjh.equals("")){
Looper.prepare();
Toast toast = Toast.makeText(ForgetPassword.this,"所有内容都不能为空!",Toast.LENGTH_SHORT);
toast.show();
Looper.loop();
}
UserDao ud = new UserDao();
Boolean result = ud.select(zh,sf,sjh);
Looper.prepare();
if(result) {
ud.update(zh,sf,sjh,mm);
Toast toast = Toast.makeText(ForgetPassword.this, "更新成功!", Toast.LENGTH_SHORT);
toast.show();
Intent intent = new Intent(ForgetPassword.this, MainActivity.class);
startActivity(intent);
finish();
Looper.loop();
}else{
Toast toast = Toast.makeText(ForgetPassword.this,"更新失败!信息填写错误!",Toast.LENGTH_SHORT);
toast.show();
Looper.loop();
}
}
}).start();
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_BACK){
Intent intent = new Intent(ForgetPassword.this,MainActivity.class);
startActivity(intent);
finish();
return true;
}
return super.onKeyDown(keyCode, event);
}
}
从登录界面跳转到注册界面和重置密码界面都会结束一个Activity的生命周期,任何写一个toolbar进行返回和对返回键进行监听,如果按下就跳转回登录界面。
AndroidManifest.xml里记得添加:
获得网络权限
<uses-permission android:name="android.permission.INTERNET" />
最后登录功能完成,本人能力有限,大多为网络上教程整合,如有错误请指正,欢迎大家一起交流分享。