Java 在Android中使用JDBC优化mysql数据库执行

Java 在Android中使用JDBC优化mysql数据库执行,java,android,mysql,jdbc,android-asynctask,Java,Android,Mysql,Jdbc,Android Asynctask,我在android中有一些代码,它正在运行一个对我在线托管的数据库的查询。 我在这个活动中使用了AsyncTask来执行DB操作,同样,我还有其他活动,它们也有类似的代码和连接过程。我想知道这是否是在android中使用JDBC连接连接mysql db的最佳方式,或者这是否可以改进 在MainActivity类中,登录代码大约需要3秒钟 public class MainActivity extends AppCompatActivity { private ProgressDialog mP

我在android中有一些代码,它正在运行一个对我在线托管的数据库的查询。 我在这个活动中使用了AsyncTask来执行DB操作,同样,我还有其他活动,它们也有类似的代码和连接过程。我想知道这是否是在android中使用JDBC连接连接mysql db的最佳方式,或者这是否可以改进

在MainActivity类中,登录代码大约需要3秒钟

public class MainActivity extends AppCompatActivity {

private ProgressDialog mProgress;
final int REQUEST_PERMISSION_CODE = 1000;

private static final String url = "jdbc:mysql://192.168.0.103/pos";
private static final String user = "root";
private static final String pass = "";
private EditText mPassword, mUsername;
private Button loginBtn;
private ProgressBar mLoginProgress;
private TextView mLoginFeedbackText;
String password, username;
ProgressDialog progressDialog;
Boolean CheckEditText;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);

    if (!checkPermissionFromDevice())
        requestPermission();

    mPassword = findViewById(R.id.password);
    mUsername = findViewById(R.id.username);
    loginBtn = findViewById(R.id.generate_btn);
    mLoginProgress = findViewById(R.id.login_progress_bar);
    mLoginFeedbackText = findViewById(R.id.login_form_feedback);
    mProgress = new ProgressDialog(this);
    
    loginBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            CheckEditTextIsEmptyOrNot();
            if (CheckEditText) {
                UserLoginFunction(username, password);
            } else {
                Toast.makeText(MainActivity.this, "Please fill all form fields.", Toast.LENGTH_LONG).show();
            }
        }
    });
}

public void CheckEditTextIsEmptyOrNot() {
    username = mUsername.getText().toString();
    password = mPassword.getText().toString();
    if (TextUtils.isEmpty(username) || TextUtils.isEmpty(password)) {
        CheckEditText = false;
    } else {
        CheckEditText = true;
    }
}

private void requestPermission() {
    ActivityCompat.requestPermissions(this, new String[]{
            Manifest.permission.WRITE_EXTERNAL_STORAGE,
            Manifest.permission.RECORD_AUDIO
    }, REQUEST_PERMISSION_CODE);
}

