当前位置: 首页 > news >正文

PreparedStatement对象

MySQL 数据库学习笔记(续)

十、JDBC 重点!!!

10.7 PreparedStatement对象

PreparedStatement可以防止SQL注入,效率更高


1. 增

package com.guo.lesson03;import com.guo.lesson02.utils.JdbcUtils;import java.sql.*;public class TestInsert {public static void main(String[] args) {Connection conn = null;PreparedStatement st = null;try {conn = JdbcUtils.getConnection();//区别//使用?占位符代替参数String sql = "INSERT INTO users(id,NAME,PASSWORD,email,birthday) VALUES(?,?,?,?,?)";st = conn.prepareStatement(sql);//预编译SQL 先写sql,不执行//手动给参数赋值st.setInt(1,4);//idst.setString(2,"chenguo");//NAMEst.setString(3,"123456");//PASSWORDst.setString(4,"2981367375@qq.com");//email//注意点:  sql.Date        数据库    java.sql.Date()//         util.Date       Java     new Date().getTime() --- 获得时间戳st.setDate(5,new java.sql.Date(new Date(2001,12,5).getTime()));//birthday//执行int i = st.executeUpdate();if (i>0){System.out.println("插入成功");}} catch (SQLException e) {throw new RuntimeException(e);} finally {JdbcUtils.release(conn,st,null);}}
}

2. 删

package com.guo.lesson03;import com.guo.lesson02.utils.JdbcUtils;import java.sql.*;public class TestDelete {public static void main(String[] args) {Connection conn = null;PreparedStatement st = null;try {conn = JdbcUtils.getConnection();//区别//使用?占位符代替参数String sql = "DELETE FROM users where id=?";st = conn.prepareStatement(sql);//预编译SQL 先写sql,不执行//手动给参数赋值st.setInt(1,4);//执行int i = st.executeUpdate();if (i>0){System.out.println("删除成功");}} catch (SQLException e) {throw new RuntimeException(e);} finally {JdbcUtils.release(conn,st,null);}}
}

3. 改

package com.guo.lesson03;import com.guo.lesson02.utils.JdbcUtils;import java.sql.*;public class TestUpdate {public static void main(String[] args) {Connection conn = null;PreparedStatement st = null;try {conn = JdbcUtils.getConnection();//区别//使用?占位符代替参数String sql = "UPDATE users SET `NAME` =? WHERE id =?";st = conn.prepareStatement(sql);//预编译SQL 先写sql,不执行//手动给参数赋值st.setString(1,"李悦");//NAMEst.setInt(2,4);//id//执行int i = st.executeUpdate();if (i>0){System.out.println("更新成功");}} catch (SQLException e) {throw new RuntimeException(e);} finally {JdbcUtils.release(conn,st,null);}}
}

4. 查

package com.guo.lesson03;import com.guo.lesson02.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 conn = null;PreparedStatement st = null;ResultSet rs = null;try {conn = JdbcUtils.getConnection();String sql = "select * from users where id =?";st = conn.prepareStatement(sql);st.setInt(1,4);//传递参数rs = st.executeQuery();if (rs.next()){System.out.println(rs.getString("NAME"));}} catch (SQLException e) {throw new RuntimeException(e);} finally {JdbcUtils.release(conn,st,rs);}}
}

5. 防止SQL注入

-- PreparedStatement 防止SQL注入的本质:把传递进来的参数当做字符
-- 假设其中存在转义字符,就直接忽略,比如说:引号会被直接转义

package com.guo.lesson03;import com.guo.lesson02.utils.JdbcUtils;import java.sql.*;public class SQL注入 {public static void main(String[] args) {//login("李悦","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();// PreparedStatement 防止SQL注入的本质:把传递进来的参数当做字符// 假设其中存在转义字符,就直接忽略。比如说:引号会被直接转义String sql = "SELECT * FROM users WHERE `NAME` =? AND `PASSWORD` =?";st = conn.prepareStatement(sql);st.setString(1,username);st.setString(2,password);rs = st.executeQuery(); //查询完毕会返回一个结果集if (rs.next()){System.out.println(rs.getString("NAME"));System.out.println(rs.getString("PASSWORD"));System.out.println("==================================");}else {System.out.println("用户名或密码错误");}} catch (SQLException e) {throw new RuntimeException(e);} finally {JdbcUtils.release(conn,st,rs);}}
}

总结

  1. PreparedStatement 采用预编译SQL,使用 ? 作为参数占位符
  2. 通过 setXxx() 方法赋值,自动转义特殊字符,彻底解决 SQL 注入
  3. 性能比 Statement 更高,可重复执行
  4. 企业开发中必须使用 PreparedStatement,禁止使用 Statement
http://www.jsqmd.com/news/650261/

相关文章:

  • Figma中文界面本地化:告别语言障碍的设计工具革命
  • 保姆级教程:让Ollama的Embedding API完美兼容OpenAI客户端(Python/Node.js双版本)
  • 别再只会用单片机了!用FPGA设计抢答器的5个优势与避坑指南(附Quartus II/Vivado工程)
  • 如何快速配置AMD处理器性能:RyzenAdj终极调优指南
  • 如何永久保存你的QQ空间回忆?GetQzonehistory帮你一键备份青春时光
  • 选购二板注塑机,盘点值得推荐的多物料注塑机品牌公司 - 工业推荐榜
  • 长文本推理入门到精通:8K基座模型如何扩128K上下文(非常详细),收藏这篇就够了!
  • 如何轻松实现多平台直播:OBS Multi RTMP插件的完整使用指南
  • 别再只盯着MSE了!风电功率预测模型评估,这5个指标更实用(附Python代码)
  • 终极指南:Axure RP全版本中文汉化完整解决方案
  • WinUtil:Windows系统管理的革命性一体化解决方案
  • 3步高效解决魔兽争霸3现代兼容性问题:WarcraftHelper完整使用指南
  • 解析和田玉收藏品店铺,新疆本地人推荐,哪家质量高可探寻 - myqiye
  • 解锁Android模拟器新境界:Magisk系统级权限实战指南
  • 构建千万级数据无代码平台:NocoDB性能调优与架构优化实战指南
  • 保姆级教程:用Groot可视化调试ROS机器人行为树(附乌龟巡逻实战代码)
  • Rust的模块可见性规则与pub关键字在crate组织中的最佳实践
  • 和你一起品味气动道岔大型厂家,品质优良怎么选 - 工业品网
  • 天津GEO优化服务机构排行 助力企业品牌AI曝光提升 - 资讯焦点
  • 单片机毕设容易的开题报告答疑
  • 告别裸机轮询:用STM32CubeMX和HAL库中断方式高效读取SHT30温湿度
  • BSCI验厂辅导服务 - 资讯焦点
  • D2DX终极指南:如何让经典暗黑破坏神2在现代PC上重获新生?
  • Go 语言 slice 容量增长策略解析:为何奇偶容量表现不同?
  • 减肥全流程实操教程:10步科学减脂,新手零门槛轻松上手
  • 考虑多维度负荷特征的用户侧可调潜力评估与建模研究
  • 3步解锁PC游戏新体验:DS4Windows手柄映射终极指南
  • 如何高效使用Python条形码识别神器:pyzbar专业开发指南
  • 庭院装饰升级新方向 —— 湖北百福金属铝艺系统化解决方案 - 资讯焦点
  • 5分钟掌握FanControl:Windows平台终极风扇控制解决方案