JDBC中使用PreparedStatement执行SQL语句并管理结果集

基本说明

1、使用PreparedStatement在对反复操作多条结构相似的SQL语句时效率更高,并且可以使用参数替代变量,可以防止SQL注入。

2、PreparedStatement也提供了 execute()  、 executeUpdate()  、 executeQuery()  三个方法来执行crud操作,这三个方法无需传递参数,因为PreparedStatsments已经存储了预编译的SQL语句。

3、推荐使用PreparedStatement。


代码示例,简单PreparedStatement操作工具类。本例使用连接SqlServer 08 R2为例

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;public class PreparedStatementUtils {private String url;private String user;private String password;public PreparedStatementUtils(String urlString,String userString,String pasString){this.url = urlString;this.user = userString;this.password = pasString;}static{try {Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");} catch (ClassNotFoundException e) {e.printStackTrace();}}/**** 对输入SQL进行查询* @param sql* @throws SQLException*/public void queryResult(String sql)throws SQLException{try(//获取数据库连接Connection connection = DriverManager.getConnection(this.url, this.user, this.password);//使用conntection来创建一个PreparedStatement对象PreparedStatement preparedStatement =connection.prepareStatement(sql);){ResultSet rSet=  preparedStatement.executeQuery();while(rSet.next()){System.out.println("Id=" + rSet.getLong(1) + ";ProductName=" + rSet.getString(2));}}}/**** 对输入SQL进行新增、更新操作* @param sql* @return* @throws SQLException*/public int updateResult(String sql)throws SQLException{try(Connection connection = DriverManager.getConnection(this.url, this.user, this.password);PreparedStatement preparedStatement = connection.prepareStatement(sql);				){return preparedStatement.executeUpdate();}}/*** 使用PreparedStatement进行批量* @throws SQLException*/public void updateResult()throws SQLException{long stat = System.currentTimeMillis();try(Connection connection = DriverManager.getConnection(this.url, this.user, this.password);PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO dbo.Product( ProductName ,IsEffective ,Remark ,UnitId)VALUES  (?,'Y',?,1)");){for (int i = 0; i < 10; i++) {preparedStatement.setString(1, "测试名字" + i);preparedStatement.setString(2, "测试备注" + i);preparedStatement.executeUpdate();}}long end = System.currentTimeMillis();System.out.println("使用PreparedStatement进行费时:" +  (end-stat));}
}

 


可滚动可更新的结果集 

1、ResultSet定位记录指针的方法由absolute()、previous()、last()、afterLast()等方法。可以对结果集进行滚动操作。

2、以默认的方式打开的结构集ResultSet是不能更新的。如果希望更新,可以在创建Statement或者PreparedStatement时传入额外的参数。

 

resultSetType:控制ResultSet的类型,该参数有如下三个值:

1、ResultSet.TYPE_FORWARD_ONLY:该常量控制记录指针只能向前移动。

2、ResultSet.TYPE_SCROLL_INSENSITIVE:该常量控制记录指针可以自由移动(可滚动结果集),但是底层数据的改变不会影响ResultSet里的内容。(sqlserver 可能不支持此操作,会报错:不支持此游标类型/并发组合)

3、ResultSet.TYPE_SCROLL_SENSITIVE:常量控制记录指针可以自由移动(可滚动结果集),但是底层数据的改变会影响ResultSet里的内容。

 

resultSetConcurrency:控制ResultSet的并发类型,该参数可以接受如下两个值:

1、ResultSet.CONCUR_UPDATABLE:该常量指示ResultSet是可更新的并发模式。

      这里有两个条件:1、所有数据来自同个表。2、选出的数据必须包含主键列

2、ResultSet.CONCUR_READ_ONLY:该常量指示ResultSet是只读的并发模式(默认)。

 

