问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

JAVA实现自动更新数据功能。JAVA或者数据库实现都可。

发布网友 发布时间:2022-04-07 19:13

我来回答

2个回答

懂视网 时间:2022-04-07 23:34

1, isbn); ResultSet result = stat.executeQuery(); if(result.next()){ Blob coverBlob = result.getBlob(1); Image coverImage = ImageIO.read(coverBlob.getBinaryStream()); }

  类似地,如果获取了Clob对象,那么就可以通过调用getSubString或getCharacterStream方法来获取其中的字符数据。

  要将LOB置于数据库中,需要在Connection对象上调用createBlob或createClob,然后获取一个用于该LOB的输出流或写出器,写出数据,并将该对象存储到数据库中。例如,下面展示了如何存储一张图像:

Blob coverBlob = connection.createBlob();
int offset = 0;
OutputStream out = coverBlob.setBinaryStream(offset);
ImageIO.write(coverImage, "PNG", out);
PreparedStatement stat = conn.prepareStatement("INSERT INTO Cover VALUES(?, ?)");
stat.set(1, isbn);
stat.set(2,coverBlob);
stat.executeUpdate();

 2. 可滚动和可更新的结果集

  要让ResultSet可以滚动个和更新,必须在创建Statement对象的时候使用下面的方式指定对应的参数:

Statement stmt = conn.createStatement(type, concurrency);

  对于PreparedStatement,使用下面的方式指定参数:

PreparedStatement pstmt = conn.prepareStatement(sql, type, concurrency);

其中,type表示ResuleSet的类型,而concurrency表示是否可以使用ResuleSet来更新数据库。

type和concurrency的取值以及含义如下:

ResultSet类的type值
解释
ResultSet.TYPE_FORWARD_ONLY 结果集不能滚动(默认值)
ResultSet.TYPE_SCROLL_INSENSITIVE 结果集可以滚动,但ResuleSet对数据库中数据变化不敏感
 ResultSet.TYPE_SCROLL_SENSIT  IVE 结果集可以滚动,并且ResuleSet对数据库中发生的改变敏感
ResultSet类的Concurrency值
解释
ResultSet.CONCUR_READ_ONLY 结果集不能用于更新数据库(默认值)
ResultSet.CONCUR_UPDATABLE 结果集可以用于更新数据库

JDBC的结果集有很多类型。这些结果集有不同的特性,以满足各种需要。这在高性能的JDBC数据操作中有着重要应用。下面是一个应用实例:

package lavasoft.common; 

import java.sql.Connection; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 

/** 
* JDBC可滚动可更新感知更新结果集测试 
* 
* @author leizhimin 2009-12-8 20:09:03 
*/ 
public class TestResultSet { 
 public static void main(String[] args) { 
  testScrollResultSet(); 
  testUpdateResultSet(); 
 } 

