mysql学习14( PrepareStatement对象 以及 防止SQL注入攻击 )
-
PrepareStatement对象:
-
可以防止SQL注入,并且效率更高;
-
st.executeUpdate();
-
-
-
代码案例:
-
新增:st.executeUpdate();
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Connection;
import java.util.Date;
/**
* 测试
*/
public class JdbcDemo01 {
public static void main(String[] args) {
Connection conn =null;
PreparedStatement st=null;
ResultSet rs=null;
try {
conn= JdbcUtils.getConnection();//获取连接
/**
* 区别:
* 1,使用? 占位符代替参数
* 2,
*
*/
//"INSERT INTO `users`(`id`,`NAME`,`PASSWORD`,`email`,`birthday`)VALUES('4','demo','123456','demo@sina.com','1980-12-04')";
String sql="INSERT INTO `users`(`id`,`NAME`,`PASSWORD`,`email`,`birthday`)VALUES(?,?,?,?,?)";
st=conn.prepareStatement(sql);//预编译SQL,先写SQL,然后不执行
//手动给参数赋值
st.setInt(1,1);
st.setString(2,"demo");
st.setString(3,"111111");
st.setString(4,"demo@sina.com");
//注意点: sql.Date():数据库用的
// util.Date():Java用的 new Date().getTime()获得时间戳
st.setDate(5,new java.sql.Date(new Date().getTime()));
//执行
int i=st.executeUpdate();
if(i>0){
System.out.println("插入成功");
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
JdbcUtils.release(conn,st,rs);
}
}
}
-
修改:st.executeUpdate();
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* 测试
*/
public class JdbcDemo03 {
public static void main(String[] args) {
Connection conn =null;
PreparedStatement st=null;
ResultSet rs=null;
try {
conn= JdbcUtils.getConnection();//获取连接
/**
* 区别:
* 1,使用? 占位符代替参数
*
*/
//UPDATE `users` SET `NAME`='deo' WHERE id=4
String sql="UPDATE `users` SET `NAME`=? WHERE id=?";
st=conn.prepareStatement(sql);//预编译SQL,先写SQL,然后不执行
//手动给参数赋值
st.setString(1,"dee");
st.setInt(2,4);
//执行
int i=st.executeUpdate();
if(i>0){
System.out.println("修改成功");
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
JdbcUtils.release(conn,st,rs);
}
}
}
-
删除:st.executeUpdate();
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;
/**
* 测试
*/
public class JdbcDemo02 {
public static void main(String[] args) {
Connection conn =null;
PreparedStatement st=null;
ResultSet rs=null;
try {
conn= JdbcUtils.getConnection();//获取连接
/**
* 区别:
* 1,使用? 占位符代替参数
*
*/
String sql="delete from users where id =?";
st=conn.prepareStatement(sql);//预编译SQL,先写SQL,然后不执行
//手动给参数赋值
st.setInt(1,1);
//执行
int i=st.executeUpdate();
if(i>0){
System.out.println("删除成功");
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
JdbcUtils.release(conn,st,rs);
}
}
}
-
查询:executeQuery();不传递参数
package com.ljx.demo02;
import com.ljx.demo01.utils.JdbcUtils;
import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* 测试
*/
public class JdbcDemo04 {
public static void main(String[] args) {
Connection conn =null;
PreparedStatement st=null;
ResultSet rs=null;
try {
conn= JdbcUtils.getConnection();//获取连接
/**
* 区别:
* 1,使用? 占位符代替参数
*
*/
//select * from users
String sql="select * from users where id=?";
st=conn.prepareStatement(sql);//预编译SQL,先写SQL,然后不执行
//手动给参数赋值
st.setInt(1,4);
//执行
rs=st.executeQuery();//不传递参数
while (rs.next()){
System.out.println("name=:"+rs.getString("NAME"));
System.out.println("id=:"+rs.getInt("id"));
System.out.println("================");
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
JdbcUtils.release(conn,st,rs);
}
}
}
-
-
PrepareStatement对象如何防止SQL注入:
-
查询SQL匹配:st参数需要单独设置;
-
PrePareStatement防止SQL注入的本质,就是把传递进来的参数当作字符
-
代码案例:
/**
* 测试SQL注入问题:
*/
public class SQL注入 {
public static void main(String[] args) {
//login("dee","123456"); //正常登录
login(" 'or '1=1"," 'or '1=1 ");//SQL注入
}
//登录
public static void login(String username,String password){
Connection conn =null;
PreparedStatement st=null;
ResultSet rs=null;
try {
conn = JdbcUtils.getConnection();//获取连接
//sql需要改动
String sql="SELECT * FROM `users` where NAME=? and PASSWORD=?";//PrePareStatement防止SQL注入的本质,就是把传递进来的参数当作字符
st=conn.prepareStatement(sql);//预编译SQL,
//给预编译SQL赋值
st.setString(1,username);
st.setString(2,password);
rs=st.executeQuery();//执行
while (rs.next()){
System.out.println("password="+rs.getObject("PASSWORD"));
System.out.println("name="+rs.getObject("NAME"));
System.out.println("================================");
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
JdbcUtils.release(conn,st,rs);
}
}
}
-
PreparedStatement
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律