Android:使用JDBC链接MySQL数据库
今天别人问怎么用android链接mysql的数据库,说到一般都是需要建一个web项目,然后用http访问服务器,通过服务器来查询数据库;突然想到可不可以直接用android访问数据库呢?在网上查到的确可以这样做,就是用jdbc链接本机的mysql数据库,于是自己写了一个小的demo写在这里供以后查看复习以及大家学习交流使用,错误不当之处还请指正。
首先总结一下几个要点:
- 要给android项目添加访问网络的权限;
- 数据库链接的url要用本机的ip不然没法访问;
- mysql要添加远程访问的权限;
- jdbc驱动要和mysql版本一致,不然一样不能访问;
接下来说项目的主要部分,这里只说主要部分:要实现的主要功能是实现判断用户的登录,并对不同种类的用户跳转不同的页面。
首先新建jdbcutils类,
public class JDBCUtils {
private final String USERNAME = "admin";
private final String PASSWROD = "admin";
private final String DRIVER = "com.mysql.jdbc.Driver";
private final String URL = "jdbc:mysql://192.168.0.100:3306/usertest";
//192.168.0.100就是你的本机ip
private Connection conn;
private PreparedStatement ps;
private ResultSet res;
public JDBCUtils(){
try {
Class.forName(DRIVER);
conn = DriverManager.getConnection(URL, USERNAME, PASSWROD);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
public List<Map<String, Object>> query(String sql, List<Object> params)
throws SQLException {
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
ps = conn.prepareStatement(sql);
if (params != null && !params.isEmpty()) {
for (int i = 0; i < params.size(); i++)
ps.setObject(i + 1, params.get(i));
}
res = ps.executeQuery();
ResultSetMetaData metaData = res.getMetaData();
int col_len = metaData.getColumnCount();
while (res.next()) {
Map<String, Object> map = new HashMap<String, Object>();
for (int i = 0; i < col_len; i++) {
String col_name = metaData.getColumnName(i + 1);
Object col_value = res.getObject(col_name);
map.put(col_name, col_value);
}
list.add(map);
}
return list;
}
//关闭连接
public void release() {
if (res != null)
try {
res.close();
} catch (SQLException e) {
e.printStackTrace();
}
if (ps != null)
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
if (conn != null)
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
写好布局如下:
数据库设计如下:
其中code值分别表示不同种类的用户;
在activity中添加如下代码:
//在登录按钮的点击事件中实现访问数据库
btn_login.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
final String username = et_username.getText().toString();
final String password = et_password.getText().toString();
if (username.isEmpty() || password.isEmpty()) { //判断是否输入
Toast.makeText(getApplicationContext(), "用户名密码不能为空!", 0)
.show();
} else {
final Message msg = new Message();
new Thread(new Runnable() { //开启线程
@Override
public void run() {
// TODO Auto-generated method stub
JDBCUtils jdbc = new JDBCUtils();
String sql = "select * from users where username = '"
+ username
+ "' and password ='"
+ password
+ "'";
try {
List<Map<String, Object>> list = jdbc.query(
sql, null);
mark = (Integer) list.get(0).get("code");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (mark == 1) { // mark == 1 用户已经加盟 跳转至用户中心
msg.what = TO_USER_CENTER;
myhandler.sendMessage(msg); //发送handler消息
} else if (mark == 2) { // mark == 2 用户没有加盟 申请加盟页面
msg.what = TO_JOIN_UP;
myhandler.sendMessage(msg);
}
}
}).start();
}
}
});
}
private final static int TO_USER_CENTER = 101;
private final static int TO_JOIN_UP = 102;
Handler myhandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case TO_USER_CENTER:
jump(TO_USER_CENTER);
break;
case TO_JOIN_UP:
jump(TO_JOIN_UP);
break;
}
};
};
//跳转的方法
public void jump(int i) {
Intent intent = new Intent();
if (i == TO_USER_CENTER) {
intent.setClass(getApplicationContext(), UserMain.class);
startActivity(intent);
}else if(i == TO_JOIN_UP){
intent.setClass(getApplicationContext(), JoinUP.class);
startActivity(intent);
}
finish();
}
}
至此主要代码已经写完;其实这么做并没有什么实际意义,就权当复习使用了。