 /** 
  * 可更新结果集更新测试 
  */ 
 public static void testUpdateResultSet() { 
  Connection conn = DBToolkit.getConnection(); 
  String sql = "SELECT * FROM book"; 
  try { 
   Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); 
   ResultSet rs = stmt.executeQuery(sql); 

   System.out.println("---------原结果集--------"); 
   while (rs.next()) { 
    System.out.println("[行号:" + rs.getRow() + "]	" + rs.getString(1) + "	" + rs.getString(2) + "	" + rs.getString(3)); 
   } 

   System.out.println("---------插入一条记录--------"); 
   rs.first(); 
   //将光标移动到插入行上 
   rs.moveToInsertRow(); 
   //构建行数据 
   rs.updateString(2, "xxxx"); 
   rs.updateString(3, "x"); 
   //插入一行 
   rs.insertRow(); 

   System.out.println("-------------更新一条记录-------------"); 
   rs.absolute(3); 
   //构建行数据 
   rs.updateString(2, "uuuu"); 
   rs.updateString(3, "u"); 
   rs.updateRow(); 

   System.out.println("---------插入更新后的结果集--------"); 
   rs = stmt.executeQuery(sql); 
   while (rs.next()) { 
    System.out.println("[行号:" + rs.getRow() + "]	" + rs.getString(1) + "	" + rs.getString(2) + "	" + rs.getString(3)); 
   } 
   rs.close(); 
   stmt.close(); 
  } catch (SQLException e) { 
   e.printStackTrace(); 
  } finally { 
   DBToolkit.closeConnection(conn); 
  } 
 } 

 /** 
  * 可滚动结果集滚动测试 
  */ 
 public static void testScrollResultSet() { 
  Connection conn = DBToolkit.getConnection(); 
  String sql = "SELECT * FROM book"; 
  try { 
   Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY); 
   ResultSet rs = stmt.executeQuery(sql); 
   while (rs.next()) { 
    System.out.println("[行号:" + rs.getRow() + "]	" + rs.getString(1) + "	" + rs.getString(2) + "	" + rs.getString(3)); 
   } 

   System.out.println("------前滚操作-----"); 
   //将光标移动到此 ResultSet 对象的上一行 
   rs.previous(); 
   rs.previous(); 
   System.out.println("[行号:" + rs.getRow() + "]	" + rs.getString(1) + "	" + rs.getString(2) + "	" + rs.getString(3)); 

   System.out.println("------绝对定位-----"); 
   //将光标移动到此 ResultSet 对象的给定行编号。 
   rs.absolute(3); 
   System.out.println("[行号:" + rs.getRow() + "]	" + rs.getString(1) + "	" + rs.getString(2) + "	" + rs.getString(3)); 

   System.out.println("------移动到第一行-----"); 
   //将光标移动到此 ResultSet 对象的第一行。 
   if (rs.first()) { 
    System.out.println("[行号:" + rs.getRow() + "]	" + rs.getString(1) + "	" + rs.getString(2) + "	" + rs.getString(3)); 
   } 

   System.out.println("------移动到最后一行-----"); 
   //将光标移动到此 ResultSet 对象的第一行。 
   if (rs.last()) { 
    System.out.println("[行号:" + rs.getRow() + "]	" + rs.getString(1) + "	" + rs.getString(2) + "	" + rs.getString(3)); 
   } 

   System.out.println("------移动到第一行之前-----"); 
   //将光标移动到此 ResultSet 对象的开头,正好位于第一行之前 
   rs.beforeFirst(); 
   rs.next(); 
   System.out.println("[行号:" + rs.getRow() + "]	" + rs.getString(1) + "	" + rs.getString(2) + "	" + rs.getString(3)); 

   System.out.println("------移动到最后一行之后-----"); 
   //将光标移动到此 ResultSet 对象的末尾,正好位于最后一行之后。 
   rs.afterLast(); 
   rs.previous(); 
   System.out.println("[行号:" + rs.getRow() + "]	" + rs.getString(1) + "	" + rs.getString(2) + "	" + rs.getString(3)); 

   System.out.println("------相对当前行做移动-----"); 
   rs.relative(-2); 
   System.out.println("[行号:" + rs.getRow() + "]	" + rs.getString(1) + "	" + rs.getString(2) + "	" + rs.getString(3)); 

   rs.close(); 
   stmt.close(); 
  } catch (SQLException e) { 
   e.printStackTrace(); 
  } finally { 
   DBToolkit.closeConnection(conn); 
  } 
 } 
}
 

控制台输出:

[行号:1] 1 aaa a 
[行号:2] 2 bbb b 
[行号:3] 3 ccc c 
[行号:4] 4 ddd d 
[行号:5] 5 eee e 
[行号:6] 6 fff f 
[行号:7] 7 ggg g 
[行号:8] 8 hhh h 
------前滚操作----- 
[行号:7] 7 ggg g 
------绝对定位----- 
[行号:3] 3 ccc c 
------移动到第一行----- 
[行号:1] 1 aaa a 
------移动到最后一行----- 
[行号:8] 8 hhh h 
------移动到第一行之前----- 
[行号:1] 1 aaa a 
------移动到最后一行之后----- 
[行号:8] 8 hhh h 
------相对当前行做移动----- 
[行号:6] 6 fff f 
---------原结果集-------- 
[行号:1] 1 aaa a 
[行号:2] 2 bbb b 
[行号:3] 3 ccc c 
[行号:4] 4 ddd d 
[行号:5] 5 eee e 
[行号:6] 6 fff f 
[行号:7] 7 ggg g 
[行号:8] 8 hhh h 
---------插入一条记录-------- 
-------------更新一条记录------------- 
---------插入更新后的结果集-------- 
[行号:1] 1 aaa a 
[行号:2] 2 bbb b 
[行号:3] 3 uuuu u 
[行号:4] 4 ddd d 
[行号:5] 5 eee e 
[行号:6] 6 fff f 
[行号:7] 7 ggg g 
[行号:8] 8 hhh h 
[行号:9] 9 xxxx x

Process finished with exit code 0

可保存性:设置提交时候是否关闭结果集。

ResultSet.HOLD_CURSORS_OVER_COMMIT :在提交后结果集还可用

ResultSet.CLOSE_CURSORS_AT_COMMIT:在提交时候关闭结果集

由于这些特性比较高级,不同数据库驱动对此实现也不一样。因此在使用JDBC高级特性的时候最好做个测试,以保证程序的可靠性。

