Android通过JDBC访问远程mysql数据库中的数据实例(在虚拟机上跑),以及phpMyAdmin数据库的编码问题

引言

上一次,本帅已经带大家学习了JDBC的工具类,以及JDBC的增删改查操作,这一次,本帅将带着大家,在Android的虚拟机上跑起来JDBC的实例。同时,本帅还会在这次博客中记录本帅在使用phpMyAdmin中所遇到的一个大坑,phpMyAdmin的数据库的编码问题(插入不了中文的解决办法),大家准备好头发了吗,让我们一起从乌黑浓密好头发到清朝皇家阿哥头的进阶之路上进击吧!

前面没学会的小伙伴们,点击下方的传送门(传送门排名分先后)

JDBC的准备工作:搭建本地服务器,创建可远程访问数据库权限的用户

传送门1:利用wampserver集成环境打造局域网本地服务器
传送门2:创建mysql可远程访问数据库权限的用户

JDBC的连接与使用

传送门3:Android通过JDBC访问wampserver搭建的本地服务器下用PHPMyadmin创建数据库,实现远程的数据的增删改查
传送门4:JDBC增删改查操作以及JDBCUtil封装工具类

好的,有了这些基础之后,咱们就能通过这些来在Android 虚拟机上来访问MySQL数据库啦!

具体操作:

首先,我们需要在数据库中创建数据库和表(大家可以自己创建库和表,如果不会修改后面的url,建议跟我保持一致)

在这里插入图片描述
接着,我们需要创建user表对应的实体类,userDB,并为其设置构造方法和getteer,setter方法,具体代码如下:

package com.example.paoduantui.JDBC.JDBCDB;


//数据库user表的实体类
public class UserDB {

    private int id;//id
    private String username;//用户名
    private String password;//密码
    private  int image;//头像

    public UserDB() {
    }


    //构造函数以及其getter setter 方法

    public UserDB(int id, String username, String password, int image) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.image = image;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public int getImage() {
        return image;
    }

    public void setImage(int image) {
        this.image = image;
    }
    }

有了数据库表user对应的实体类,接下来我们要为其创建一个数据库表user的增删改查操作类UserDBDao类,具体代码如下:

package com.example.paoduantui.JDBC.JDBCDAO;

import android.widget.Switch;

import com.example.paoduantui.JDBC.JDBCDB.UserDB;
import com.example.paoduantui.JDBC.JDBCUtil;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;


//user表的数据库操作类
/**
 * 里面的方法全为静态方法,用 UserDBDao.方法名 直接调用
 * insert方法(增),deleteById方法(删),updateById方法(改),(参数均为UserDB)
 * getAll(返回为UserDB的链表集合)(无参数)以及getById(返回为UserDB的链表集合)(_id ,type)(查)
 * */
public class UserDBDao {

    private static  final Connection  connection = com.example.paoduantui.JDBC.JDBCUtil.getConnection();//获取连接(跑断腿App的连接)
    private static  PreparedStatement ps;//准备好的sql陈述
    private  static ResultSet rs;//结果集

    //增
    /**
     * 返回int类型的insert数据库操作
     * 参数为UserDB
     * */
    public static int insert(UserDB userDB){

        try {


            String sql = "insert into user(username,password,image) values (?,?,?)";
            ps = connection.prepareStatement(sql);
            ps.setObject(1,userDB.getUsername());
            ps.setObject(2,userDB.getPassword());
            ps.setObject(3,userDB.getImage());
            int result = ps.executeUpdate();
            return result;
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JDBCUtil.close(null,ps,connection);
        }

        return 0;
    }

    //删
    /**
     * 返回int类型的deleteById数据库操作
     * 参数为UserDB
     * */
    public static int deleteById(UserDB userDB){

        try {
            String sql = "delete from user where id = ?";
            ps = connection.prepareStatement(sql);
            ps.setObject(1,userDB.getId());
            int result = ps.executeUpdate();
            return result;
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JDBCUtil.close(null,ps,connection);
        }

        return 0;
    }

    /**
     * 返回int类型的updateById数据库操作
     * 参数为UserDB
     * */
    public static int updateById(UserDB userDB){

        try {
            String sql = "update  user set username = ? , password = ? , image = ? where id = ?";
            ps = connection.prepareStatement(sql);
            ps.setObject(1,userDB.getId());
            int result = ps.executeUpdate();
            return result;
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JDBCUtil.close(null,ps,connection);
        }

        return 0;
    }

    /**
     * 返回List<UserDB>类型的获取表中所有数据的数据库操作
     * */
    public static List<UserDB> getAll(){

        List<UserDB> list = new ArrayList<>();

        try {
            String sql = "select * from user ";
            ps = connection.prepareStatement(sql);
            rs = ps.executeQuery();
            while (rs.next()){
                int id = rs.getInt(1);
                String username = rs.getString(2);
                String password = rs.getString(3);
                int image = rs.getInt(4);
                UserDB userDB = new UserDB(id,username,password,image);
                list.add(userDB);
            }
            return  list;
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JDBCUtil.close(rs,ps,connection);
        }
        return  null;
    }

