JDBC详解系列(四)之建立Stament和执行SQL语句

时间:2022-09-08 19:27:00

建立Stament

  在获得连接之后,我们就可以跟数据库进行交互了。

  在JDBC中,我们发送SQL语句到数据库这些操作时通过Stament,Preparement,CallableStatement这几个对象进行的。

一.Stament##

  Stament是一个接口,其具体实现由供应商所提供。调用方法:

Statement stmt = null;
try {
stmt = conn.createStatement( );
stmt.executeXXX(SQL);
. . .
}
catch (SQLException e) {
. . .
}
finally {
. . .
}

  Stament对象执行静态SQL语句,并返回相应结果。因此,其不接收参数。在执行完毕之后务必将打开的连接关闭,这是一个好的习惯。

二.PreparedStatement

  PreparedStatement 接口扩展了 Statement 接口,大多数情况下PreparedStatement 中的SQL语句已经被预编译过,因而当其执行时,只需DBMS运行SQL语句,而不必先编译。调用方法:

PreparedStatement pstmt = null;
try {
String SQL = "Update Employees SET age = ? WHERE id = ?";
pstmt = conn.prepareStatement(SQL);
pstmt .setXXX();
...
pstmt.executeXXX(); . . .
}
catch (SQLException e) {
. . .
}
finally {
. . .
}

  PreparedStatement在创建对象时对SQL进行了预编译。参数都被用 ? 符号表示,这是已知的参数标记。在执行 SQL 语句之前,必须赋予每一个参数确切的数值。通过setXXX()来设定参数,其中 XXX 表示你希望绑定到输入参数的 Java 数据类型。每个参数标记映射它的序号位置。第一标记表示位置 1 ,下一个位置为 2 等等。这种方法不同于 Java 数组索引,它是从 0 开始的。

三.CallableStatement

  CallableStatement 对象是用来调用数据库的存储过程的。调用方法:

CallableStatement cstmt = null;
try {
String SQL = "{call getEmpName (?, ?)}";
cstmt = conn.prepareCall (SQL);
stmt.setInt(1, empID);
stmt.registerOutParameter(2, java.sql.Types.VARCHAR);
stmt.execute();
. . .
}
catch (SQLException e) {
. . .
}
finally {
. . .
}

  有三种类型的参数有:IN,OUT 和 INOUT。PreparedStatement 对象只使用 IN 参数。CallableStatement 对象可以使用所有的三个参数。CallableStatement 也是通过 setXXX() 方法绑定对应的 Java 数据类型。使用 OUT 和 INOUT 参数时,你就必须使用额外的 CallableStatement 方法 - registerOutParameter()。 registerOutParameter() 方法绑定 JDBC 数据类型,该数据是存储过程返回的值。CallableStatement 的 getXXX ()方法将获取返回的参数值,()内的参数与registerOutParameter相对应。

四.总结##

  存储过程使用的必然是CallableStatement了。而Stament和PreparedStament之间使用时还是需要有所取舍的。

  1.Stament不接受参数,其有可能会被SQL注入。但其开销比较小;每次执行SQL语句,数据库都要对SQL语句进行编译,从0开始执行。在只进行一次或少量查询并返回结果时,其效率高于PreparedStament。但无法防止SQL注入。

  2.PreparedStatement是预编译的,当执行时,DBMS只需要运行SQL语句,而无需先编译再执行。所以当在我们处理批量的时候,使用PreparedStatement可以大大的提高效率。同时,也可以防止SQL注入。

  3.虽然Stament在数量少时进行SQL语句开销小,但其存在SQL注入的问题。因此,我们在用户可以更改SQL输入的地方,如WEB等,应该使用PreparedStatement。任何不经过PreparedStatement处理的情况下,用户的所有输入都不应该传递给SQL语句。

执行SQL语句

  我们可以查看Stement接口的方法:

JDBC详解系列(四)之建立Stament和执行SQL语句

  我们可以看到总共就三种类型:

方法 作用
execute() 主要在存储过程和动态SQL语句中使用
executeUpdate() 对应INSERT,UPDATE 或 DELETE 语句
executeQuery() 对应SELECT,查询专用

  根据实际的需要对这些类型进行选择,在此就不进行详细讲解了。

