详解PreparedStatement
详解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(,"李四");
ps.setInt(,);
// 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();
}
}
}
详解PreparedStatement的更多相关文章
- 执行对象Statement、PreparedStatement和CallableStatement详解 JDBC简介(五)
执行对象是SQL的执行者,SQL是“安排好的任务”,执行对象就是“实际工作的人”. 执行对象有三种: Statement.PreparedStatement和CallableStatement,他们都 ...
- 执行对象Statement、PreparedStatement和CallableStatement详解
执行对象是SQL的执行者,SQL是"安排好的任务",执行对象就是"实际工作的人". 执行对象有三种: Statement.PreparedStatement和C ...
- [转]阿里巴巴数据库连接池 druid配置详解
一.背景 java程序很大一部分要操作数据库,为了提高性能操作数据库的时候,又不得不使用数据库连接池.数据库连接池有很多选择,c3p.dhcp.proxool等,druid作为一名后起之秀,凭借其出色 ...
- (转)Spring JdbcTemplate 方法详解
Spring JdbcTemplate方法详解 文章来源:http://blog.csdn.net/dyllove98/article/details/7772463 JdbcTemplate主要提供 ...
- Java程序员从笨鸟到菜鸟之(一百零二)sql注入攻击详解(三)sql注入解决办法
sql注入攻击详解(二)sql注入过程详解 sql注入攻击详解(一)sql注入原理详解 我们了解了sql注入原理和sql注入过程,今天我们就来了解一下sql注入的解决办法.怎么来解决和防范sql注入, ...
- Java程序员从笨鸟到菜鸟之(一百)sql注入攻击详解(一)sql注入原理详解
前段时间,在很多博客和微博中暴漏出了12306铁道部网站的一些漏洞,作为这么大的一个项目,要说有漏洞也不是没可能,但其漏洞确是一些菜鸟级程序员才会犯的错误.其实sql注入漏洞就是一个.作为一个菜鸟小程 ...
- Tomcat 6 JNDI数据源详解
数据库连接池这个概念应该都不陌生,在Java中连接池也就是数据库的连接池,它是一种采用连接复用的思想避免多次连接造成资源的浪费机制. 最常见的连接池就是DBCP和C30P了,在tomcat中默认使用的 ...
- JDBC常用接口详解
JDBC中常用接口详解 ***DriverManager 第一.注册驱动 第一种方式:DriverManager.registerDriver(new com.mysql.jdbc.Driver()) ...
- IOS数据库操作SQLite3使用详解(转)
iPhone中支持通过sqlite3来访问iPhone本地的数据库.具体使用方法如下1:添加开发包libsqlite3.0.dylib首先是设置项目文件,在项目中添加iPhone版的sqlite3的数 ...
随机推荐
- mongodb使用mongos链接复制集
我们知道mongodb现在生产环境大部分还是使用的复制集来作为主流,据我了解.很多公司现在都是使用复制集的方式,而我们通过mongos可以巧妙的解决链接的问题,我们先从环境说起: 首先我们要模仿搭建的 ...
- Python学习---Python下[字符串]的学习
字符串[不可变] 重点方法: in count() center(50,'*') startswith('h') endwith('h') find('r') : 找不到返回 -1 index('r' ...
- IE浏览器兼容问题(下)——IE6的常见问题
IE6常见兼容性问题 1.盒模型问题 (1)DTD问题 DTD:文档定义类型,规定了要遵循的书写规范. 如果不写DTD,高级浏览器还是可以正常加载,IE6会以怪异模式进行加载. 盒模型:正常应该是外扩 ...
- Redis入门实例(Redis+Sprint+maven创建工程)
一.>创建一个maven工程应用和相关配置:Redis_study,创建工程应用过程略 1.>配置pom.xml:文件内容如下 <project xmlns="http:/ ...
- linux 安装pip 和python3
前言: python3应该是python的趋势所在,当然目前争议也比较大,这篇随笔的主要目的是记录在linux6.4下搭建python3环境的过程 以及碰到的问题和解决过程. 另外,如果本机安装了py ...
- Android进阶笔记17:Android手机屏幕坐标系
1. 手机屏幕坐标系: 整个坐标系是以手机屏幕左上角为原点(0,0),如下:
- bzoj3106 [cqoi2013]棋盘游戏
Description 一个n*n(n>=2)棋盘上有黑白棋子各一枚.游戏者A和B轮流移动棋子,A先走. l A的移动规则:只能移动白棋子.可以往上下左右四个方向之一移动一格. ...
- springmvc使用map接收form表单的参数
其实只需要在map前面加上@RequestParam参数即可,jsp的name等都不变 public String queryByCondition(@RequestParam Map<Stri ...
- 程序中实现两个DataTable的Left Join效果(修改了,网上第二个DataTable为空,所处的异常)
public static DataTable Join(DataTable First, DataTable Second, DataColumn[] FJC, DataColumn[] SJC) ...
- PHP----练习-----三级联动
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...