04.JDBC编程之指定变量&批处理(二)

2015-07-24 06:09:10 · 作者: · 浏览: 2
l = "select * from tb_name where name= '"+varname+"' and passwd='"+varpasswd+"'"; 如果我们把[' or '1' = '1]作为varpasswd传入进来.用户名随意,看看会成为什么? select * from tb_name = '随意' and passwd = '' or '1' = '1'; 因为'1'='1'肯定成立,所以可以任何通过验证.更有甚者: 把[';drop table tb_name;]作为varpasswd传入进来,则: select * from tb_name = '随意' and passwd = '';drop table tb_name;有些数据库是不会让你成功的,但也有很多数据库就可以使这些语句得到执行. 而如果你使用预编译语句.你传入的任何内容就不会和原来的语句发生任何匹配的关系.只要全使用预编译语句,你就用不着对传入的数据做任何过虑.而如果使用普通的statement,有可能要对drop,;等做费尽心机的判断和过虑.

3.源码实战:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
/*MySQL数据库编程
* 实例(4):使用PreparedStatement灵活指定SQL语句中的变量*/
public class JDBC_PreparedStatement {
public static void main(String[] args) {
if(args.length!=3) //输入不正确,非正常退出
{
System.out.println( "Parament Error,Please Input Again!");
System.exit(-1);
}
String nameParam=args[0]; //获取命令行第一个参数
int ageParam=Integer.parseInt(args[1]); //获取命令行第二个参数,并转换为整型
int scoreParam=Integer.parseInt(args[2]);//获取命令行第三个参数,并转换为整型


//0.连接数据库相关参数
String url="jdbc:mysql://localhost:3306/jdbc_test_db"; //数据库URL(资源定位唯一标识符)
String DBusername="root"; //数据库用户名
String DBpasswd="111111"; //数据库密码


//1.加载数据库驱动,将Driver注册到DriverManager中
try{
Class.forName("com.mysql.jdbc.Driver");
}catch(ClassNotFoundException e){
e.printStackTrace();
}
//2.通过数据库URL连接到数据库
Connection conn=null;
PreparedStatement prestmt=null;
try{
conn=DriverManager.getConnection(url, DBusername, DBpasswd);
//3.获取PreparedStatement对象


String sql="insert into test(name,age,score) values(?,?,?)";
prestmt=conn.prepareStatement(sql);
prestmt.setString(1, nameParam); //分别给变量设值
prestmt.setInt(2, ageParam);
prestmt.setInt(3, scoreParam);
prestmt.execute();


}catch(SQLException e){
e.printStackTrace();
}
//5.释放JDBC资源
if(prestmt!=null) //关闭声明
{
try{
prestmt.close();
}catch(SQLException e){
e.printStackTrace();
}
}


if(conn!=null) //关闭连接
{
try{
conn.close();
}catch(SQLException e){
e.printStackTrace();
}
}
}


} 
(1)设置命令行参数 右击工程->Run as->Open Run Dialog->Main Class选择"JDBC_PreparedStatement" \
(2)运行结果
\
二、批处理SQL语句 (1)源代码
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
/*MySQL数据库编程
* 实例(5):JDBC批量处理DML语句.分别尝试Statement、PreparedStatement*/


public class JDBC_Batch {
public static void main(String[] args) {


//0.连接数据库相关参数
String url="jdbc:mysql://localhost:3306/jdbc_test_db"; //数据库URL(资源定位唯一标识符)
String DBusername="root"; //数据库用户名
String DBpasswd="111111"; //数据库密码


//1.加载数据库驱动,将Driver注册到DriverManager中
try{
Class.forName("com.mysql.jdbc.Driver");
}catch(ClassNotFoundException e){
e.printStackTrace();
}
//2.通过数据库URL连接到数据库
Connection conn=null;
PreparedStatement prestmt=null;
try{
conn=DriverManager.getConnection(url, DBusername, DBpasswd);
//3.获取PreparedStatement对象
String sql="insert into test(name,age,score) values(?,?,?)";
prestmt=conn.prepareStatement(sql);
prestmt.setString(1,"aaa");
prestmt.setInt(2, 19);
prestmt.setInt(3, 55);
prestmt.execute(); //a.添加第一条插入记录


prest