10.7 PreparedStatement对象
可以防止SQL注入问题,效率高,本质:把传递进来的参数当做字符。
10.7.1 测试insert
package com.study.lesson;
?
import utils.JdbcUtils;
?
import java.sql.Connection;
import java.util.Date;
import java.sql.PreparedStatement;
import java.sql.SQLException;
?
/**
* 测试insert
*/
public class JdbcDemo07 {
public static void main(String[] args) {
//属性信息
Connection cn = null;
PreparedStatement ps = null;
try {
//连接驱动,获取数据库
cn= JdbcUtils.getConnection();
?
//使用?占位符代替参数
String sql = "INSERT INTO `users`(`id`,`name`,`password`,`email`,`birthday`)" +
"VALUES(?,?,?,?,?)";
?
//预编译SQL,先写sql,然后不执行
ps = cn.prepareStatement(sql);
?
//手动给参数赋值
ps.setInt(1,4);
ps.setString(2,"zhuangzhuang");
ps.setString(3,"159357");
ps.setString(4,"159357@qq.com");
/**
* 注意点:sql.Date 数据库
* util.Date Java
* new Date().getTime()获取时间戳
*/
ps.setDate(5,new java.sql.Date(new Date().getTime()));
?
//执行
int i = ps.executeUpdate();
if(i>0){
System.out.println("插入成功!");
}
} catch (SQLException e) {
e.printStackTrace();
} catch (Exception e){
e.printStackTrace();
} finally {
JdbcUtils.release(cn,ps,null);
}
}
}
?
输出结果:效果同上
10.7.2 测试delete
package com.study.lesson;
?
import utils.JdbcUtils;
?
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Date;
?
/**
* 测试delete
*/
public class JdbcDemo08 {
public static void main(String[] args) {
//属性信息
Connection cn = null;
PreparedStatement ps = null;
try {
//连接驱动,获取数据库
cn= JdbcUtils.getConnection();
?
//使用?占位符代替参数
String sql = "DELETE FROM `users` WHERE `id` = ?";
?
//预编译SQL,先写sql,然后不执行
ps = cn.prepareStatement(sql);
?
//手动给参数赋值
ps.setInt(1,4);
?
//执行
int i = ps.executeUpdate();
if(i>0){
System.out.println("删除成功!");
}
} catch (SQLException e) {
e.printStackTrace();
} catch (Exception e){
e.printStackTrace();
} finally {
JdbcUtils.release(cn,ps,null);
}
}
}
?
输出结果:效果同上
10.7.3 测试update
package com.study.lesson;
?
import utils.JdbcUtils;
?
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
?
/**
* 测试update
*/
public class JdbcDemo09 {
public static void main(String[] args) {
//属性信息
Connection cn = null;
PreparedStatement ps = null;
try {
//连接驱动,获取数据库
cn= JdbcUtils.getConnection();
?
//使用?占位符代替参数
String sql = "UPDATE `users` SET `password`=? WHERE `id`=?;";
?
//预编译SQL,先写sql,然后不执行
ps = cn.prepareStatement(sql);
?
//手动给参数赋值
ps.setString(1,"222222");
ps.setInt(2,1);
?
//执行
int i = ps.executeUpdate();
if(i>0){
System.out.println("更新成功!");
}
} catch (SQLException e) {
e.printStackTrace();
} catch (Exception e){
e.printStackTrace();
} finally {
JdbcUtils.release(cn,ps,null);
}
}
}
?
输出结果:效果同上
10.7.4 测试select
package com.study.lesson;
?
import utils.JdbcUtils;
?
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
?
/**
* 测试select
*/
public class JdbcDemo10 {
public static void main(String[] args) {
//属性信息
Connection cn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
//连接驱动,获取数据库
cn= JdbcUtils.getConnection();
?
//使用?占位符代替参数
String sql = "SELECT * FROM `users` WHERE `id`=?";
?
//预编译SQL,先写sql,然后不执行
ps = cn.prepareStatement(sql);
?
//手动给参数赋值
ps.setInt(1,1);
?
//执行
rs = ps.executeQuery();
while (rs.next()){
System.out.println(rs.getString("name"));
}
} catch (SQLException e) {
e.printStackTrace();
} catch (Exception e){
e.printStackTrace();
} finally {
JdbcUtils.release(cn,ps,rs);
}
}
}
?
输出结果:效果同上
10.7.5 解决SQL注入问题
package com.study.lesson;
?
import utils.JdbcUtils;
?
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
?
/**
* 解决sql注入问题
*/
public class JdbcDemo11 {
public static void main(String[] args) {
//login("lisi","123456");//正常情况下,当用户名和密码输入正确后,输出用户信息
//存在是SQL注入问题时,用户名或密码任一输入or‘1=1,均会输出所有用户信息,导致信息泄露
?
//使用PreparedStatement可解决SQL注入问题
//login("‘or‘1=1","123456");
//login("lisi","‘or‘1=1");
login("‘or‘1=1","‘or‘1=1");
}
public static void login(String username,String password){
//属性信息
Connection cn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
//获取数据库
cn = JdbcUtils.getConnection();
//PreparedStatement防止SQL注入的本质:把传递进来的参数当做字符
//假设其中存在转义字符,比如说‘会被直接转义
//SQL语句
String sql ="SELECT * FROM `users` WHERE `name`= ? AND `password`= ? ";
//创建PrepareStatement对象,预编译sql语句
ps = cn.prepareStatement(sql);
//指定内容
ps.setString(1,username);
ps.setString(2,password);
//获取结果集
rs = ps.executeQuery();
//判断是否含有下一个元素
while (rs.next()){
System.out.println(rs.getString("name"));
System.out.println(rs.getString("password"));
System.out.println();
}
} catch (SQLException e) {
e.printStackTrace();
} catch (Exception e){
e.printStackTrace();
} finally {
//释放连接资源
JdbcUtils.release(cn,ps,rs);
}
}
}
?
输出结果:正常输入时,可得到结果;不满足要求时,无输出结果。
SQLyog基本操作(十五)-PreparedStatement对象测试insert、delete、update、select、解决SQL注入问题