客户端连接本地服务器,将数据存储进Mysql,实现客户端与服务器的交互。

本博客由一位小白所写,故所有的代码,开源框架都会以萌新的角度讲解,如果有任何的错误,欢迎指正,共同进步。
本博客目的:

  1. 实现安卓客户端与本地服务器的数据发送与接收,实现交互。
  2. 实现本地服务器与Mysql数据库的连接,与数据存储。

小白说明:
1.安卓sdk已经自带了SQLite数据库,很多本地数据都可以直接存储于这个轻量级数据库,并且有许多优秀的开源框架,如greenDao等。但是,一个非单机的安卓应用是不可能将核心数据存储于本地的,更不可能让客户端直接与数据库相连接。 一般客户端是和服务器打交道, 客户端发出请求,服务器响应请求,经过三次握手,开始进行数据交互,而数据库的操作也大部分由服务器连接完成。
就好比你去餐厅吃饭, 厨师会从冰箱把食物拿出,加工后呈上来给你。这个情景中, 你就等于客户端, 厨师相当于服务器, 冰箱就是数据库。
2.本地服务器可以实现局域网下,客户端与服务器,客户端与客户端的交互。如果 使用云服务器,比如 阿里云,腾讯云,华为云等,就可以将你服务器搭建于此,根据公网ip进行广域网网络的访问(就是打开移动数据,在全国各地都能使用你的应用)。对于云服务器的搭建,小白还在学习中,期待尽快实现,搭云服务器遇到太多坑了,哭了。

正文:
准备工具:
1.Myeclipse(用于搭建本地服务器,也可以eclipse-ee)
2.Tomcat服务器(就几M,网上有)
3. jdk
4. mysql数据库(为甚么 不是Oracle呢?因为这个免费)
5. navicat数据库视觉显示(好东西,就不用使用命令行查看黑白)
6. AndroidStudio安卓开发ide(这个就是废话了,嚯嚯)
准备开源库:
1.Okhttp
2.struts

对于工具如何安装,我就不多说了,网上有很多很多资料的,struts库的使用:

android 数据库 框架 对比 安卓与数据库交互_mysql


当所有软件安装完成后,我们就可以开始咯。

—————————————————————————

客户端(AndroidStudio):

1.添加网络权限:

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

2. xml文件,2个EditText,1个Button, 1个Textview.

android 数据库 框架 对比 安卓与数据库交互_http_02

<?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=".LinktoServerActivity">
    <EditText
        android:layout_weight="2"
        android:id="@+id/usenameer"
        android:hint="账号"
        android:layout_width="match_parent"
        android:layout_height="0dp" />
    <EditText
        android:layout_weight="2"
        android:id="@+id/passworder"
        android:hint="密码"
        android:inputType="numberPassword"
        android:layout_width="match_parent"
        android:layout_height="0dp" />
    <Button
        android:layout_gravity="center"
        android:id="@+id/dengluButton"
        android:text="登录"
        android:layout_width="80dp"
        android:layout_height="50dp" />
    <TextView
        android:id="@+id/xianshi"
        android:textSize="25dp"
        android:text="吧唧吧唧"
        android:layout_weight="1"
        android:gravity="center"
        android:layout_width="match_parent"
        android:layout_height="0dp" />
    <LinearLayout
        android:layout_weight="4"
        android:layout_width="match_parent"
        android:layout_height="0dp"></LinearLayout>
</LinearLayout>
  1. Activity.java文件
package com.ilikelxystill.fuxi;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import com.ilikelxystill.fuxi.constant_package.Constant_name;

