JDBC2.0操作:结果集,更新,插入,删除,批处理语句
JDBC对ResultSet的支持
JDBC最重要的概念是批处理,可以一次完成多个语句的执行。
可滚动的结果集。
如果想创建可滚动的结果集,则在创建PrepareStatement时候必须指定创建的类型。
CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency)
创建一个 CallableStatement 对象,该对象将生成具有给定类型和并发性的 ResultSet 对象。
使得ResultSet结果集可滚动,设置参数resultSetType
ResultSet.TYPE_SCROLL_SENSITIVE
设置结果集只读:设置参数:resultSetConcurrency
ResultSet.CONCUR_READ_ONLY
ResultSet中有以下方法:
1,定位第几条数据:
boolean absolute(int row)
将光标移动到此 ResultSet 对象的给定行编号。
2,将光标移到末尾
void afterLast()
将光标移动到此 ResultSet 对象的末尾,正好位于最后一行之后。
3,将光标移到开头
void beforeFirst()
将光标移动到此 ResultSet 对象的开头,正好位于第一行之前。
4,将光标移到第一行
boolean first()
将光标移动到此 ResultSet 对象的第一行。
5,光标先前移
boolean next()
将光标从当前位置向前移一行。
6,光标移到上一行
boolean previous()
将光标移动到此 ResultSet 对象的上一行。
7,定位最后一行
boolean last()
将光标移动到此 ResultSet 对象的最后一行。
代码实例:
package 类集;
import java.sql.Connection ;
import java.sql.DriverManager ;
import java.sql.SQLException ;
import java.sql.PreparedStatement ;
import java.sql.ResultSet ;
public class JDBC20ReadDemo{
// 定义MySQL的数据库驱动程序
public static final String DBDRIVER = "org.gjt.mm.mysql.Driver" ;
// 定义MySQL数据库的连接地址
public static final String DBURL = "jdbc:mysql://localhost:3306/sys" ;
// MySQL数据库的连接用户名
public static final String DBUSER = "root" ;
// MySQL数据库的连接密码
public static final String DBPASS = "aaaaaa" ;
public static void main(String args[]) throws Exception{ // 所有异常抛出
Connection conn = null ; // 数据库连接
PreparedStatement pstmt = null ;
ResultSet rs = null ;
String sql = "SELECT name,age,birthday FROM user" ;// 此处不需要设置任何的内容
Class.forName(DBDRIVER) ; // 加载驱动程序
conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS) ;
pstmt = conn.prepareStatement(sql,
ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_READ_ONLY) ;
rs = pstmt.executeQuery() ; // 查询操作
System.out.println("第2条数据:") ;
rs.absolute(1) ; // 第二条数据,定位第二条数据
print(rs,1) ;
System.out.println("第1条数据:") ;
rs.beforeFirst() ;
print(rs,1) ;
System.out.println("第4条数据:") ;
rs.afterLast() ;// 最后一条数据之后
print(rs,-1) ;
rs.close() ;
pstmt.close() ;
conn.close() ; // 数据库关闭
}
public static void print(ResultSet rs,int re) throws Exception{
if(re>0){
rs.next() ; // 由前向后
}else{
rs.previous() ; // 由后向前
}
String name = rs.getString(1) ;
int age = rs.getInt(2) ;
java.util.Date d = rs.getDate(3) ;
System.out.print("姓名:" + name + ";") ;
System.out.print("年龄:" + age + ";") ;
System.out.println("生日:" + d + ";") ;
System.out.println("----------------------------") ;
}
};
输出结果:
Wed Apr 19 22:33:46 CST 2017 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
第2条数据:
姓名:小红;年龄:20;生日:2007-08-27;
----------------------------
第1条数据:
姓名:李兴华;年龄:30;生日:2007-08-27;
----------------------------
第4条数据:
姓名:小红;年龄:20;生日:2007-08-27;
----------------------------
如果程序这样开发,内存损耗会非常大,一般情况下,开发中是不会使用这种可滚动的结果集的。
使用结果集插入数据
要想使用resultSet插入数据,则在创建数据库操作的时候必须选择好允许更新。
在ResultSet接口中可以看到如下字段,要插入数据,必须允许更新,选择:CONCUR_UPDATABLE

