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

如何使用Java在MySQL数据库中存取LOB对象

发布网友 发布时间:2022-04-29 20:10

我来回答

2个回答

懂视网 时间:2022-04-30 00:32

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-29 21:40

Java数据库连接(JDBC)由一组用 Java 编程语言编写的类和接口组成。

JDBC 为工具/数据库开发人员提供了一个标准的 API,使他们能够用纯Java API 来编写数据库应用程序。

然而各个开发商的接口并不完全相同,所以开发环境的变化会带来一定的配置变化。本文主要集合了不同数据库的连接方式。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
八月中国最凉快的地方 八月份哪里最凉快,去哪旅游好?美丽的地方 乱字同韵字是什么意思 华硕笔记本电脑触摸板怎么开笔记本电脑触摸板怎么开启和关闭_百度知 ... 陕西职务侵占案立案准则 结婚后我的恋情维系了十年,怎么做到的? 玉米仁子饭产自哪里 中国期货交易所的交易品种有哪些? 历史要怎么读,有啥诀窍 高中历史诀窍 天回镇暂住证怎么才能办新繁来? 成都金牛区什么时候成立的 青白江去天回镇回来健康吗回变色吗青白江去天回镇健康骂回变上吗? 天回镇到新都这段路,我尾号是0会限号吗?现在实行新的限行政策了 成都金牛区天回镇余家新居在修什么小学和中学? 专业点的问题,如果要在成都开一家药厂,该如何选址?选在哪儿? 成都变化有哪些 成都龙潭寺,大丰,天回镇,金花镇,机投房价分别是多少钱一平方 天回镇在哪里 成都天汇镇明月中心村是否属于改造的核心区域二期 新都天回镇的棚改资格可以买成都天府新区的房子吗? 四川成都天回镇哪里好玩 天回镇有多少人口 谁知道最新的消息。荷花池搬迁时向新都新建的荷花池还是向 成都国际商贸城搬迁? 天回镇的来历 天回镇规划 天回镇还拆不拆了 小米手机没有声音是什么原因? 小米手机突然没声音了,该怎么办? 荣耀手表耐刮伤吗? 湖北鸿岭酒价格500酱香酒多少钱一瓶? 求一篇英语作文,和远程教育有关。 英语作文网络教育的利与弊 英语作文 网络教育,你的观点以及原因 谈谈自己对网络教育的了解的英语作文?急用,谢谢啦 未来学校学习和办公室工作可以完全被移到网络上进行,你对此有什么看法。英语作文? 求一篇英语作文,120字就可以了 英语作文是我自己对于网上教育的看法。1;网上教育好处。2;网上教育的不 5年前的飞机票还能查到吗? 关于线上学习的好方法和需要改正的坏习惯的英语作文? 英语作文关于网上学习的看法 关于在线教育的英语作文,有没有范文 求关于网络教育的英语作文,要自己写的,英语高人快来啊,急救急救 我眼中的在线教育英语作文 高一英语作文关于对学生上网的看法120词左右 互联网和教育的关系的英语作文 《尴尬》txt全集下载 护发素用后一定要洗干净吗? 《就是要宠你》txt全集下载 有一部小说。女主是重生的。男主叫冷隽,女主叫什么我忘了。这回男主不是渣男,前世是个好男生,结果被女 用护发素有坏处吗?为什么有人说用护发素会使头发变干?