一、PreparedStatement介绍

    在SQL中包含特殊字符或SQL的关键字(如: ' or 1 or ')时Statement将出现不可预料的结果(出现异常或查询的结果不正确),可用PreparedStatement来解决。

public class StudentDemo{

	@Test
public void testAddPerson() throws Exception{
Person p = new Person(0,"CCC","SH",22,800);
addPerson(p);
} @Test
public void testqueryPerson() throws Exception{
queryPerson();
} /*
* 插入数据
*/
public static void addPerson(Person p) throws Exception{
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null; try{
// 建立连接
con = JdbcTools.getConnection(); // 创建语句
String sql = "insert into person(id,name,city,age,salary) values(?,?,?,?,?)";
ps = con.prepareStatement(sql);
ps.setInt(1,p.getId());
ps.setString(2,p.getName());
ps.setString(3,p.getCity());
ps.setInt(4,p.getAge());
ps.setFloat(5,p.getSalary()); // 执行语句
int i = ps.executeUpdate(); // 处理结果
System.out.println("有" + i + "行受到影响"); }finally{
JdbcTools.releaseResource(con,ps,rs);
}
} /*
* 查询数据
*/
public static void queryPerson() throws Exception{
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null; try{
//建立连接
con = JdbcTools.getConnection(); //创建语句
String sql = "select id,name,city, age,salary from person";
ps = con.prepareStatement(sql); //执行语句
rs = ps.executeQuery(); //处理结果
while(rs.next()){
System.out.println(rs.getObject("id") + "\t"
+ rs.getObject("name") + "\t"
+ rs.getObject("city") + "\t"
+ rs.getObject("age") + "\t"
+ rs.getObject("salary"));
}
}
finally{
JdbcTools.releaseResource(con,ps,rs);
}
}
}

结果:

    

 

二、PreparedStatement的优点

(1)性能

     PreparedStatement 能最大可能提高性能。

     prepareStatement会先初始化SQL,先把这个SQL提交到数据库中进行预处理,多次使用可提高效率。   
     createStatement不会初始化,没有预处理,没次都是从0开始执行SQL。

     DBServer会对预编译语句提供性能优化。因为预编译语句有可能被重复调用,所以语句在被DBServer的编译器编译后的执行代码被缓存下来,那么下次调用时只要是相同的预编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中就会得到执行。

     在statement语句中,即使是相同操作但因为数据内容不一样,所以整个语句本身不能匹配,没有缓存语句的意义.事实是没有数据库会对普通语句编译后的执行代码缓存.这样每执行一次都要对传入的语句编译一次。

 

(2)安全性

     PreparedStatement可以防止SQL注入攻击,而Statement却不能。

     String sql = "select * from tb_name where name= '"+varname+"' and passwd='"+varpasswd+"'";

     如果我们把[' or '1' = '1]作为varpasswd传入进来.用户名随意,看看会成为什么?

     select * from tb_name = '随意' and passwd = '' or '1' = '1';因为'1'='1'肯定成立,所以可以任何通过验证。

     而如果你使用预编译语句你传入的任何内容就不会和原来的语句发生任何匹配的关系,只要全使用预编译语句你就用不着对传入的数据做任何过滤。

 

(3)代码的可读性与可维护性

st.executeUpdate("insert into tb_name (col1,col2,col2,col4) values ('"+var1+"','"+var2+"',"+var3+",'"+var4+"')");
ps = con.prepareStatement("insert into tb_name (col1,col2,col2,col4) values (?,?,?,?)");
ps.setString(1,var1);
ps.setString(2,var2);
ps.setString(3,var3);
ps.setString(4,var4);
ps.executeUpdate();

可以看出第一种和第二种的巨大差别。

 

三、通用的增删改操作

  利于PreparedStatement我们可以写一个通用的增删改操作。

   /*
* 通用的增删改方法
* 执行SQL语句,使用PreparedStatemnt
* @param sql 带占位符的sql语句
* @param args 填写SQL占位符的可变参数
*/
public static void update(String sql,Object...args){
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null; try{
con = JdbcTools.getConnection();
ps = con.prepareStatement(sql); for(int i = 0;i < args.length;i++){
ps.setObject(i + 1,args[i]);
} ps.execute(); }catch (Exception e) {
e.printStackTrace();
}
finally{
JdbcTools.releaseResource(con,ps,rs);
} }