    /**
     * 返回List<UserDB>类型的根据不同id的类型获取表中数据的数据库操作
     * 其中参数_id 表示id的值,type表示id的类型 0:id(用户id),1:taskid(任务id),2:jdr_id(接单人id)
     * */
    public static List<UserDB> getById(int _id,int type){


        String selection = null;
        List<UserDB> list = new ArrayList<>();

        switch (type){
            case  0:
                selection = "id";
                break;
            case  1:
                selection="taskid";
                break;
            case  2:
                selection="jdr_id";
                break;
        }

        try {
            String sql = "select * from user where "+ selection + "= ? ";//通过拼接的sql来查询不同id下的数据
            ps = connection.prepareStatement(sql);
            ps.setObject(1,_id);
            ResultSet rs = ps.executeQuery();
            while (rs.next()){//注意,此处的结果集不同于sqlite的游标集,下标是从1开始的
                int id = rs.getInt(1);
                String username = rs.getString(2);
                String password = rs.getString(3);
                int image = rs.getInt(4);
                UserDB userDB = new UserDB(id,username,password,image);
                list.add(userDB);
            }
            return  list;
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JDBCUtil.close(rs,ps,connection);
        }
        return  null;
    }

}

接下来,我们对这个Dao类进行测试,看看有没有问题:

package com.example.paoduantui.JDBC.testJDBC;


import com.example.paoduantui.JDBC.JDBCDAO.UserDBDao;
import com.example.paoduantui.JDBC.JDBCDB.UserDB;

import java.util.List;

//测试JDBCDao类
public class testJDBCDao {

       public static void main(String[] args){

           List<UserDB> list = UserDBDao.getById(1,0);
           for(int i= 0;i<list.size();i++){
               System.out.println(list.get(i).getId()+list.get(i).getUsername());
           }
       }

}

这里用的是Dao方法中的getById,输出结果应该是1张大帅比,我们运行测试。

在这里插入图片描述
可以在Android stutdio 的控制台上看到我们预估的输出结果,至此Dao方法测试成功。

main方法(java程序的入口)中可以进行,接下来,我们需要在Activity(MainActivity为界面的入口)中实现对JDBC连接和访问。

首先我们新建一个Activity,用一个textview来显示我们查找到的内容,由于数据库的查找过程是个耗时操作,我们需要另开一个线程来进行访问数据库。具体代码如下:

package com.example.paoduantui.JDBC.testJDBC;

import android.os.StrictMode;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;

import com.example.paoduantui.JDBC.JDBCDAO.UserDBDao;
import com.example.paoduantui.JDBC.JDBCDB.UserDB;
import com.example.paoduantui.R;

import java.util.List;

public class testJDBCActivity extends AppCompatActivity {

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


        final TextView textView = findViewById(R.id.textView);
         //添加许可协议,不加的话,闪退
            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
            StrictMode.setThreadPolicy(policy);
            //开启新线程,连接JDBC,防止主线程阻塞
            Runnable runnable = new Runnable() {
                @Override
                public void run() {

                    String str="";
                    List<UserDB> list = UserDBDao.getById(1, 0);
                    for (int i = 0; i < list.size(); i++) {
                        str += list.get(i).getId() + list.get(i).getUsername();
                    }
                    //Toast.makeText(testJDBCActivity.this, str, Toast.LENGTH_LONG).show();
                    textView.setText(str);

                }
            };
            runnable.run();

        }
}

//添加许可协议,不加的话,闪退
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
这两条代码,本帅也不知道是什么,有大神知道的话,可以在下方留言告诉我,本帅在此谢过了!

好了,现在我们来运行一下。

在这里插入图片描述

可以看到报错了,查看日志,可以发现,是网络权限的问题,因为Android 的访问数据库需要网络权限,咱们给加上。

打开此项目的AndroidMainfest.xml ,加上网络权限

<!-- 加上网络访问权限 -->
<uses-permission android:name="android.permission.INTERNET" />

在这里插入图片描述

配置完成后,再次运行程序

在这里插入图片描述
此时可以看到,我们设置的textview中显示出了数据库查询的内容,至此,Android上的JDBC运行实例完美成功!!

phpMyadmin数据库中文编码问题

phpMyadmin有时会存在数据库无法插入中文的情况,就像这样。
在这里插入图片描述

那么该如何解决呢?

首先进入cmd,进入dos命令窗口:输入mysql -u 用户名 -p 密码()

在这里插入图片描述
输入show variables like “%character%”(显示变量如character)
在这里插入图片描述
我们需要配置my.ini文件下的mysqld(MySQL服务器端),以及client(服务器默认反馈给客户端的默认编码格式),具体配置如下:

首先我们需要找到wamp小图标,在如下位置找到mysql配置文件my.ini
在这里插入图片描述

打开之后,ctrl+F 搜索mysqld ,在mysqld中添加下面红箭头所指的两行
在这里插入图片描述
ctrl + f 搜索client,在client中添加下面红箭头所指的一行
在这里插入图片描述

设置完以后,别忘了重启wampserver所有服务!!

在这里插入图片描述
此时mysql已经将默认编码格式转变成了utf8,再新建数据库和表的时候就能往其中插入中午啦!

如果之前建好了表,不想删表重建的话,需要用以下命令修改表的编码格式

	alter table `tablename` convert to character set utf8;

或者在图中箭头所指地方将编码修改为utf8_general_ci

tu

至此,本讲内容就结束啦,欢迎大家交流学习,多多评论!!

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值