代码举例说明,在上述代码中再增加一个方法:

	/*** 查询并修改指定结果集数据* @param sql* @throws SQLException*/public void queryAndUpdata(String sql)throws SQLException{try(Connection connection = DriverManager.getConnection(this.url, this.user, this.password);PreparedStatement preparedStatement = connection.prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);ResultSet rSet = preparedStatement.executeQuery();){			rSet.last();//移动到最后一行int rowCount = rSet.getRow();//获得最后一行的行号for (int i = rowCount; i > 0; i--) {rSet.absolute(i);//移动指针到指定行System.out.println("Id=" + rSet.getLong(1) + ";ProductName=" + rSet.getString(2));rSet.updateString(2, rSet.getString(2) + "X");//修改查询结果第二列的值rSet.updateRow();//提交修改}}}

 


使用ResultSetMetaData分析结果集 

如果程序不知道ResultSet里面有哪些数据列,以及每个数据列的数据类型,那么可以通过ResultSetMetaData来获取关于ResultSet里的描述信息。

ResultSet里包含了一个getMetaData()方法,该方法返回该ResultSet对应的ResultSetMetaData对象。通过ResultSetMetaData对象里的方法可以获取信息。常用的方法由如下三个:

1、int getColumnCount():返回该ResultSet的列的数量。

2、String getColumnName(int column):返回指定索引的列名。

3、int getColumnType(int column):返回指定索引的列类型。

 

代码举例说明,在上述代码中再增加一个方法:

	/**** 查询显示结果列* @param sql* @throws SQLException*/public void queryAndCheck(String sql)throws SQLException{try(Connection connection = DriverManager.getConnection(this.url, this.user, this.password);PreparedStatement preparedStatement = connection.prepareStatement(sql);ResultSet resultSet = preparedStatement.executeQuery();){ResultSetMetaData resultSetMetaData = resultSet.getMetaData();int colCount = resultSetMetaData.getColumnCount();for (int i = 1; i <= colCount; i++) {System.out.println("第" + i + "列列名是" + resultSetMetaData.getColumnName(i) + ";类型是" + resultSetMetaData.getColumnType(i));}}}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/548433.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu下安装Gerrit

2019独角兽企业重金招聘Python工程师标准>>> 目标 配置Gerrit使用mysql数据库&#xff08;原因&#xff1a;本人比较熟悉mysql&#xff09; 使用http授权模式&#xff0c;使用apache反向代理。 SMTP使用163的个人邮箱 软件版本 Ubuntu 12.04 Gerrit 2.4.1 Apache 2.…

JDBC中使用RowSet包装结果集

背景 C#中有了DataSet&#xff0c;可以把底层数据读取到内存中进行离线操作。操作完成再同步到底层数据源。Java中也提供了类似的功能——RowSet。 和ResultSet相比&#xff0c;RowSet默认是可以滚动、可更新、可序列化的结果集合&#xff0c;而且作为Javabean使用。并支持离…

招几个兄弟和我一起做项目

为什么80%的码农都做不了架构师&#xff1f;>>> 个人名义发表&#xff0c;有事情站内联系。不说太多&#xff0c;反正能学到东西。呵呵。 工作内容&#xff1a; 1 负责项目中相关模块从应用到Framework部分&#xff08;包括Java层和Native层&#xff09;的开发 2 负…

JDBC中开启事务的批量插入操作

直接上代码 import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement;public class Batch {private String url;private String user;private String password;public Batch(String url,String user,String password){this.url url;this.user…

C#中? 、?? 、?. 、??= 的用法和说明

一、可空类型修饰符< ? > 引用类型能用空引用来表示一个表示一个不存在的值&#xff0c;但是值类型不能。例如&#xff1a; string str null; int i null;//编译报错 为了使值类型也能使用可空类型&#xff0c;就可以用 " ? "来表示&#xff0c;表现形式…

小议 find

说find之前我们先说两个概念&#xff1a;文件查找&#xff1b;文本过滤。这是两个不同的概念&#xff0c;所使用的命令也是不一样的。 文件查找&#xff1a;查找目录中的文件 文本过滤&#xff1a;查找文本中的行 文本过滤的命令有&#xff1a;grep 、fgrep 、egrep 等 格式为…

c++内存访问越界

http://blog.vckbase.com/arong/archive/2009/12/30/40598.html 1. 原理分析 经常有些新C&#xff0b;&#xff0b;程序员问&#xff1a;C&#xff0b;&#xff0b;的类的成员个数是不是有限制&#xff0c;为什么我加一个变量后程序就死了&#xff1f;或者说&#xff1a;是不是…

Java开发常用命名规范

挑几个重点&#xff1a; 一、类和接口的首字母及任何任何中间单词的首字母必须是大写。 接口可以带 "I" 前缀或者 "able"、"ible" 、"er"等后缀。推荐接口命名为&#xff1a; I 模块名 业务名称 Service后缀。实现接口的类文件命…

Android系统Recovery工作原理之使用update.zip升级过程分析(二)---u...

2019独角兽企业重金招聘Python工程师标准>>> Android系统Recovery工作原理之使用update.zip升级过程分析&#xff08;二&#xff09;---update.zip差分包问题的解决 在上一篇末尾提到的生成差分包时出现的问题&#xff0c;现已解决&#xff0c;由于最近比较忙&#…

Java编写一个WebService并在Tomcat上发布

本例采用Myeclipse 2016 CI 6&#xff0c;JDK1.8 。新建一个Web Service Project。 选择如下设置&#xff1a; 在src目录下建个包: 编写一个接口&#xff0c;其中一个方法返回ArrayList&#xff0c;另一个方法返回JSON&#xff1a; package Services; import java.sql.SQLExce…

ftp简介

简介 ftp基于TCP服务&#xff0c;不支持UDP&#xff0c;使用21(控制端口)和20(数据端口)&#xff0c;但ftp的数据端口并不总是20. ftp模式 主动模式客户端从一个任意的端口N&#xff08;N>1024&#xff09;连接到FTP服务器的命令端口(21端口)。然后客户端开始监听端口N1&…

Windows环境下搭建Tomcat

下载Tomcat&#xff0c;点击这里下载Tomcat 解压到指定目录: 配置环境变量&#xff1a;右键“我的电脑” ——属性——高级系统设置——环境变量 配置三个环境变量&#xff1a; 在系统变量里新建变量名&#xff1a;CATALINA_BASE&#xff0c;变量值&#xff1a;D:\apache-t…

C#非泛型集合类-使用HashTable组织数据

HashTable称为哈希表&#xff0c;是System.Collections命名空间中的一个重要的类。与ArrayList不同&#xff0c;哈希表可以存储键/值(key/value)对的集合。如果把哈希表当做字典&#xff0c;那么“键”就是字典中查的单词&#xff0c;“值”就是关于单词解释内容&#xff0c;正…

c3p0连接池的配置和简单使用

背景 一般我们在项目中操作数据库时&#xff0c;都是每次需要操作数据库就建立一个连接&#xff0c;操作完成后释放连接。因为jdbc没有保持连接的能力&#xff0c;一旦超过一定时间没有使用&#xff08;大约几百毫秒&#xff09;&#xff0c;连接就会被自动释放掉。而每次新建连…

Iterator_迭代器模式_PHP语言描述

2019独角兽企业重金招聘Python工程师标准>>> 感觉最近写的这些设计模式的例子&#xff0c;在定义描述方面差很多&#xff0c;以后都会先写一下用例设计模式的定义及简单讲解&#xff0c;在把例子附上&#xff0c;这样的感觉更好些&#xff0c;也让大家看得更清楚一些…

数组去重复

做一个新数组&#xff0c;重复的不加入 <script type"text/javascript">Array.prototype.delrepeat function() {var arr this;var _arr new Array();for (var i in arr) {if (i delrepeat) continue;if (_arr.length 0) _arr.push(arr[i]);for (var j 0…

Spring整合JDBC开发

背景 在JDBC开发中&#xff0c;充斥这大量重复的代码&#xff0c;可能只是换了个SQL语句&#xff0c;其他代码是完全不用变的。Spring的jar包里&#xff0c;提供了一个叫JDBCTemplate的模板&#xff0c;在保持操作灵活方便的情况下&#xff0c;将代码量降到最低。 配置文件 首…

【Android】EditText标签调用键盘

转自天翼空间开发资料。在xml文件中EditText标签有一个属性android:editable"false"和android:numeric"integer" android:numeric"integer"表示只允许输入数字&#xff0c;此属性可以限制用户只能输入数字内容。 android:editable表示是否可以输…

基于SpringMVC进行REST服务开发

背景 REST的概念这里不多过多阐述。在REST中&#xff0c;资源通过URL进行识别和定位。一般来说&#xff0c;以下这些HTTP方法通常会匹配为如下的CRUD动作&#xff1a; Create&#xff1a;POST Read&#xff1a;GET Update&#xff1a;PUT或PATCH Delete&#xff1a;DELETE…