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 ...
随机推荐
- Java 模拟栈结构
栈和队列: 通常是作为程序猿的工具,用于辅助构思算法.生命周期较短,执行时才被创建 訪问受限.在特定时刻,仅仅有一个数据可被读取或删除 是一种抽象的结构.内部的实现机制.对用户不可见.比方用数组.链表 ...
- lua 中pairs 和 ipairs差别
ipairs 和pairs在lua中都是遍历tbale的函数可是两者有差别 1.pairs遍历table中的全部的key-vale 而ipairs会依据key的数值从1開始加1递增遍历相应的table ...
- Codeforces Round #313 (Div. 2) C
题目链接 题意: 有一个六边形,给你6条边的长度(顺时针给出).每条边都是整数,问你它能够被切割成几个单位长度的正三角形 (题目保证给出的数据能够被切割) 思路: 六边形能够被切割成两种情况: ① ...
- Intellij IDEA安装golang插件
原文作者:Jianan - qinxiandiqi@foxmail.com 原文地址:http://blog.csdn.net/qinxiandiqi/article/details/50319953 ...
- netty开发教程(一)
Netty介绍 Netty is an asynchronous event-driven network application framework for rapid development o ...
- springmvc返回json字符串中文乱码问题
问题: 后台代码如下: @RequestMapping("menuTreeAjax") @ResponseBody /** * 根据parentMenuId获取菜单的树结构 * @ ...
- MyBatis SQL处理大于、小于号
MyBatis mapper文件是xml文件,需要特殊字符如大于号.小于号后需要转义. 原字符 转义后字符 < < <= <= > > > >=
- Influxdb1.2.2安装
一.文件准备 1.1 文件名称 influxdb-1.2.2.x86_64.rpm 1.2 下载地址 https://portal.influxdata.com/downloads [注意.注意.注意 ...
- Android项目实战(三十八):2017最新 将AndroidLibrary提交到JCenter仓库(图文教程)
我们经常使用github上的开源项目,使用步骤也很简单 比如: compile 'acffo.xqx.xwaveviewlib:maven:1.0.0' 这里就学习一下如何将自己的类库做出这种可以供他 ...
- mac与centos下redis的安装与配置
前言 最近在用redis,下面简单写一下mac和centos下redis的安装与配置方法. 安装 mac下面 安装命令:brew intall redis 运行命令:brew services sta ...