当type设置为:ResultSet.TYPE_SCROLL_INSENSITIVE 或者 ResultSet.TYPE_SCROLL_INSENSITIVE 时,游标可以移动,但是移动的位置是[1,count],记住并不是从0开始,否则会报错。

既然可以移动,那么把移动的几个方法解释一下:

rs = statement.executeQuery();  游标指向第一行前面的位置,这个位置是不能获取数据,否则报错:结果集没有当前行

rs.next();  // 游标下移一个位置,如果所在位置有结果集那么返回true,否则返回false

rs.previous(); // 游标上移一个位置,如果所在位置有结果集那么返回true,否则返回false

rs.first(); //  游标指向第一行的位置

rs.last(); //  游标指向最后一行的位置

rs.beforeFirst(); // 游标指向第一行前面的位置 , 这个位置不能获取数据

rs.afterLast(); //  游标指向最后一行后面的位置,这个位置不能获取数据

rs.absolute(index); // 游标移动至index位置,index是[1,count]的任意数字,但是不能超出,否则报错 

rs.relative(index); // 游标从当前位置算移动index个位置,也就是相对移动,index可以是负数,但是计算结果同样在[1,count]内

isAfterLast(); // 判断游标是否在最后一行之后。

isBeforeFirst();// 判断游标是否在第一行之前。

ifFirst() ;  //判断游标是否指向结果集的第一行。

isLast(); // 判断游标是否指向结果集的最后一行。

getRow();// 得到当前游标所指向行的行号,行号从1开始,如果结果集没有行,返回0。

 

java数据库编程——读写LOB、可滚动和可更新的结果集

标签:

热心网友 时间:2022-04-07 20:42

数据库的话你可以写一个触发器,
java代码的话:spring的schles和quartz设置定时任务
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
...多长时间?我明天要去宜昌转车,请知道的人告诉我,谢谢啦! 从宜昌晓溪塔到火车东站自驾近路 如何挑选及清洗牛肚 ISO13849 -2015、GB/T16855.1-2018(机械安全 控制系统安全设计原则... cascading failures 级联失效 什么是DFA? 功能安全之要素共存 TSC——DFA相关性失效分析 相关性失效分析的思考 共因失效CCF和共模失效CMF的区别 电脑上如何语音输入 在瓜子二手车买的车子七天之内享受无责退车收取费用吗? 我想买车交了瓜子二手车网手续费3000元,现在我不想买了,请问这个钱要怎样才能退回来呢? 我在瓜子二手车上定了一辆车9.56万,交了服务费8600现在不要了能不能退合同我没有签字是他们签的 瓜子网买了二手车供了二个月,供了车款了,可以退还吗? 我在瓜子看了一辆二手车,收了我12033元的手续费,说做瓜子金融,后面没有批下来,现在说服务费不退 在瓜子二手车看车,交了服务费,现在不想要了,服务费能给退吗? 瓜子二手车交了服务费后还能退吗? 瓜子二手车的七天免费退,对于过户费和物流费退吗? 在瓜子看了一辆二手车,支付了12033元的服务费,后面瓜子金融贷款没有做下来,服务费还能退吗? 瓜子二手车服务费可以退吗刚交了一天 瓜子二手车付了服务费怎么才能退,有谁在瓜子上成交过车吗?瓜子套路很深吗? 在瓜子二手车交了服务费,能退吗? 用完护发素可以_头吗? 护发素为什么用了之后就吹不干 是不是用了护发素后~头发容易变油啊??有什么解决方法? 护发素对头发有伤害吗? 洗完头后用护发素不冲洗对头发有何危害 用护发素需要注意哪些问题? 用护发素有坏处吗?为什么有人说用护发素会使头发变干? b站没有登录能不能发评论 为什么我在B站不能发评论? 机麻中两副牌洗混了怎么办??? 电动麻将桌两副牌混在一起怎么办? 我的用电脑版微信登录不上去,而别人的号却可以登录上去(同一台电脑)? 自动麻将牌理好为什么要第二付下去再能把牌推上来? 麻将机这样了怎么处理? 烹饪书上说的沥水是什么意思啊 炒菜沥水是什么意思? 健美运动员一天要锻炼几个小时? 如何煮面条才好吃呀? 58kg怎么增肌到140g 请问怎样增肌?迟什么东西呢 我想练引体向上,每次都只能做7.8个请问方法提高吗 <有请健美专家前来指导>!!! 如何煮出好吃的台式煮面 请问图中这种工具正式名称叫什么?煮面用的,长长的,可沥水。不叫沥水勺和漏勺。如果可以的话请发个淘宝 马库斯·罗西尔的马库斯:打造霸王背肌 你们认为多里安耶茨的巅峰时期(最强时期)是什么时候? 家庭里好用的一些小厨具,都有些什么呢?