关于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;
	}