关于android访问servlet 获取数据库数据的一般步骤 第一节
** android端通过服务器访问数据库并获得数据一般分为三个步骤。 **
1、第一步,服务端即servlet,通过jdbc连接数据库,获得表中部分或全部数据。
2、第二步,servlet将数据(一般为List数据集合)处理之后发送给android端。
3、第三步,android端获得数据后,解析成自己所需要的数据。
** 一、servlet连接数据库获得数据**
这个步骤笔者采用的是jdbc进行数据库访问,所需要的材料为:mysql,myeclipse,jdbc的jar包。
1、连接数据库
public class Daoutil {
private final static String DRIVER="com.mysql.jdbc.Driver"; //驱动包的位置
private final static String RUL="jdbc:mysql://localhost:3306/temperature?useUnicode=true&characterEncoding=utf-8"; //temperature是我的数据库名
private final static String ROOT="charlemont";
private final static String PASSWORD="mydigital";
/**
*连接数据库
*/
public Connection getConnection(){
Connection connection=null;
try {
System.out.println("开启连接");
Class.forName(DRIVER);
connection =DriverManager.getConnection(RUL,ROOT,PASSWORD);
} catch (Exception e) {
// TODO Auto-generated catch block
System.out.print("no");
e.printStackTrace();
}
return connection;
}
/**
* 关闭数据库
* @param conn
*/
public static void closeConnection(Connection conn){
try {
System.out.println("关闭连接");
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
在DriverManager.getConnection(RUL,ROOT,PASSWORD);中,RUL表示数据库的访问路径,ROOT,PASSWORD表示连接数据库时所使用的账号和密码。即在可视化mysql软件中使用的连接用户名和密码。
每个连接用户可以分配不同的权限,进而可以实现在mysql端的普通用户和管理员用户权限分配,当然,这都是后话。
获得连接connection之后,可以通过PreparedStatement类加载sql语句,获得查询数据。
值得一提的是,Statement类同样可以完成这个功能。
- Statement使用的是曾经的sql拼接法来载入sql语句,复杂,且容易出错。
String sqlString="insert into tablename (L1,L2,L3) values ('"+var1+"','"+var2+"',"+var3+"')";
- PreparedStatement使用的是参数法,也就是说sql语句本身也成为了一个参数,而var1,var2…等值也以参数形式导入,可避免字符拼写时出现的不必要的错误。
PreparedStatement pstmt = null;
pstmt = connection.prepareStatement("insert into tablename (T1,T2,T3) values (?,?,?)");
pstmt .setString(1,var1);
pstmt .setString(2,var2);
pstmt .setString(3,var3);
pstmt .executeUpdate();
需要注意的是在setString方法中,前一个参数index为var在通识符中的位置,从1开始计算。
不过,在如果查询只是用一次的话,那么使用Statement可以节省性能,如果频繁查询的话,那么使用PreparedStatement更为有效,因为其含有的存储池可以节省频繁访问的性能消耗。不过,如果是为了安全着想,建议使用PreparedStatement,参数输入形式可以避免掉大量的sql注入攻击。
下面是查询代码段,使用时只需传入一个参数,"select * from tablename"即可获得表中所有数据,并以list<map<k,v>>的形式进行封装。
public static List<Map<String, Object>> findList(String sql,String...strings ){
List<Map<String, Object>> l = new ArrayList<Map<String, Object>>();
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
Daoutil r=new Daoutil();
conn = r.getConnection();//获取链接
try {
pstmt = conn.prepareStatement(sql);//
if (strings != null){//
for (int i = 0; i < strings.length; i++) {
pstmt.setObject(i + 1, strings[i]);
}
}
rs = pstmt.executeQuery();//运行SQL
while (rs.next()) {
l.add(toEntity(rs));//解析结果集,用map封装表格数据,放入list中
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
Daoutil.closeConnection(conn);
}
return l;
}
//将每一行的数据封装为一个map对象
public static Map<String, Object> toEntity(ResultSet rs) {
Map<String, Object> map = new HashMap<String, Object>();
try {
ResultSetMetaData data = (ResultSetMetaData) rs.getMetaData();//获取 运行sql的查询字段
for (int i = 1; i <= data.getColumnCount(); i++) {
String columnName = data.getColumnName(i);
map.put(columnName, rs.getObject(columnName));
}
} catch (SQLException e) {
e.printStackTrace();
}
return map;
}