private boolean checkPermissionFromDevice() {
    int write_external_storage_result = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
    int record_audio_result = ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO);
    return write_external_storage_result == PackageManager.PERMISSION_GRANTED &&
            record_audio_result == PackageManager.PERMISSION_GRANTED;
}
public void UserLoginFunction(final String username, final String password) {
    class UserLoginClass extends AsyncTask<String, Void, String> {
        @Override
        protected void onPreExecute() {
            System.out.println("In onPreExecute");
            super.onPreExecute();

            progressDialog = ProgressDialog.show(MainActivity.this, "Loading Data", null, true, true);
        }

        @Override
        protected void onPostExecute(String httpResponseMsg) {
            System.out.println("In onPostExecute");
            super.onPostExecute(httpResponseMsg);

            progressDialog.dismiss();

            if (httpResponseMsg.equalsIgnoreCase("It matches")) {

                finish();

                Intent intent = new Intent(MainActivity.this, StartActivity.class);
                System.out.println("USERNAME" + username);
                intent.putExtra("USERNAME", username);
                startActivity(intent);

            } else {
                mLoginFeedbackText.setText("Verification Failed, please try again.");
                mLoginFeedbackText.setVisibility(View.VISIBLE);
                mLoginProgress.setVisibility(View.INVISIBLE);
                loginBtn.setEnabled(true);
                Toast.makeText(MainActivity.this, httpResponseMsg, Toast.LENGTH_LONG).show();
            }

        }

        @Override
        protected String doInBackground(String... params) {
            System.out.println("In doInBackground");
            try {
                StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
                StrictMode.setThreadPolicy(policy);

                Class.forName("com.mysql.jdbc.Driver");
                Connection con = DriverManager.getConnection(url, user, pass);

                Statement st = con.createStatement();
                ResultSet rs = st.executeQuery("SELECT * FROM `users` WHERE username='BobMartin'");


                while (rs.next()) {
                    String queryPassword = rs.getString("password");
                    String hash_php = queryPassword.replaceFirst("2y", "2a");
                    if (BCrypt.checkpw(password, hash_php)) {
                        con.close();
                        System.out.println("It matches");
                        return "It matches";
                    } else {
                        System.out.println("It does not match");
                        return "It does not match";
                    }
                }
            } catch (ClassNotFoundException | SQLException e) {
                e.printStackTrace();
                System.out.println("result in catch");
            }
            return "It does not match";
        }
    }
    UserLoginClass userLoginClass = new UserLoginClass();
    userLoginClass.execute(username, password);
}


}
public类MainActivity扩展了AppCompatActivity{
私人进程;
最终int请求\许可\代码=1000;
私有静态最终字符串url=“jdbc:mysql://192.168.0.103/pos";
私有静态最终字符串user=“root”;
私有静态最终字符串传递=”;
私人编辑文本mPassword,mUsername;
私人按钮登录;
私人ProgressBar mLoginProgress;
私有文本视图mLoginFeedbackText;
字符串密码,用户名;
进行对话进行对话;
布尔校验文本;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u登录);
如果(!checkPermissionFromDevice())
requestPermission();
mPassword=findviewbyd(R.id.password);
mUsername=findViewById(R.id.username);
loginBtn=findviewbyd(R.id.generate\u btn);
mLoginProgress=findviewbyd(R.id.login\u progress\u bar);
mLoginFeedbackText=findviewbyd(R.id.login\u form\u feedback);
mpprogress=新建进度对话框(此对话框);
loginBtn.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
CheckEditTextIsEmptyOrNot();
如果(检查编辑文本){
UserLoginFunction(用户名、密码);
}否则{
Toast.makeText(MainActivity.this,“请填写所有表单字段”,Toast.LENGTH_LONG.show();
}
}
});
}
公共无效CheckEditTextIsEmptyOrNot(){
username=mUsername.getText().toString();
password=mPassword.getText().toString();
if(TextUtils.isEmpty(用户名)| | TextUtils.isEmpty(密码)){
CheckEditText=false;
}否则{
CheckEditText=true;
}
}
私有void requestPermission(){
ActivityCompat.requestPermissions(此,新字符串[]){
Manifest.permission.WRITE\u外部存储,
Manifest.permission.RECORD\u音频
},请求\许可\代码);
}
私有布尔checkPermissionFromDevice(){
int write_external_storage_result=ContextCompat.checkSelfPermission(这是Manifest.permission.write_external_storage);
int record\u audio\u result=ContextCompat.checkSelfPermission(这是Manifest.permission.record\u audio);
返回write_external_storage_result==PackageManager.PERMISSION_&&
record_audio_result==PackageManager.PERMISSION_已授予;
}
public void userlogin函数(最终字符串用户名、最终字符串密码){
类UserLoginClass扩展了AsyncTask{
@凌驾
受保护的void onPreExecute(){
System.out.println(“In-onPreExecute”);
super.onPreExecute();
progressDialog=progressDialog.show(MainActivity.this,“加载数据”,null、true、true);
}
@凌驾
受保护的void onPostExecute(字符串httpResponseMsg){
System.out.println(“In-onPostExecute”);
super.onPostExecute(httpResponseMsg);
progressDialog.disclose();
if(httpResponseMsg.equalsIgnoreCase(“它匹配”)){
完成();
意向意向=新意向(MainActivity.this、StartActivity.class);
System.out.println(“用户名”+用户名);
intent.putExtra(“用户名”,用户名);
星触觉(意向);
}否则{
mLoginFeedbackText.setText(“验证失败,请重试”);
mLoginFeedbackText.setVisibility(View.VISIBLE);
mLoginProgress.setVisibility(View.INVISIBLE);
loginBtn.setEnabled(真);
Toast.makeText(MainActivity.this,httpResponseMsg,Toast.LENGTH_LONG).show();
}
}
@凌驾
受保护的字符串doInBackground(字符串…参数){
System.out.println(“In-doInBackground”);
试一试{
StrictMode.ThreadPolicy policy=新建StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(策略);
Class.forName(“com.mysql.jdbc.Driver”);
Connection con=DriverManager.getConnection(url、用户、通行证);
语句st=con.createStatement();
结果集rs=st.executeQuery(“从'users'中选择*,其中username='BobMartin'”);
while(rs.next()){
字符串queryPassword=rs.getString(“密码”);
字符串hash_php=queryPassword.replaceFirst(“2y”,“2a”);
if(BCrypt.checkpw(密码,hash_php)){
con.close();
System.out.println(“它匹配”);
返回“它匹配”;
}否则{
System.out.println(“它不匹配”);
返回“它不匹配”;
}
}
}catch(ClassNotFoundException | SQLException e){
e、 printStackTrace();
System.out.println(“导致捕获”);
}
返回“它不匹配”;
}
}
UserLoginClass UserLoginClass=新的UserLoginClass();
userLoginClass.execute(用户名、密码);
}
}
同样,对于其他活动,我也会再次创建连接,并以类似的方式关闭它们,如图所示

