1:statement:最常用的statement ,用于执行不含任何参数的SQL语句,提供对数据库的查询和更改操作。
preparedstatment:继承自Statement用于执行带参数的SQL语句,在参数固定的情况下推荐使用。 提供对数据库的查询和更改操作。
例如:/* */这里中间的是注释
String sql="Select *from student where student_no=?"; /*sql语句*/
PrepareStatement st=con.prepareStatement(sql) ; /*创建statement*/
st.setString(1,no); /*将参数设置到查询语句中 */
Result rs = st.executeQuery(); /*得到查询结果集*/
CallableStatement:继承自PrepareStatement,一般用于调用数据库的存储过程的想
(了解存储过程创建及调用:http://wenku.baidu.com/view/ac21ca07eff9aef8941e0612 .html)
*SQL注入 攻 击 是利用是指利用 设计 上的漏洞,在目 标 服 务 器上运行 Sql语 句以及 进 行其他方式的 攻 击 ,
动态 生成 Sql语 句 时 没有 对 用 户输 入的数据 进 行 验证 是 Sql注入 攻 击 得逞的主要原因。
对 于 JDBC而言, SQL注入 攻 击 只 对 Statement有效, 对 PreparedStatement 是无效的,
这 是因 为 PreparedStatement 不允许在不同的插入 时间改变查询 的 逻 辑结 构。
如 验证 用 户 是否存在的 SQL语 句 为 :
select count(*) from usertable where name='用 户 名 ' and pswd='密 码 '
如果在 用 户 名字段 中 输 入 ' or '1'='1' or '1'='1
或是在 密 码 字段 中 输 入 1' or '1'='1
将 绕过验证 ,但 这种 手段只 对 只 对 Statement有效, 对 PreparedStatement 无效。
PreparedStatement 相 对 Statement有以下 优 点:
1.防注入 攻 击
2.多次运行速度快
3.防止 数据 库缓 冲区溢出
4.代 码 的可 读 性可 维护 性好 :
2:事务处理
try {
conn.setAutoCommit(false);//添加事物若一个出错全部不执行
Statement stmt=conn.createStatement();
String sql="insert into dept values(86,'abc','12300')";
String dsql="insert into dd values(99,a,'haha')";
stmt.executeQuery(sql);
stmt.executeQuery(dsql);
conn.commit();//事务提交
} catch (RuntimeException e) {
conn.rollback();//回滚
e.printStackTrace();
3:批量处理
String s1="insert into dd values(2,'eeq','rr4')";
String s2="insert into dd values(3,'eea','rr4')";
String s3="insert into dd values(4,'ees','rr3')";
String s4="insert into dd values(5,'eed','rr2')";
String s5="insert into dd values(8,'eec','rr1')";
try
{
conn.setAutoCommit(false);
Statement stmt=conn.createStatement();
stmt.addBatch(s1);
stmt.addBatch(s2);
stmt.addBatch(s3);
stmt.addBatch(s4);
stmt.addBatch(s5);
int[] ins=stmt.executeBatch();
//表execute();
for(int i=0;i<ins.length-1;i++)
{
System.out.println(ins[i]);
}
conn.commit();
}
catch(Exception e)
{
conn.rollback();
e.printStackTrace();
}
4:查询数据库信息结果集信息
DatabaseMetaData dm=conn.getMetaData();//分析数据库信息
System.out.println(dm.getURL());
System.out.println(dm.getUserName());
System.out.println(dm.supportsSchemasInPrivilegeDefinitions());
//分析结果集信息
ResultSetMetaData rm=rs.getMetaData();
System.out.println(rm.getColumnCount());
System.out.println(rm.getColumnName(1));
System.out.println(rm.getColumnTypeName(1));
System.out.println(rm.getColumnLabel(1))