添加数据:

package com.hyc.study03;
import com.hyc.study02.utils.JDBCUtils;
import java.sql.Connection;
import java.sql.ResultSet;
import java.util.Date;
import java.sql.PreparedStatement;
import java.sql.SQLException;public class TestInsert {public static void main(String[] args) {Connection connection = null;PreparedStatement preparedStatement = null;ResultSet resultSet = null;try {//3、获取数据库连接connection = JDBCUtils.getConnection();//使用?占位符替代参数String sql = "INSERT INTO `users`(`id`,`NAME`,`PASSWORD`,`email`,`birthday`) " +"VALUES (?,?,?,?,?);";//4、获取执行sql的对象//预编译sql,先写sql,然后不执行preparedStatement = connection.prepareStatement(sql);//手动给参数赋值preparedStatement.setInt(1, 4);preparedStatement.setString(2, "hyc");preparedStatement.setString(3, "123456");preparedStatement.setString(4, "123456789@qq.com");//java.sql.Date 是数据库的Date ,只包含年月日信息 ,它是java.util.Date(包含年月日和时分秒信息)的子类preparedStatement.setDate(5, new java.sql.Date(new Date().getTime()));//5、执行sql语句//6、返回执行结果集int num = preparedStatement.executeUpdate();if (num > 0) {System.out.println("插入数据成功!");}} catch (SQLException throwables) {throwables.printStackTrace();} finally {//7、释放连接JDBCUtils.release(connection, preparedStatement, resultSet);}}
}

删除数据:

package com.hyc.study03;import com.hyc.study02.utils.JDBCUtils;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;public class TestDelete {public static void main(String[] args) {Connection connection = null;PreparedStatement preparedStatement = null;ResultSet resultSet = null;try {//3、获取数据库连接connection = JDBCUtils.getConnection();//使用?占位符替代参数String sql = "DELETE FROM `users` WHERE id=?";//4、获取执行sql的对象//预编译preparedStatement = connection.prepareStatement(sql);//手动给参数赋值preparedStatement.setInt(1, 4);//5、执行sql语句//6、返回执行结果集int num = preparedStatement.executeUpdate();if (num > 0) {System.out.println("删除数据成功!");}} catch (SQLException throwables) {throwables.printStackTrace();} finally {//7、释放连接JDBCUtils.release(connection, preparedStatement, resultSet);}}
}

修改数据:

package com.hyc.study03;
import com.hyc.study02.utils.JDBCUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;public class TestUpdate {public static void main(String[] args) {Connection connection = null;PreparedStatement preparedStatement = null;ResultSet resultSet = null;try {//3、获取数据库连接connection = JDBCUtils.getConnection();//使用?占位符替代参数String sql = "UPDATE `users` SET `NAME`=?,`email`=? WHERE `id`=?";//4、获取执行sql的对象//预编译preparedStatement = connection.prepareStatement(sql);//手动给参数赋值preparedStatement.setString(1, "zhangsan");preparedStatement.setString(2, "zhangsan@sina.com");preparedStatement.setInt(3, 1);//5、执行sql语句//6、返回执行结果集int num = preparedStatement.executeUpdate();if (num > 0) {System.out.println("更新数据成功!");}} catch (SQLException throwables) {throwables.printStackTrace();} finally {//7、释放连接JDBCUtils.release(connection, preparedStatement, resultSet);}}
}

查询数据:

package com.hyc.study03;
import com.hyc.study02.utils.JDBCUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;public class TestSelect {public static void main(String[] args) {Connection connection = null;PreparedStatement preparedStatement = null;ResultSet resultSet = null;try {//3、获取数据库连接connection = JDBCUtils.getConnection();//使用?占位符替代参数String sql = "SELECT * FROM `users` WHERE id=?";//4、获取执行sql的对象//预编译preparedStatement = connection.prepareStatement(sql);//手动给参数赋值preparedStatement.setInt(1, 1);//5、执行sql语句//6、返回执行结果集resultSet = preparedStatement.executeQuery();while (resultSet.next()) {System.out.println(resultSet.getString("NAME"));}} catch (SQLException throwables) {throwables.printStackTrace();} finally {//7、释放连接JDBCUtils.release(connection, preparedStatement, resultSet);}}
}

PreparedStatement防止SQL注入:
PreparedStatement防止SQL注入的本质是将传递进来的参数当做字符(想当于给传进来的参数包装成一个新的字符串),如果其中存在转义字符,例如 ‘ 会被直接转义。这样能够避免字符串拼接成非法的sql语句,造成数据泄露。

package com.hyc.study03;
import com.hyc.study02.utils.JDBCUtils;
import java.sql.*;public class PourIntoSql {public static void main(String[] args) {login("'' or '1=1", "123456");}public static void login(String username, String psw) {Connection connection = null;PreparedStatement preparedStatement = null;ResultSet resultSet = null;try {connection = JDBCUtils.getConnection();String sql = "SELECT * FROM `users` WHERE `NAME`=? AND `PASSWORD`=?";preparedStatement = connection.prepareStatement(sql);preparedStatement.setString(1, username);preparedStatement.setString(2, psw);resultSet = preparedStatement.executeQuery();while (resultSet.next()) {System.out.println(resultSet.getString("NAME"));System.out.println("===========================================");}} catch (SQLException throwables) {throwables.printStackTrace();} finally {JDBCUtils.release(connection, preparedStatement, resultSet);}}
}

结果:

在PreparedStatement的作用下,再尝试通过字符串拼接达到SQL注入的目的无法实现。

PreparedStatement防止SQL注入相关推荐

  1. 通过PreparedStatement预防SQL注入

    通过PreparedStatement预防SQL注入 简介:本文只讲PreparedStatement预防SQL注入的写法,大家学会就好. 推荐学习路线:JDBC数据库的连接->Connecti ...

  2. JDBC中使用preparedStatement防止SQL注入

    一.SQL注入 SQL注入是一种比较常见的网路攻击方式,一些恶意人员在需要用户输入的地方,恶意输入SQL语句的片段,通过SQL语句,实现无账号登录,甚至篡改数据库. 二.SQL注入实例 登录场景: 在 ...

  3. Statement和PreparedStatement(SQL注入问题)

    用于执行静态SQL语句并返回其生成的结果的对象.也就是说它是帮我们执行SQL语句,并且返回一个结果,就是干这个事情. 我们在连接建立以后,需要对数据库进行访问,执行命令或者是SQL语句,可以通过 St ...

  4. JDBC--代码实现增删改查、及SQL注入问题解决

    Startment.PreparedStatement对象详解及SQL注入问题 (1)Statement对象详解 1.提取工具类 #db.properties dirver=com.mysql.jdb ...

  5. 怎么进行mysql注入测试_MySQL for Java的SQL注入测试

    只要你学JDBC,基本上所有的人都会和你说,Statement不能防止SQL注入, PreparedStatement能够防止SQL注入. 基本上参加工作了一段时间之后还是这么认为的, 没错, 这句是 ...

  6. MySQL for Java的SQL注入测试

    2019独角兽企业重金招聘Python工程师标准>>> 只要你学JDBC,基本上所有的人都会和你说,Statement不能防止SQL注入, PreparedStatement能够防止 ...

  7. sql 整改措施 注入_记一次Sql注入 解决方案

    老大反馈代码里面存在sql注入,这个漏洞会导致系统遭受攻击,定位到对应的代码,如下图所示 image like 进行了一个字符串拼接,正常的情况下,前端传一个 cxk 过来,那么执行的sql就是 se ...

  8. JDBC模拟SQL注入和避免SQL注入

    模拟用户登录 用户名:fdsa 密码:fdsa' or '1'='1 select * from t_user where login_name='fdsa' and login_pwd='fdsa' ...

  9. MYSQLg高级-----SQL注入的理解(初级篇)以及如何防止注入

    SQL注入 1.SQL 注入概念 1.1 SQL注入是什么? 1.2 SQL注入定义 1.3 SQL注入特点 1.广泛性 2.隐蔽性 3.危害大 4.操作方便 1.4 SQl注入原理 1.5 SQl注 ...

  10. java回顾:JDBC、工具类、事务、SQL注入

    目录 1.概念 2.JDBC核心API的介绍 2.1 JDBC四个核心对象 2.2  JDBC访问数据库的步骤 3.JDBC注册驱动 3.1 jdbc测试 3.2 注册驱动 4.获取连接 4.1 AP ...

最新文章

  1. JZOJ__Day 8:【普及模拟】马农
  2. nvr服务器系统,【64路IPC网络存储服务器(WNVR)】 - 太平洋安防网
  3. 字符设备驱动基础篇2——用开发板来调试驱动模块的步骤
  4. sis 最新_《炙热的我们》火箭少女首胜,sis姐妹花遭遇惨败出局?
  5. 2014百度之星资格赛——Disk Schedule
  6. MMP,我说每年年会我怎么老是中不了奖,原来是这样
  7. 2022-03-07 学习docker开发vue前端
  8. php dao 接口,SSH中公共Dao层、Dao接口
  9. 2018.01.07软件更新公告
  10. 海康摄像机取流RTSP地址规则说明
  11. 解除极域电子教室软件控屏的方法
  12. QAC静态测试配置及使用教程
  13. 再深一点:如何给女朋友解释什么是微服务?
  14. 干货!网络推断与数据驱动的影响力最大化问题
  15. 现在投资最校园跑腿可行吗?
  16. 2021年 Python工程师平均薪资22K,又涨了11.9%!
  17. 中文字体设置fontFamily无效
  18. Python全栈开发【第一篇】:初识Python
  19. Unity第三人称控制实现方式
  20. 番茄花园GhostXP SP3极速装机版V03

热门文章

  1. 随机过程的均值函数、自相关函数、协方差函数
  2. 不可错过:教你创造一个有前途的迷你产品(下)
  3. 计算机应不应该学电路,应该怎么学才能入门电子技术
  4. 计算机课评课意见,信息技术应用 用计算机画函数图象第一课时评课稿
  5. 3Q双向可控硅与4Q双向可控硅对比好处
  6. 讲讲电感器的结构、分类及特性!
  7. 如何使用solidworks对产品打螺孔--问题解决
  8. 网页设计与制作教程(第2版)刘瑞斯+课本演练代码
  9. 成都11区+4县+5市高分辨率边界kml
  10. linux 服务器 告警声,服务器故障,报警声汇总