JDBC详解系列(四)之建立Stament和执行SQL语句
建立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接口的方法:
我们可以看到总共就三种类型:
| 方法 | 作用 |
|---|---|
| execute() | 主要在存储过程和动态SQL语句中使用 |
| executeUpdate() | 对应INSERT,UPDATE 或 DELETE 语句 |
| executeQuery() | 对应SELECT,查询专用 |
根据实际的需要对这些类型进行选择,在此就不进行详细讲解了。
JDBC详解系列(四)之建立Stament和执行SQL语句的更多相关文章
- JDBC详解系列(三)之建立连接(DriverManager.getConnection)
在JDBC详解系列(一)之流程中,我将数据库的连接分解成了六个步骤. JDBC流程: 第一步:加载Driver类,注册数据库驱动: 第二步:通过DriverManager,使用url,用户名和密码 ...
- JDBC详解系列(二)之加载驱动
---[来自我的CSDN博客](http://blog.csdn.net/weixin_37139197/article/details/78838091)--- 在JDBC详解系列(一)之流程中 ...
- JDBC详解系列(一)之流程
---[来自我的CSDN博客](http://blog.csdn.net/weixin_37139197/article/details/78838091)--- JDBC概述 使用JDBC也挺长 ...
- Mybatis源码详解系列(四)--你不知道的Mybatis用法和细节
简介 这是 Mybatis 系列博客的第四篇,我本来打算详细讲解 mybatis 的配置.映射器.动态 sql 等,但Mybatis官方中文文档对这部分内容的介绍已经足够详细了,有需要的可以直接参考. ...
- Eureka详解系列(四)--Eureka Client部分的源码和配置
简介 按照原定的计划,我将分三个部分来分析 Eureka 的源码: Eureka 的配置体系(已经写完,见Eureka详解系列(三)--探索Eureka强大的配置体系): Eureka Client ...
- Handler详解系列(四)——利用Handler在主线程与子线程之间互发消息,handler详解
MainActivity如下: package cc.c; import android.app.Activity; import android.os.Bundle; import android. ...
- BIML 101 - ETL数据清洗 系列 - BIML 快速入门教程 - 连接数据库执行SQL语句
BIML 101 - BIML 快速入门教程 第一节 连接数据库执行SQL语句 本小节将用BIML建一个简单的可以执行的包. 新建一个biml文件,贴入下面的代码 1 <Biml xmlns=& ...
- 源码详解系列(六) ------ 全面讲解druid的使用和源码
简介 druid是用于创建和管理连接,利用"池"的方式复用连接减少资源开销,和其他数据源一样,也具有连接数控制.连接可靠性测试.连接泄露控制.缓存语句等功能,另外,druid还扩展 ...
- 源码详解系列(八) ------ 全面讲解HikariCP的使用和源码
简介 HikariCP 是用于创建和管理连接,利用"池"的方式复用连接减少资源开销,和其他数据源一样,也具有连接数控制.连接可靠性测试.连接泄露控制.缓存语句等功能,另外,和 dr ...
随机推荐
- PHP 数据库连接池实现
摘要 xml 读取配置文件 简易方式 常规方式 PHP解析XML 配置文件 解析 数据库连接池 測试 申请过多时拒绝请求 已满后拒绝放入 总结 摘要 之前总是以脚本面向过程的方式写PHP代码,所以非常 ...
- gtk+3.0的环境配置及基于gtk+3.0的python简单样例
/********************************************************************* * Author : Samson * Date ...
- Object-Relational Structural Patterns
Single Table Inheritance Represents an inheritance hierarchy of classes as a single table that has c ...
- git for c#,子文件的加入
private static void SubDirFile() { string wkDir = @"E:\DotNet2010\单位project\Git.Client\lib2Test ...
- ASP.MVC当URL跳转时候参数的安全性
一个页面跳转到另外一个页面直接将参数写在URL上面并不安全比如 http://XXXXXXXXXXX/meeting/shakeGroup?id=5381&uid=o0En_sj1J0bFgI ...
- java开发收藏
一.java工具 1.jenkins 项目集成工具 2.launch4j java打包成exe工具 二.json库 1.jsoniter 比以下都快 2.dsljson 3.fastjson 4.gs ...
- 摧枯拉朽,说说ES6的三把火
阅读目录 我是 Jser 我骄傲 作用域 模块系统 类(Class) 我是 Jser 我骄傲 JavaScript 如今可谓是屌丝逆袭高富帅的代名词哈,从当初闹着玩似的诞生到现在 Github 上力压 ...
- 服务器固件测试--PCI设备的介绍(集成网卡和外插网卡)
今天2017年9月26号,快三个月的时间,是该梳理一下,我来到这个岗位学到的东西. 网卡是什么 网卡分为俩大类 板载的集成网卡和外插的网卡.外插的网卡又分为很多种. 板载的集成网卡 外插的网卡分为 I ...
- idea的快捷键
idea的快捷键大全 Alt+回车 导入包,自动修正 Ctrl+N 查找类 Ctrl+Shift+N 查找文件 Ctrl+Alt+L 格式化代码 Ctrl+Alt+O 优化导入的类和包 Alt+ ...
- 搭建 Keepalived + Nginx + Tomcat 的高可用负载均衡架构
1 概述 初期的互联网企业由于业务量较小,所以一般单机部署,实现单点访问即可满足业务的需求,这也是最简单的部署方式,但是随着业务的不断扩大,系统的访问量逐渐的上升,单机部署的模式已无法承载现有的业务量 ...