public class StartActivity extends AppCompatActivity {
Button startButton;
String userName;
private static final String url = "jdbc:mysql://192.168.0.103/pos";
private static final String user = "root";
private static final String pass = "";

ArrayList<String> dbQuestions = new ArrayList<String>();
ArrayList<String> dbAnswers = new ArrayList<String>();

ProgressDialog progressDialog;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    userName = getIntent().getStringExtra("USERNAME");
    new StartDb().execute();

    startButton = findViewById(R.id.startButton);
    startButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            System.out.println("USERNAMEstart" + userName);
            Intent intent = new Intent(StartActivity.this, BillActivity.class);
            Bundle args = new Bundle();
            args.putSerializable("ANSWERS", (Serializable) dbAnswers);
            args.putSerializable("QUESTIONS", (Serializable) dbQuestions);
            intent.putExtra("USERNAME", userName);
            intent.putExtra("BUNDLE", args);
            startActivity(intent);
        }
    });
}

@Override
public void onBackPressed() {
    // super.onBackPressed();
    Toast.makeText(StartActivity.this, "There is no back action", Toast.LENGTH_LONG).show();
    return;
}

class StartDb extends AsyncTask<String, Void, String> {

    @Override
    protected void onPreExecute() {
        System.out.println("In onPreExecute");
        super.onPreExecute();

        progressDialog = ProgressDialog.show(StartActivity.this, "Loading Data", null, true, true);
    }

    @Override
    protected void onPostExecute(String httpResponseMsg) {
        System.out.println("In onPostExecute");
        super.onPostExecute(httpResponseMsg);
        progressDialog.dismiss();
    }

    @Override
    protected String doInBackground(String... params) {
        System.out.println("In doInBackground");
        try {
            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
            StrictMode.setThreadPolicy(policy);

            Class.forName("com.mysql.jdbc.Driver");
            Connection con = DriverManager.getConnection(url, user, pass);

            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery("SELECT * FROM `company_details`");

            while (rs.next()) {

                String que = rs.getString("questions");
                JSONObject obj1 = new JSONObject(que);
                for (Iterator<String> it = obj1.keys(); it.hasNext(); ) {
                    String key = it.next();
                    dbQuestions.add(obj1.getString(key));
                }

                String ans = rs.getString("answers");
                JSONObject obj2 = new JSONObject(ans);
                for (Iterator<String> it = obj2.keys(); it.hasNext(); ) {
                    String key = it.next();
                    dbAnswers.add(obj2.getString(key));
                }

                con.close();
            }
        } catch (ClassNotFoundException | SQLException | JSONException e) {
            e.printStackTrace();
            System.out.println("resilt in catch");
        }
        return "It does not match";
    }
}

}
公共类StartActivity扩展了AppCompative活动{
按钮开始按钮;
字符串用户名;
私有静态最终字符串url=“jdbc:mysql://