import java.io.IOException;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttp;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class LinktoServerActivity extends AppCompatActivity {
    private EditText usenameer,passworder;
    private TextView xianshi;
    private Button dengluButton;
    private Constant_name constant_name;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_linkto_server);
        init();
        constant_name = new Constant_name();

        LinkServerer();
    }

    public void init(){
        usenameer =(EditText)findViewById(R.id.usenameer);
        passworder =(EditText)findViewById(R.id.passworder);
        xianshi = (TextView)findViewById(R.id.xianshi);
        dengluButton =(Button)findViewById(R.id.dengluButton);

    }

    //连接服务器
    public void LinkServerer(){
         dengluButton.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {

                 //获取输入的数据
                 String getusenameer = usenameer.getText().toString();
                 String getpassworder = passworder.getText().toString();

                //建立客户端
                 OkHttpClient okHttpClient = new OkHttpClient();
                 //实例化请求构造器
                 Request.Builder builder = new Request.Builder();
                 Log.i("haha",constant_name.getUrlInMyCompter()+constant_name.getProjectname()+"Login?usename="+getusenameer+"&password="+getpassworder);
                 //构造器使用get方式绑定 url
                 Request request = builder.get().url(constant_name.getUrlInMyCompter()+constant_name.getProjectname()+"Login?usename="+getusenameer+"&password="+getpassworder).build();
                 //建立Call
                 Call call = okHttpClient.newCall(request);

                  call.enqueue(new Callback() {
                     @Override
                     public void onFailure(Call call, IOException e) {
                           Log.i("baba","shibai!!!!!!!!!!!!");
                     }

                     @Override
                     public void onResponse(Call call, Response response) throws IOException {
                         final String StrGetFromServer = response.body().string();
                         xianshi.post(new Runnable() {
                             @Override
                             public void run() {
                                 xianshi.setText(StrGetFromServer);
                             }
                         });

                     }
                 });
                 usenameer.setText("");
                 passworder.setText("");


             }
         });



    }
}

4.新建一个包,constant_package

Constant_name.java

android 数据库 框架 对比 安卓与数据库交互_java_03

package com.ilikelxystill.fuxi.constant_package;

public class Constant_name {
    //电脑的主机地址,以及端口号,一般是8080
    private   String UrlInMyCompter = "http://192.168.3.6:8888/";
    //服务器项目名
    private  String Projectname = "FuxiServer/";
    public String getUrlInMyCompter() {
        return UrlInMyCompter;
    }
    public String getProjectname() {
        return Projectname;
    }


}

—————————————————————————

Myeclipse

服务器项目名:FuxiServer

android 数据库 框架 对比 安卓与数据库交互_java_04


struts.xml

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
        "http://struts.apache.org/dtds/struts-2.5.dtd">


<struts>
   
      <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
    <constant name="struts.devMode" value="true"></constant>
    <package name="default" namespace="/" extends="struts-default">
       <!-- 在浏览器敲路径名/denglu,会找到class这个类,的denglu方法 -->
      <action name="Login" class="com.ilikexy.UserAction" method="index"></action>
    </package>
</struts>

UserAction.java

package com.ilikexy;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;
//新建一个类,继承 ActionSupport
public class UserAction extends ActionSupport{
    /**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private String usename;
    private String password;
    public String index() throws IOException, SQLException, Exception{
    	System.out.println("账号:"+getUsename()+"\n"+"密码:"+getPassword());
    	
    	 //返回给客户端的信息
    	
    	HttpServletResponse response = ServletActionContext.getResponse();
    	response.setContentType("text/html;charset=utf-8");
    	//转化为写入
    	PrintWriter  writer = response.getWriter();
    
    	//将其写入数据库,当账号和密码都不为空时
    	if((!getUsename().equals(""))&&(!getPassword().equals(""))){
    		
    		Class.forName("com.mysql.cj.jdbc.Driver");
    	   //原生的Sql语句,向表中插入usename,和 password
    		String sql = "insert into fuxiRegister values('"+getUsename()+"','"+getPassword()+"')";
    	  //连接数据库路径,数据库名为firstdatabase
    		String linktodatabase = "jdbc:mysql://localhost:3306/firstdatabase?useSSL=false&serverTimezone=UTC";
    	  //建立数据库的连接
			Connection con = DriverManager.getConnection(linktodatabase,"root","123456");
		  //执行sql语句
			PreparedStatement prt = con.prepareStatement(sql);
		    prt.execute();
		    //存入成功返回给客户端信息
		  //写入信息
	    	writer.write("login successful !!!!");
	    	
    		
    	}else{
    		//写入信息
        	writer.write("login Fail !!!!");
    		
    	}	
    	return null;
    }
    
    
	public String getUsename() {
		return usename;
	}
	public void setUsename(String usename) {
		this.usename = usename;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
       
}

navicat

android 数据库 框架 对比 安卓与数据库交互_http_05


android 数据库 框架 对比 安卓与数据库交互_android 数据库 框架 对比_06


android 数据库 框架 对比 安卓与数据库交互_android_07


android 数据库 框架 对比 安卓与数据库交互_java_08


有任何问题,错误,欢迎指正