3.6学习总结(Android连接数据库,线程内)
今天将Android 连接数据库的问题解决了。Android 连接数据库分为两种,一种是连接SQLite,一种是连接Mysql。前者较为简单,这里不再展示。
而连接远程数据库MYSQL就比较麻烦了,与javaweb不同,Android 连接数据库需要在线程里进行,如果不在线程里进行则报错为:The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server。显示未接受到任何服务器信息,在网上也查不到任何有关消息,与同学讨论得知,Android连接数据库必须在线程中。
以下为代码:
1.JDBC
package com.example.demo11;
import android.util.Log;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Connection;
public class JDBC {
static java.sql.Connection conn = null;
private static final String TAG = "mysqlQ";
public static Connection getConn() {
// 1.加载JDBC驱动
try {
Class.forName("com.mysql.jdbc.Driver");
Log.v(TAG, "加载JDBC驱动成功");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
// 2.设置好IP/端口/数据库名/用户名/密码等必要的连接信息
String url = "jdbc:mysql://10.99.121.52:3306/test";
// 构建连接mysql的字符串
String user = "root";
String password = "1003392478";
// 3.连接JDBC
try {
conn = DriverManager.getConnection(url, user, password);
Log.d(TAG, "数据库连接成功");
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
public static void close(Connection conn) {
try {
conn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
2.userDao
package com.example.demo11;
import com.example.demo11.javabean.User;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import com.example.demo11.JDBC;
public class UserDao {
public boolean login(String id, String password) {
String sql = "select * from user where name = ?and password = ?;";
Connection con = JDBC.getConn();
try {
PreparedStatement preparedStatement = con.prepareStatement(sql);
preparedStatement.setString(1, id);
preparedStatement.setString(2, password);
if (preparedStatement.executeQuery().next()) {
return true;
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBC.close(con);
}
return false;
}
}
此时,1与2中都没有用到线程,这与javaweb一致,接下来才是区别!!
3.MainActivity
public void onClick(View view) {//点击按钮
int id=view.getId();
switch (id){//通过switch-case进行按钮业务判断
case R.id.login:
String s=name.getText().toString();
String s1=password.getText().toString();
new Thread(){//新建线程
@Override
public void run() {
boolean login=userDao.login(s,s1);//调用第2个userDao中login方法,因为此方法包含连接数据库的connection,因此需要在线程中
if(login==false){
Looper.prepare();//线程中不能先弹Toast,要先加Looper
Toast.makeText(MainActivity.this,"登陆失败!",Toast.LENGTH_LONG).show();
Looper.loop();
}else {
Looper.prepare();
Toast.makeText(MainActivity.this, "登陆成功!", Toast.LENGTH_LONG).show();
Intent intent = new Intent(MainActivity.this, good.class);
startActivity(intent);
Looper.loop();
}
}
}.start();
break;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术