PreparedStatement
1.Why
1):使用Statement需要进行拼写SQL语句,很辛苦,而且容易出错。
2):使用Statement可以发生SQL注入。
SQl注入:
SQL注入是利用某些系统对用户输入的数据进行充分的检查
而在用户输入数据中注入非法的SQL语句段或命令,从而充分利用系统的SQL引擎完成恶意行为的做法
对于Java而言,要防范SQL注入,只要用PrepareStatement取代Statement就可以了
String username = a'OR PASSWORD= ;
String password = OR '1'='1;
String sql=SELECT * FROM users WHERE username = '
+username.+'AND
+password='+passwoed+';
System.out.println(sql);
SELECT * FROM users WHERE username='a' OR PASSWORD='AND password = 'OR '1'='1'
'
2.What
1):是Statement的子接口。
2):可以传入带占位符的SQL语句,并且提供了补充占位符变量的方法
3.How
1):创建PreparedStatement
String SQL=INSERT INTO examstudent VALUES(?,?,?,?,?,?,?);
PrepareStatement ps=conn.prepareStatement(sql);
2):调用PreparedStatement 的 setXxx(int index,Object val)设置占位符的值,index,值从1开始
3):执行SQL语句 executeUpdate() 或 executeQuery()
ResultSetMetaData
1.Why:如果只有一个结果集,但不知道该结果集中有多少列,列的名字都是什么
1):编写通用的查询方法是需要使用。
publicTget(Classclazz,String sql.Object ...args)
2.What:用于描述ResultSet的对象
3.How
1):得到ResultSetMetaData对象,调用ResultSet的getMetaData()方法
ResultSetMetaData rsmd=resultSet.getMetaData();
2):ResultSetMetaData有哪些好用的方法;
int getColumnCount();结果集中的列数
String getColumnLabel(int column);获取指定的列的列名,其中索引从1开始
while(resultSet.next()){
for(int i=0;irsmd.getcolumncount();i++){ p=
String columnLable=rsmd.getColumnLabel(i+1);
}
}