详解PreparedStatement

 /*** PrepareStatement 测试插入数据库*//*** 如果使用Statement,那么就必须在SQL语句中,实际地去嵌入值,比如之前的insert语句** 但是这种方式有一个弊端,第一,是容易发生SQL注入,SQL注入,简单来说,就是,你的网页的用户* 在使用,比如论坛的留言板,电商网站的评论页面,提交内容的时候,可以使用'1 or 1',诸如此类的* 非法的字符,然后你的后台,如果在插入评论数据到表中的时候,如果使用Statement,就会原封不动的* 将用户填写的内容拼接在SQL中,此时可能会发生对数据库的意外的损坏,甚至数据泄露,这种情况就叫做* SQL注入** 第二种弊端,就是性能的低下,比如insert into test_user(name,age) values('张三',25)* insert into test_user(name,age) values('李四',26)* 其实两条SQL语句的结构大同小异,但是如果使用这种方式,在MySQL中执行SQL语句的时候,却需要对* 每一条SQL语句都实现编译,编译的耗时在整个SQL语句的执行耗时中占据了大部分的比例* 所以,Statement会导致执行大量类似SQL语句的时候的,性能低下** 如果使用PreparedStatement,那么就可以解决上述的两个问题* 1、SQL注入,使用PreparedStatement时,是可以在SQL语句中,对值所在的位置使用?这种占位符的* 使用占位符之后,实际的值,可以通过另外一份放在数组中的参数来代表。此时PreparedStatement会对* 值做特殊的处理,往往特殊处理后,就会导致不法分子的恶意注入的SQL代码失效* 2、提升性能,使用PreparedStatement之后,其实结构类似的SQL语句,都变成一样的了,因为值的地方* 都会变成?,那么一条SQL语句,在MySQL中只会编译一次,后面的SQL语句过来,就直接拿编译后的执行计划* 加上不同的参数直接执行,可以大大提升性能*/private static void preparedStatement() {// 总结一下JDBC的最基本的使用过程// 1、加载驱动类:Class.forName()// 2、获取数据库连接:DriverManager.getConnection()// 3、创建SQL语句执行句柄:Connection.createStatement()// 4、执行SQL语句:Statement.executeUpdate()// 5、释放数据库连接资源:finally,Connection.close()// 定义数据库连接对象// 引用JDBC相关的所有接口或者是抽象类的时候,必须是引用java.sql包下的// java.sql包下的,才代表了java提供的JDBC接口,只是一套规范// 至于具体的实现,则由数据库驱动来提供,切记不要引用诸如com.mysql.jdbc包的类Connection conn=null;//定义SQL语句执行句柄:PrepareStatement对象//PreparedStatement对象,其实就是底层会基于Connection数据库连接//可以让我们方便的针对数据库中的表,执行增删改查的SQL语句//比如和insert update delete和select语句PreparedStatement ps=null;try {// 第一步,加载数据库的驱动,我们都是面向java.sql包下的接口在编程,所以// 要想让JDBC代码能够真正操作数据库,那么就必须第一步先加载进来你要操作的数据库的驱动类// 使用Class.forName()方式来加载数据库的驱动类// Class.forName()是Java提供的一种基于反射的方式,直接根据类的全限定名(包+类)// 从类所在的磁盘文件(.class文件)中加载类对应的内容,并创建对应的Class对象Class.forName("com.mysql.jdbc.Driver");// 获取数据库的连接// 使用DriverManager.getConnection()方法获取针对数据库的连接// 需要给方法传入三个参数,包括url、user、password// 其中url就是有特定格式的数据库连接串,包括“主协议:子协议://主机名:端口号//数据库”conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/spark_project?characterEncoding=utf8","root","root");// 基于数据库连接Connection对象,创建SQL语句执行句柄,Statement对象// prepareStatement对象,就是用来基于底层的Connection代表的数据库连接// 允许我们通过java程序,通过prepareStatement对象,向MySQL数据库发送SQL语句// 从而实现通过发送的SQL语句来执行增删改查等逻辑// 第一个,SQL语句中,值所在的地方,都用问好代表String sql = "insert into user(name,age) values(?,?)";ps = conn.prepareStatement(sql);// 第二个,必须调用PreparedStatement的setX()系列方法,对指定的占位符设置实际的值ps.setString(1,"李四");ps.setInt(2,26);// Statement.executeUpdate()方法,就可以用来执行insert、update、delete语句// 返回类型是个int值,也就是SQL语句影响的行数// 第三个,执行SQL语句时,直接使用executeUpdate()即可,不用传入任何参数int rtn = ps.executeUpdate();System.out.println("SQL语句影响了【" + rtn + "】行。");}catch (Exception e){e.printStackTrace();}finally {try {// 最后一定要记得在finally代码块中,尽快在执行完SQL语句之后,就释放数据库连接if (ps != null){ps.close();}if (conn !=null){conn.close();}}catch (Exception e){e.printStackTrace();}}}

转载于:https://www.cnblogs.com/gentle-awen/p/10159300.html

详解PreparedStatement相关推荐

  1. JDBC学习笔记02【ResultSet类详解、JDBC登录案例练习、PreparedStatement类详解】

    黑马程序员-JDBC文档(腾讯微云)JDBC笔记.pdf:https://share.weiyun.com/Kxy7LmRm JDBC学习笔记01[JDBC快速入门.JDBC各个类详解.JDBC之CR ...

  2. MySQL攻略 - JDBC程序SQL注入,PreparedStatement接口详解与案例练习,JDBC相关API小结

    文章目录 SQL注入 Statement详解 基本介绍 Navicat演示SQL注入 JDBC演示SQL注入 PreparedStatement详解 基本介绍 预处理好处 预处理案例(selete语句 ...

  3. Mybatis复习笔记3:映射文件详解

    映射文件详解 参数处理(#和$的区别) #{}:可以获取map中的值或者实体对象属性的值: ${}:可以获取map中的值或者实体对象属性的值: select * from person where i ...

  4. Spring JdbcTemplate方法详解

    2019独角兽企业重金招聘Python工程师标准>>> Spring JdbcTemplate方法详解 标签: springhsqldbjava存储数据库相关sql 2012-07- ...

  5. Spring JDBC详解

    <Spring JDBC详解> 本文旨在讲述Spring JDBC模块的用法.Spring JDBC模块是Spring框架的基础模块之一. 一.概述 在Spring JDBC模块中,所有的 ...

  6. logback的使用和logback.xml详解

    一.logback的介绍 Logback是由log4j创始人设计的另一个开源日志组件,官方网站: http://logback.qos.ch.它当前分为下面下个模块: logback-core:其它两 ...

  7. [转]阿里巴巴数据库连接池 druid配置详解

    一.背景 java程序很大一部分要操作数据库,为了提高性能操作数据库的时候,又不得不使用数据库连接池.数据库连接池有很多选择,c3p.dhcp.proxool等,druid作为一名后起之秀,凭借其出色 ...

  8. Spring Boot 2.x基础教程:默认数据源Hikari的配置详解

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 翟永超 来源 | http://blog.di ...

  9. mybatis注解详解

    mybatis注解详解 首 先当然得下载mybatis-3.0.5.jar和mybatis-spring-1.0.1.jar两个JAR包,并放在WEB-INF的lib目录下 (如果你使用maven,则 ...

最新文章

  1. 东枝戛古舍利佛塔群(缅三十五)
  2. 重装系统 计算机意外遇到错误无法运行,win7系统重装笔记本提示"计算机意外的重新启动或遇到错误"的解决方法...
  3. 29.rust类型转换.rs
  4. xilinx c语言编程,使用Xilinx SDSoc在Xilinx zcu102开发板上编程HelloWorld
  5. Swarm的进化和大规模应用
  6. MySQL 大表优化方案,收藏了细看!
  7. vs 正则表达式转大写_liunx之通配符amp;正则表达式
  8. 如何把MySql数据库中的数据导入到MyCat集群中_---Linux运维工作笔记050
  9. linux集群之LVS入门和企业级实战(续一)
  10. 《软件设计师》考点分布
  11. 字迹相似度测试软件,文章相似度检测_文章在线相似度检测_文章相似度检测软件-纸牌屋检测工具...
  12. 如何自制圆环_PPT中如何制作环形图高级教程
  13. (zz)楚王何故好细腰
  14. 程序员基础的硬件知识(cpu、主板、显卡、内存条等)
  15. 域名证书续期 SSL证书如何续费
  16. C语言实现通讯录(含文件保存)
  17. js 操作在当前日期加减(天、周、月、年数)
  18. JESD204标准概述
  19. linux系统可以玩星际争霸吧,Linux下也玩星际争霸
  20. HTTP代理关闭还是自动的呢?

热门文章

  1. 【SpringMVC】与权限拦截器冲突导致的Cors跨域设置失效问题
  2. 《图解CSS3:核心技术与案例实战》——2.4节动态伪类选择器
  3. mingw32-gcc.exe: error: CreateProcess: No such file or directory
  4. 如何评估互阻抗放大器(第 2 部分)
  5. [转]Shell脚本中发送html邮件的方法
  6. 妙用终截者密码锁防***注入Explorer
  7. linux下apache+php+mysql升级安装过程
  8. Python 在编程语言中是什么地位?为什么很多大学不教 Python?
  9. 禅道设置bug模板_JPress v3.0 beta.2 发布,修复 bug 和完善产品细节
  10. 文件服务器搭建 xp,xp文件服务器搭建