设计到的方法:
1,将光标移到到插入行
void moveToInsertRow()
将光标移动到插入行。
2,更新指定String类型的列
void updateString(String columnLabel, String x)
用 String 值更新指定列。
3,提交插入数据更新
void insertRow()
将插入行的内容插入到此 ResultSet 对象和数据库中。
代码实例:
package 类集;
import java.sql.Connection ;
import java.sql.DriverManager ;
import java.sql.PreparedStatement ;
import java.sql.ResultSet ;
public class JDBC20InsertDemo{
// 定义MySQL的数据库驱动程序
public static final String DBDRIVER = "org.gjt.mm.mysql.Driver" ;
// 定义MySQL数据库的连接地址
public static final String DBURL = "jdbc:mysql://localhost:3306/sys" ;
// MySQL数据库的连接用户名
public static final String DBUSER = "root" ;
// MySQL数据库的连接密码
public static final String DBPASS = "aaaaaa" ;
public static void main(String args[]) throws Exception{ // 所有异常抛出
Connection conn = null ; // 数据库连接
PreparedStatement pstmt = null ;
ResultSet rs = null ;
String sql = "SELECT name,age,birthday FROM user" ;// 此处不需要设置任何的内容
Class.forName(DBDRIVER) ; // 加载驱动程序
conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS) ;
pstmt = conn.prepareStatement(sql,
ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE) ; // 表示结果集可以更新
rs = pstmt.executeQuery() ; // 查询操作
rs.moveToInsertRow() ; // 移动到插入的一行
rs.updateString("name","李华") ; // 设置姓名
rs.updateInt("age",33) ; // 设置要插入的年龄
rs.updateDate("birthday",new java.sql.Date(new java.util.Date().getTime()));
rs.insertRow() ; // 真正提交数据
rs.close() ;
pstmt.close() ;
conn.close() ; // 数据库关闭
}
};
查询结果:

使用结果集更新数据
如果要想使用结果集更新数据,则首先应该按主键查询。
涉及的方法:
1,取消更新:
void cancelRowUpdates()
取消对 ResultSet 对象中的当前行所作的更新。
2,更新操作
void updateRow()
用此 ResultSet 对象的当前行的新内容更新底层数据库。
代码实例:
package 类集;
import java.sql.Connection ;
import java.sql.DriverManager ;
import java.sql.SQLException ;
import java.sql.PreparedStatement ;
import java.sql.ResultSet ;
public class JDBC20UpdateDemo{
// 定义MySQL的数据库驱动程序
public static final String DBDRIVER = "org.gjt.mm.mysql.Driver" ;
// 定义MySQL数据库的连接地址
public static final String DBURL = "jdbc:mysql://localhost:3306/sys" ;
// MySQL数据库的连接用户名
public static final String DBUSER = "root" ;
// MySQL数据库的连接密码
public static final String DBPASS = "aaaaaa" ;
public static void main(String args[]) throws Exception{ // 所有异常抛出
Connection conn = null ; // 数据库连接
PreparedStatement pstmt = null ;
ResultSet rs = null ;
String sql = "SELECT name,age,birthday FROM user WHERE age=?" ;// 此处不需要设置任何的内容
Class.forName(DBDRIVER) ; // 加载驱动程序
conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS) ;
pstmt = conn.prepareStatement(sql,
ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE) ; // 表示结果集可以更新
pstmt.setInt(1,20) ;
rs = pstmt.executeQuery() ; // 查询操作
rs.last() ; // 到最后一行
rs.updateString("name","李藏") ; // 设置姓名
rs.updateDate("birthday",new java.sql.Date(new java.util.Date().getTime()));
//rs.cancelRowUpdates() ; // 取消更新,这里暂时注释掉,否则更新不了
rs.updateRow() ; // 真正提交数据
rs.close() ;
pstmt.close() ;
conn.close() ; // 数据库关闭
}
};
查询结果:

