PreparedStatement resultset

简单概述:

PreparedStatement继承自Statement,但比Statement功能强大的多。

优点:

1、PreparedStatement是预编译的,比Statement速度快。

当同时要执行多条相同结构sql语句时使用,这时可以用setObject(),addBatch()和executeBatch()这几个函数。

2、可以防止sql注入。

对JDBC而言,SQL注入攻击只对Statement有效,对PreparedStatement是无效的,这是因为PreparedStatement不允许在插入时改变查询的逻辑结构.

举例分析:

例一:说明PreparedStatement速度快插入两条语句只需编译一次,而Statement则需要编译两次。

package com;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class TestPreparedStatement {
publicstatic void main(String[] args) {
Connection con = null;
PreparedStatement pst = null;
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

String url ="jdbc:sqlserver://127.0.0.1:1433;databaseName=userManager";
con = DriverManager.getConnection(url, "as", "");

String sql = "insert into myuser (userName,pwd) values (? ,?)";
pst = con.prepareStatement(sql);

pst.setString(1, "张三"); //也可以用setObject()
pst.setString(2, "123");
pst.addBatch();

pst.setString(1, "李四");
pst.setString(2, "456");
pst.addBatch();

pst.executeBatch();

} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (pst != null) {
pst.close();
pst = null;
}
if(con != null) {
con.close();
con = null;
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}

例二:说明PreparedStatement可以防止sql注入。

System.out.println("请输入用户名:");
name = input.nextLine();
System.out.println("请输入密码:");
pwd = input.nextLine();

String sql = "select * from myuser whereuserName = '" + name + "' and pwd = '" + pwd + "'";

Statementst =con.createStatement();
ResultSet rs = st.executeQuery(sql);
if (rs.next()) {
System.out.println("登陆成功!");
} else {
System.out.println("登陆失败!");
}

当输入用户名为任意,密码为:123' or '1' = '1时,则都可以登录成功。

System.out.println("请输入用户名:");
name = input.nextLine();
System.out.println("请输入密码:");
pwd = input.nextLine(【】);

String sql = "select * from myuser whereuserName = ? and pwd = ? ";
PreparedStatement pst = con.prepareStatement(sql);

pst.setString(1, name);
pst.setString(2, pwd);
ResultSet rs = pst.executeQuery();
System.out.println(sql);
if (rs.next()) {
System.out.println("登陆成功!");
} else {
System.out.println("登陆失败!");
}

当输入用户名为任意,密码为:123' or '1' ='1时,则都可以登录失败。防止了sql注入。

  

爱华网本文地址 » http://www.413yy.cn/a/25101016/311171.html

更多阅读

oracle中OracleCachedRowSet的使用 git rm cached 使用

RowSet是JDBC2.0中提供的接口,Oracle对该接口有相应实现,其中很有用的是oracle.jdbc.rowset.OracleCachedRowSet。OracleCachedRowSet实现了ResultSet中的所有方法,但与ResultSet不同的是,OracleCachedRowSet中的数据在Connection关闭

ResultSetMetaData用法介绍 resultset

内容概要:ResultSetMetaData中的方法的介绍。ResultSetMetaData:这个类完成了查询结果信息和结果中的列的各种信息。它包含的方法以及各个方法的作用,在下面这个演示程序中一一介绍。在这个演示程序中用到数据库是Access的,数据库中的表

声明:《PreparedStatement resultset》为网友我不愿将就分享!如侵犯到您的合法权益请联系我们删除