JDBC基础学习(二)—PreparedStatement的更多相关文章

  1. Python入门基础学习 二

    Python入门基础学习 二 猜数字小游戏进阶版 修改建议: 猜错的时候程序可以给出提示,告诉用户猜测的数字偏大还是偏小: 没运行一次程序只能猜测一次,应该提供多次机会给用户猜测: 每次运行程序,答案 ...

  2. Python基础学习二

    Python基础学习二 1.编码 utf-8编码:自动将英文保存为1个字符,中文3个字符.ASCll编码被囊括在内. unicode:将所有字符保存为2给字符,容纳了世界上所有的编码. 2.字符串内置 ...

  3. Go基础学习(二)

    数组[array] 数组定义[定义后长度不可变] 12 symbol := [...]string{USD: "$", EUR: "€", GBP: " ...

  4. Django基础学习二

    今天继续学习django的基础 学习用户提交url如何获得返回值 1.首先需要在工程的urls文件定义指定的urls要路由给哪个函数 在这个例子中,我们定义home的urls路由给views里的tes ...

  5. WebService基础学习(二)—三要素

    一.Java中WebService规范      JAVA 中共有三种WebService 规范,分别是JAX-WS.JAX-RS.JAXM&SAAJ(废弃).   1.JAX-WS规范    ...

  6. JDBC基础学习(六)—数据库连接池

    一.数据库连接池介绍 1.数据库连接池的缘由      对于一个简单的数据库应用,由于对于数据库的访问不是很频繁.这时可以简单地在需要访问数据库时,就新创建一个连接,用完后就关闭它,这样做也不会带来什 ...

  7. JDBC基础学习(五)—批处理插入数据

    一.批处理介绍      当需要成批插入或者更新记录时.可以采用Java的批量更新机制,这一机制允许多条语句一次性提交给数据库批量处理.通常情况下比单独提交处理更有效率. JDBC的批量处理语句包括下 ...

  8. salesforce lightning零基础学习(二) lightning 知识简单介绍----lightning事件驱动模型

    看此篇博客前或者后,看一下trailhead可以加深印象以及理解的更好:https://trailhead.salesforce.com/modules/lex_dev_lc_basics 做过cla ...

  9. CSS入门基础学习二

    我们下午继续学习CSS的入门基础,搬上你的小板凳赶快进入吧! 一.背景(background) Background-color:背景颜色 background-image (背景图片) backgr ...

随机推荐

  1. Github网站加载不完全,响应超时,如何解决

    Github是一个代码托管平台和开发者社区,开发者可以在Github上创建自己的开源项目并与其他开发者协作编码.毫不夸张地说,高效利用Github是一个优秀的程序员必备的基本素质.可是,有的用户在打开 ...

  2. WebApi接口传参不再困惑:传参详解

    原文出处: 懒得安分 前言:还记得刚使用WebApi那会儿,被它的传参机制折腾了好久,查阅了半天资料.如今,使用WebApi也有段时间了,今天就记录下API接口传参的一些方式方法,算是一个笔记,也希望 ...

  3. HttpRequest获取文件流,HttpResponse输出文件流

    HttpResponse输出文件: Response.Clear(); Response.ContentType = "application/octet-stream"; //通 ...

  4. 每天一个linux命令(49)--diff命令

    diff 命令是 Linux 上非常重要的工具,用于比较文件的内容,特别是比较两个版本不同的文件以找到改动的地方.diff 在命令行中打印每一个行的改动.最新版本的diff还支持二进制文件,diff ...

  5. 计算机存储负数以及int转byte时-128的出现

    我们看下面这段代码 输出的结果的是128,这个没什么疑问 但是当我们不改变数值仅仅加了一个强制转换后 这时我们会发现结果会变成负的128.这时候我们就要怀疑了,为什么会出现这样的结果呢? 对于这个问题 ...

  6. 2017-2-18 net 输入输出语句

    控制台程序的创建,输出,输入语句,定义变量,变量赋值,值覆盖,值拼接,值打印两种数据类型,整形类型转换 知识点: 1.输出语句 Console.WriteLine("");光标换行 ...

  7. linux 之程序管理

    一个程序的父进程可以用PPID来判断   命令ps -l 可以用来观察程序相关的输出信息   被关闭的程序又产生:crontab或者父进程产生的   我们将常驻在系统中的程序称为:服务(daemon) ...

  8. MES项目参观交流会

    2016年11月10日,普实软件组织了河南蔚林.江苏正恺.吴通控股.上海锐拓等单位的26位企业家代表,走进科兴电器,开展企业家现场交流活动.企业家们参观了科兴花园式数字化工厂.感受了大数据中心的强大功 ...

  9. Java中代理对象的使用小结

    在某些情况下,一个客户不想或不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到了中介作用,这不仅仅使用代理模式,还可以实现适配器模式.装饰模式等. 代理对象内部含有对真实对象的引用,从而 ...

  10. Oracle 一些简单操作

    登录oracle 以root用户切换到oracle数据库用户:su - oracle 输入sqlplus /nolog 不连接任何数据库 conn /as sysdba 用sysdba登录 start ...