使用结果集删除数据
涉及方法:
1,删除当前行
void deleteRow()
从此 ResultSet 对象和底层数据库中删除当前行。
代码实例:
package 类集;
import java.sql.Connection ;
import java.sql.DriverManager ;
import java.sql.SQLException ;
import java.sql.PreparedStatement ;
import java.sql.ResultSet ;
public class JDBC20DeleteDemo{
// 定义MySQL的数据库驱动程序
public static final String DBDRIVER = "org.gjt.mm.mysql.Driver" ;
// 定义MySQL数据库的连接地址
public static final String DBURL = "jdbc:mysql://localhost:3306/sys" ;
// MySQL数据库的连接用户名
public static final String DBUSER = "root" ;
// MySQL数据库的连接密码
public static final String DBPASS = "aaaaaa" ;
public static void main(String args[]) throws Exception{ // 所有异常抛出
Connection conn = null ; // 数据库连接
PreparedStatement pstmt = null ;
ResultSet rs = null ;
String sql = "SELECT name,age,birthday FROM user WHERE age=?" ;// 此处不需要设置任何的内容
Class.forName(DBDRIVER) ; // 加载驱动程序
conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS) ;
pstmt = conn.prepareStatement(sql,
ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE) ; // 表示结果集可以更新
pstmt.setInt(1,20) ;
rs = pstmt.executeQuery() ; // 查询操作
rs.last() ; // 到最后一行
rs.deleteRow() ; // 真正提交删除数据
rs.close() ;
pstmt.close() ;
conn.close() ; // 数据库关闭
}
};
查询结果:

但是,以上操作,在正常情况下是不会使用的,不如直接使用PreparedStatement完成方便。
批处理
批处理指一次性向数据库中执行多条语句,一次提交。
批处理需要用到PreparedStatement接口中的方法:
1,addBatch():将一组参数加入到PreparedStatement对象批处理命令中。
void addBatch()
将一组参数添加到此 PreparedStatement 对象的批处理命令中。
Statement接口中的方法:
2,executeBatch():执行批处理语句,返回更新的行数。
int[] executeBatch()
将一批命令提交给数据库来执行,如果全部命令执行成功,则返回更新计数组成的数组。
代码实例:
package 类集;
import java.sql.Connection ;
import java.sql.DriverManager ;
import java.sql.SQLException ;
import java.sql.PreparedStatement ;
public class JDBC20BatchDemo{
// 定义MySQL的数据库驱动程序
public static final String DBDRIVER = "org.gjt.mm.mysql.Driver" ;
// 定义MySQL数据库的连接地址
public static final String DBURL = "jdbc:mysql://localhost:3306/sys" ;
// MySQL数据库的连接用户名
public static final String DBUSER = "root" ;
// MySQL数据库的连接密码
public static final String DBPASS = "aaaaaa" ;
public static void main(String args[]) throws Exception{ // 所有异常抛出
Connection conn = null ; // 数据库连接
PreparedStatement pstmt = null ;
String sql = "INSERT INTO user(name,age,birthday) VALUES (?,?,?)" ;// 此处不需要设置任何的内容
Class.forName(DBDRIVER) ; // 加载驱动程序
conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS) ;
pstmt = conn.prepareStatement(sql) ; // 表示结果集可以更新
for(int i=0;i<10;i++){
pstmt.setString(1,"李兴华 - " + i) ;
pstmt.setInt(2,20 + i) ;
pstmt.setDate(3,new java.sql.Date(new java.util.Date().getTime())) ;
pstmt.addBatch() ; // 加入批处理,等待执行
}
int temp[] = pstmt.executeBatch() ;
System.out.println("更新了" + temp.length + "条数据。") ;
pstmt.close() ;
conn.close() ; // 数据库关闭
}
};
操作结果:
Wed Apr 19 23:56:10 CST 2017 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
更新了10条数据。
查询结果:

