引言
上一次,本帅已经带大家学习了JDBC的工具类,以及JDBC的增删改查操作,这一次,本帅将带着大家,在Android的虚拟机上跑起来JDBC的实例。同时,本帅还会在这次博客中记录本帅在使用phpMyAdmin中所遇到的一个大坑,phpMyAdmin的数据库的编码问题(插入不了中文的解决办法),大家准备好头发了吗,让我们一起从乌黑浓密好头发到清朝皇家阿哥头的进阶之路上进击吧!
前面没学会的小伙伴们,点击下方的传送门(传送门排名分先后)
JDBC的准备工作:搭建本地服务器,创建可远程访问数据库权限的用户
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
至此,本讲内容就结束啦,欢迎大家交流学习,多多评论!!