JDBC详解系列(四)之建立Stament和执行SQL语句的更多相关文章

  1. JDBC详解系列(三)之建立连接(DriverManager.getConnection)

      在JDBC详解系列(一)之流程中,我将数据库的连接分解成了六个步骤. JDBC流程: 第一步:加载Driver类,注册数据库驱动: 第二步:通过DriverManager,使用url,用户名和密码 ...

  2. JDBC详解系列(二)之加载驱动

    ---[来自我的CSDN博客](http://blog.csdn.net/weixin_37139197/article/details/78838091)---   在JDBC详解系列(一)之流程中 ...

  3. JDBC详解系列(一)之流程

    ---[来自我的CSDN博客](http://blog.csdn.net/weixin_37139197/article/details/78838091)--- JDBC概述   使用JDBC也挺长 ...

  4. Mybatis源码详解系列(四)--你不知道的Mybatis用法和细节

    简介 这是 Mybatis 系列博客的第四篇,我本来打算详细讲解 mybatis 的配置.映射器.动态 sql 等,但Mybatis官方中文文档对这部分内容的介绍已经足够详细了,有需要的可以直接参考. ...

  5. Eureka详解系列(四)--Eureka Client部分的源码和配置

    简介 按照原定的计划,我将分三个部分来分析 Eureka 的源码: Eureka 的配置体系(已经写完,见Eureka详解系列(三)--探索Eureka强大的配置体系): Eureka Client ...

  6. Handler详解系列(四)——利用Handler在主线程与子线程之间互发消息,handler详解

    MainActivity如下: package cc.c; import android.app.Activity; import android.os.Bundle; import android. ...

  7. BIML 101 - ETL数据清洗 系列 - BIML 快速入门教程 - 连接数据库执行SQL语句

    BIML 101 - BIML 快速入门教程 第一节 连接数据库执行SQL语句 本小节将用BIML建一个简单的可以执行的包. 新建一个biml文件,贴入下面的代码 1 <Biml xmlns=& ...

  8. 源码详解系列&lpar;六&rpar; ------ 全面讲解druid的使用和源码

    简介 druid是用于创建和管理连接,利用"池"的方式复用连接减少资源开销,和其他数据源一样,也具有连接数控制.连接可靠性测试.连接泄露控制.缓存语句等功能,另外,druid还扩展 ...

  9. 源码详解系列&lpar;八&rpar; ------ 全面讲解HikariCP的使用和源码

    简介 HikariCP 是用于创建和管理连接,利用"池"的方式复用连接减少资源开销,和其他数据源一样,也具有连接数控制.连接可靠性测试.连接泄露控制.缓存语句等功能,另外,和 dr ...

随机推荐

  1. 解析html并使用canvas进行渲染

    在学习html5的时候,使用canvas实现了对html文本的解析和渲染,支持的tag有<p>.<i>.<b>.<u>.<ul>.<l ...

  2. 虚拟机VMBox的空间扩展和对加载进来资源的扩展

    来源于:http://www.linuxidc.com/Linux/2015-01/111186.htm 其中有点bug就自己重新复制黏贴下 VirtualBox虚拟机在使用的过程中,有时会遇到磁盘大 ...

  3. Metasploit基础命令

    msf > show exploits 列Metasploip的所有可用的渗透测试框架.在MSF终端中可以针对渗透测试中发现的安全漏洞来实施相应的渗透攻击. msf > show auxi ...

  4. 状态模式(State)

    状态模式,从字面意思上来讲应该是很简单的,就是针对实际业务上的内容,当类的内部的状态发生改变时,给出不同的响应体,就像现实中的人一样,早上没有吃饭,状态不好,上班.上课都会打哈欠,中午了,吃过午饭,又 ...

  5. &lbrack;转&rsqb;标准C&plus;&plus;字符串string以及MFC6&period;0字符串CString的tokenize和split函数

    标准字符串的方法: /******************************************** the tokenize function for std::string ****** ...

  6. do&period;&period;&period;while&lpar;0&rpar;神奇

    1. do...while(0)消除goto语句. 通常,假设在一个函数中開始要分配一些资源.然后在中途运行过程中假设遇到错误则退出函数,当然,退出前先释放资源,我们的代码可能是这样: version ...

  7. &commat;Component &commat;Controller &commat;Service &commat;Repository&commat;Resourse

    @Component @Controller @Service @Repository@Resourse这些全部是Spring提供的注解. 其中@Component用来表示把一个类纳入spring容器 ...

  8. &lbrack;codeforces 804F&period; Fake bullions&rsqb;

    题目大意: 传送门. 给一个n个点的有向完全图(即任意两点有且仅有一条有向边). 每一个点上有$S_i$个人,开始时其中有些人有真金块,有些人没有金块.当时刻$i$时,若$u$到$v$有边,若$u$中 ...

  9. HMTL列表详解

    1.无序列表<ul> ul其实没啥好说的,大家用得最多就是它,它的属性无非就是type: disc circle square 2.有序列表<ol> H4的时候就有2个属性,t ...

  10. C&plus;&plus; Primer读书笔记(1)

    指针和引用 引用本身不是一个对象,因此不能定义引用的指针:而指针是一个对象,因此可以定义指针的引用. 此外,要理解一个复合类型的变量到底是什么类型,最简单的办法是从右向左阅读其定义,离变量名最近的符号 ...