在大多数Android项目中,数据的读取和保存都是通过调用服务器的接口来实现的,所以对于本地数据库的操作是很少的。但是,在前段时间的项目中,客户提出了要直接连接服务器上的数据库来操作数据,这对于一个Android小白来说还从没遇到过,于是开始了各种搜索,各种尝试,毕竟客户就是上帝,你懂的.........终于,在经过不断的尝试以后,终于成功连上了数据库。现在就来聊一聊吧。
JDBC(JAVA DATEBASE CONNECTIVITY):是使用java存取数据库系统的标准解决方案,它将不同数据库间各自差异API与标准SQL语句分开看待,实现了数据库无关的java操作。
(就是说我们只需要专注jdbc API提供的接口和类以及标准的SQL语句,并且能够运用,而不需要了解底层数据库驱动程序与相关的操作接口的差异)
运用JDBC访问数据库一共分为七个步骤:
1,加载JDBC驱动程序
2,提供链接参数(数据库地址,用户名和密码)
3,建立一个数据库连接(创建一个Connection对象)
4,创建一个Statement
5,执行SQL语句
6,处理结果
7,关闭JDBC对象
(其中有四个关键类:DriverManager,Connection,Statement,ResultSet,可通过API具体了解其使用方法)
首先你需要下载一个jdbc.jar的jar包。然后将jar包导入到自己的项目中,如图:
然后我们写一个服务来连接数据库,代码如下:
public class My_service_mysql extends Service {
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO Auto-generated method stub
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
Log.e("驱动加载失败", e1.toString());
}
try {
//IP为服务器ip,DBNAME为数据库名字,DBUSER为数据库用户名,DBPASS为数据库密码
Connection connection = DriverManager.getConnection("jdbc:mysql://"+IP+":3306/"+DBNAME,DBUSER,DBPASS);
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
Log.e("数据库连接失败", e1.toString());
}
}
}).start();
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
stopSelf();
}
}
在数据库连接成功之后,我们就需要进行数据库操作了,需要使用sql语句。
首先是查询:
//sql语句
String sql = "select tableName where colum = " + value;
Statement stmt = (Statement) connection.createStatement();
ResultSet rs = stmt.executeQuery(sql);
while (rs.next()) {
String id = rs.getString("colum");
}
stmt.close();
通过createStatement得到Statement对象,然后通过Statement的executeQuery方法得到ResultSet对象,就是查询的结果。然后取出你需要的字段。查询完之后关闭资源。
然后是插入和更新操作:
String sql= "insert into tableName values (value,value,value,value)”;
Statement stmt = (Statement) connection.createStatement();
ResultSet rs = stmt.executeQuery(sql);
stmt.executeUpdate(sql);
stmt.close();
在存储过程中可能会遇到文件的存储,也就是数据库中BLOB类型的数据,存储方式如下:
PreparedStatement pstmt = null;
File file = new File(path);
InputStream photoStream = new FileInputStream(file);
String sql = "INSERT INTO tableName VALUES (?)"; //问号表示数据类型为BLOB的字段插入的值
pstmt = (PreparedStatement) LKF_static.connection.prepareStatement(sql);
pstmt.setBinaryStream(1, photoStream, (int) file.length());
pstmt.executeUpdate();
pstmt.close();
1,加载驱动和连接数据库的操作一定要放在线程中,不然会报错
2,在进行数据库操作之后需要关闭资源,如果资源关闭了就不能进行数据库操作了
3,就是需要注意打开需要的权限
网上也有人说要使用JDBC连接数据库需要注意API版本,要是API版本高于17则不能成功连接,所以我用的API版本是16