JDBC2.0操作:结果集,更新,插入,删除,批处理语句的更多相关文章
- SQL图形化操作设置级联更新和删除
SQL级联操作设置 对SQL数据库的表,进行级联操作(如级联更新及删除),首先需要设置表的主外键关系,有两种方法: 第一种: 1. 选择你要进行操作的数据库 2. 为你要创建关系的两个 ...
- jQuery---jq操作标签文本(html(),text()),jq操作文档标签(插入,删除,修改),克隆,,jq操作属性,jq操作class属性,jq操作表单value,jq操作css,jq操作盒子(重要),jq操作滚动条
jQuery---jq操作标签文本(html(),text()),jq操作文档标签(插入,删除,修改),克隆,,jq操作属性,jq操作class属性,jq操作表单value,jq操作css,jq操作盒 ...
- 使用游标循环进行SQL更新插入的SQL语句
使用SQL中的循环,可以实现许多我们需要的操作,比如SQL更新操作.下面就为您介绍使用游标循环进行SQL更新插入的SQL语句写法,希望对您深入学习SQL更新有所帮助. --开始事务 BEGIN TRA ...
- ASP.NET MVC对WebAPI接口操作(添加,更新和删除)
昨天<怎样操作WebAPI接口(显示数据)>http://www.cnblogs.com/insus/p/5670401.html 既有使用jQuery,也有使作HttpClient来从数 ...
- 吴裕雄--天生自然JAVA数据库编程:JDBC2.0操作
import java.sql.Connection ; import java.sql.DriverManager ; import java.sql.SQLException ; import j ...
- JdbcTemplate学习笔记(更新插入删除等)
1.使用JdbcTemplate的execute()方法执行SQL语句 jdbcTemplate.execute("CREATE TABLE USER (user_id integer, n ...
- iOS - UITableView 编辑(cell的插入, 删除, 移动)
UITableView Cell的插入/删除 核心API Class : UITableView Delegate : UITableViewDataSource, UITableViewDelega ...
- ASP入门(二十三)- 数据库插入、更新和删除操作
我们这里介绍如何使用 Recordset 对象进行插入.更新和删除操作,顺便和 SQL 语句对比. 插入记录 AddNew 方法用于插入一条记录,首先打开一个记录集,并且这个记录具备可写特性,而后调用 ...
- Entity Framework 6 Recipes 2nd Edition(10-10)译 - > 为TPH继承的插入、更新、删除操作映射到存储过程
10-10. 为TPH继承的插入.更新.删除操作映射到存储过程 问题 TPH继承模型,想把它的插入.修改.删除操作映射到存储过程 Solution 假设数据库有一个描述不同种类的产品表(Product ...
随机推荐
- 文本转化工具dos2unix
文本转化工具dos2unix 由于历史原因,各个平台使用的文本编码规范不同,导致了同一文本在不同平台中显示不同.例如,Windows和Linux的换行符号不同,会造成多行文本显示混乱.为了解决这个 ...
- cogs 2039. 树的统计
2039. 树的统计 ★★ 输入文件:counttree.in 输出文件:counttree.out 简单对比时间限制:1 s 内存限制:128 MB [题目描述] 关于树的统计问题有 ...
- JZYZOJ1383 [usaco2003feb]impster 位运算 最短路
http://172.20.6.3/Problem_Show.asp?id=1383 找能到达某个状态的最小操作数,然后把所有状态扫一遍即可,要额外判定一下起始就有的状态(如果起始里没有0那么这些状 ...
- BZOJ 3997 [TJOI2015]组合数学(单调DP)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3997 [题目大意] 给出一个网格图,其中某些格子有财宝,每次从左上角出发,只能向下或右 ...
- BZOJ 2120 数颜色(带修改莫队)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2120 [题目大意] 给出一颜色序列,每次可以修改一个位置的颜色或者询问一个区间不同颜色 ...
- 【最短路】【Heap-dijkstra】hihocoder 1587 ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛 J. Typist's Problem
题意:给你一个串,仅含有a~g,且每个字母只出现最多一次.和一个光标初始位置,以及一个目标串,问你最少要多少的代价变化成目标串. 有五种操作:在光标前添加一个未出现过的字母,代价1. 删除光标前或者光 ...
- 【递推】【组合数】【容斥原理】UVA - 11806 - Cheerleaders
http://www.cnblogs.com/khbcsu/p/4245943.html 本题如果直接枚举的话难度很大并且会无从下手.那么我们是否可以采取逆向思考的方法来解决问题呢?我们可以用总的情况 ...
- IRC程序学习
%%聊天的中转站,将{chan,MM,Msg}形式的信息转化为 {mm, MM, Msg}形式 -module(mod_chat_controller). -export([start/3]). -i ...
- Problem D: 判断上否上三角矩阵
#include<stdio.h> int main() { ][],i,j; while(scanf("%d",&n)!=EOF) { ; //flag用来做 ...
- #Java Web累积#表格<table>中隐藏列做备用数据
初入JW,MyEclipse,JS文件中码砖时怎么连个提示都没有. 步骤1 JSP代码中,Table多出一列,如下列代码中的 Other,其中css文件中将col00的width设置为0px; < ...