一、CLOB

  1.1CLOB简介

  CLOB全称是(Character Large Object)字符大对象,用于存储大量的文本数据。

  字符大对象的操作不同于一般数据,是通过流来完成的。

  

  1.2MySQL中相关类型

  -tinytext:最大255个字节(2^8-1)。

  -text:最大65535个字节(2^16-1)。

  -mediumtext:最大16777215 个字节(2^24-1)。

  -longtext:最大4294967295个字节(2^32-1)。

  1.3CLOB对象的写入与读取

  void java.sql.PreparedStatement.setClob(int parameterIndex, Reader reader);

  设置CLOB在数据库中对应列标位置及输入流,即将reader流所代表的文件(或信息)写入到数据库第parameterIndex列。

  Reader java.sql.Clob.getCharacterStream();//获取CLOB对象的字符流

  文本内容:

                 

建表语句:

  1. CREATE TABLE `test_clob` (
  2. `id` int(11) NOT NULL,
  3. `name` varchar(20) DEFAULT NULL,
  4. `clob` text,
  5. PRIMARY KEY (`id`)
  6. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  1. import java.io.File;
  2. import java.io.FileNotFoundException;
  3. import java.io.FileReader;
  4. import java.io.IOException;
  5. import java.io.Reader;
  6. import java.sql.Connection;
  7. import java.sql.DriverManager;
  8. import java.sql.PreparedStatement;
  9. import java.sql.ResultSet;
  10. import java.sql.SQLException;
  11. import java.text.DateFormat;
  12. import java.text.ParseException;
  13. import java.text.SimpleDateFormat;
  14.  
  15. public class TestJDBC{
  16. public static void main(String[] args) throws FileNotFoundException{
  17. final String connectionUrl = "jdbc:mysql://localhost:3306/mybatis";
  18. String userName = "root";
  19. String passWord = "123456";
  20. Connection conn = null;
  21. PreparedStatement ps = null;
  22. try {
  23. Class.forName("com.mysql.cj.jdbc.Driver");
  24. conn = DriverManager.getConnection(connectionUrl,userName,passWord);
  25. conn.setAutoCommit(false);
  26. ps = conn.prepareStatement("INSERT INTO `mybatis`.`test_clob`"
  27. + "(`id`,`name`, `clob`) "
  28. + "VALUES (?, ?, ?);");
  29. ps.setObject(1, 1);
  30. ps.setObject(2, "1");
           //clob通过流的形式进行写入
           //也可以通过这种方法将指定字符放入数据库
           //ps.setClob(3, new BufferedReader(new InputStreamReader(new ByteArrayInputStream("testClob".getBytes()))));
  31. ps.setClob(3, new FileReader(new File("F:\\TestJava\\testClob.txt")));
  32. ps.execute();
  33. ps = conn.prepareStatement("select * from test_clob where id = ?");
  34. ps.setObject(1, 1);
  35. ResultSet rs = ps.executeQuery();
  36. conn.commit();
  37. while(rs.next()){//获取clob的字符流
  38. Reader re = rs.getClob("clob").getCharacterStream();
  39. int intToChar = -1;//将返回内容依次读取
  40. while((intToChar = re.read()) != -1){
  41. System.out.print((char)intToChar);
  42. }
  43. }
  44. System.out.println("select 成功");
  45. } catch (ClassNotFoundException e) {
  46. // TODO Auto-generated catch block
  47. e.printStackTrace();
  48. } catch (SQLException e) {
  49. try {
  50. conn.rollback();
  51. } catch (SQLException e1) {
  52. // TODO Auto-generated catch block
  53. e1.printStackTrace();
  54. }
  55. // TODO Auto-generated catch block
  56. e.printStackTrace();
  57. } catch (IOException e) {
  58. // TODO Auto-generated catch block
  59. e.printStackTrace();
  60. }
  61. }
  62. }
  1. 运行结果:
  2. testClob.txt
  3. testClob.txt
  4. testClob.txt
  5. testClob.txt
  6. testClob.txtselect 成功

CLOB通过流方法将数据添加到数据库,从数据库中获取CLOB也是通过流的方式读取内容。

二、BLOB

  1.1BLOB简介

  BLOB全称是( Large Object)字符大对象,用于存储大量的数据(如图片、视频等)。

  字符大对象的操作不同于一般数据,是通过流来完成的。

  

  1.2MySQL中相关类型

  -tinyblob:最大255个字节(2^8-1)。

  -blob:最大65535个字节(2^16-1)。

  -mediumtblob:最大16777215 个字节(2^24-1)。

  -longblob:最大4294967295个字节(2^32-1)。

  

  

   2.3BLOB对象的写入与读取

  方法和上述CLOB使用方法基本相同。

  void java.sql.PreparedStatement.setBlob(int parameterIndex, InputStream inputStream) ;

  //设置放入数据库BLOB对象的输入流,及列标。

  InputStream java.sql.Blob.getBinaryStream()

  //获取数据库BLOB对象的输入流

  

  (表字段及类型)

  

建表语句:

  1. CREATE TABLE `test_blob` (
  2. `id` int(11) NOT NULL,
  3. `name` varchar(50) DEFAULT NULL,
  4. `blob` mediumblob,
  5. PRIMARY KEY (`id`)
  6. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  1. import java.io.FileInputStream;
  2. import java.io.FileNotFoundException;
  3. import java.io.FileOutputStream;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import java.io.OutputStream;
  7. import java.sql.Connection;
  8. import java.sql.DriverManager;
  9. import java.sql.PreparedStatement;
  10. import java.sql.ResultSet;
  11. import java.sql.SQLException;
  12. import java.text.DateFormat;
  13. import java.text.ParseException;
  14. import java.text.SimpleDateFormat;
  15.  
  16. public class TestJDBC{
  17. public static void main(String[] args) throws FileNotFoundException{
  18. final String connectionUrl = "jdbc:mysql://localhost:3306/mybatis";
  19. String userName = "root";
  20. String passWord = "123456";
  21. Connection conn = null;
  22. PreparedStatement ps = null;
  23. OutputStream os = null;
  24. try {
  25. Class.forName("com.mysql.cj.jdbc.Driver");
  26. conn = DriverManager.getConnection(connectionUrl,userName,passWord);
  27. conn.setAutoCommit(false);
  28. ps = conn.prepareStatement("INSERT INTO `mybatis`.`test_blob`"
  29. + "(`id`,`name`, `blob`) "
  30. + "VALUES (?, ?, ?);");
  31. ps.setObject(1, 1);
  32. ps.setObject(2, "1");
           //将该文件以BLOB对象形式放入数据库中
  33. ps.setBlob(3, new FileInputStream("F:/依风/Pictures/下载图片/bg.jpg"));;
  34. ps.execute();
           
  35. ps = conn.prepareStatement("select * from test_blob where id = ?");
  36. ps.setObject(1, 1);
           //获取查询结果
  37. ResultSet rs = ps.executeQuery();
  38. conn.commit();
  39. byte[] buff = new byte[1024];
  40. int step = -1;
           //指定输出流写出位置 F:\Test\Java\test.jpg
  41. os = new FileOutputStream("F:\\TestJava\\test.jpg");
  42. while(rs.next()){
              //获取数据库中BLOB对象的输入流
  43. InputStream is = rs.getBlob("blob").getBinaryStream();
              //读入BLOB对象内容,并将其写入指定位置
  44. while((step = is.read(buff)) != -1){
  45. os.write(buff, 0, step);
  46. }
  47. is.close();
  48. os.close();
  49. }
  50. System.out.println("成功");
  51. } catch (ClassNotFoundException e) {
  52. // TODO Auto-generated catch block
  53. e.printStackTrace();
  54. } catch (SQLException e) {
  55. try {
  56. conn.rollback();
  57. } catch (SQLException e1) {
  58. // TODO Auto-generated catch block
  59. e1.printStackTrace();
  60. }
  61. // TODO Auto-generated catch block
  62. e.printStackTrace();
  63. } catch (IOException e) {
  64. // TODO Auto-generated catch block
  65. e.printStackTrace();
  66. }
  67. }
  68. }
  1. 运行结果:
  2. select 成功

上述代码先将图片放入数据库中,然后从数据库中获取到对应的BLOB对象,

最后获取BLOB的输入流,并将其写入到指定文件夹,可以看到数据库(以图片方式查看)和指定文件夹中都有图片。

10.4(java学习笔记)CLOB,BLOB基本操作的更多相关文章

  1. 10.1(java学习笔记)JDBC基本操作(连接,执行SQL语句,获取结果集)

    一.JDBC JDBC的全称是java database connection java数据库连接. 在java中需要对数据库进行一系列的操作,这时就需要使用JDBC. sun公司制定了关于数据库操作 ...

  2. 5.10(java学习笔记)容器的同步控制与只读设置

    1.容器的同步控制 像我们平常使用的容器有些是不同步的即线程不安全,例如HashMap等,在多线程时可能出现并发问题. 而有些容器又是同步的,例如Hashtable. 有些时候我们需要将这些不同步的容 ...

  3. 1.10(java学习笔记)super关键字

    supe主要是调用父类中被重写的方法及属性. 用下列代码那说明: package cn.hcf.TestSuper; public class TestSuper { public static vo ...

  4. 20155234 2610-2017-2第九周《Java学习笔记》学习总结

    20155234第九周<Java学习笔记>学习总结 教材学习内容总结 数据库本身是个独立运行的应用程序 撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找 JDBC(Ja ...

  5. 20145330第九周《Java学习笔记》

    20145330第九周<Java学习笔记> 第十六章 整合数据库 JDBC入门 数据库本身是个独立运行的应用程序 撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找 JD ...

  6. Java学习笔记4

    Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...

  7. java学习笔记04--数组

    java学习笔记04--数组 数组复制的方法是使用System类提供的arraycopy()方法,其语法如下: System.arraycopy(Object src, int srcPos, Obj ...

  8. 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁

    什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...

  9. Java学习笔记(04)

    Java学习笔记(04) 如有不对或不足的地方,请给出建议,谢谢! 一.对象 面向对象的核心:找合适的对象做合适的事情 面向对象的编程思想:尽可能的用计算机语言来描述现实生活中的事物 面向对象:侧重于 ...

  10. 0028 Java学习笔记-面向对象-Lambda表达式

    匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...

随机推荐

  1. BS架构下使用消息队列的工作流程

    异步通信 对于BS(Browser-Server 浏览器)架构,很多情景下server的处理时间较长. 如果浏览器发送请求后,保持跟server的连接,等待server响应,那么一方面会对用户的体验有 ...

  2. Spring学习-- Bean 的作用域

    Bean 的作用域: 在 Spring 中 , 可以在 <bean> 元素的 scope 属性里设置 bean 的作用域. 默认情况下 , Spring 只为每个在 IOC 容器里声明的 ...

  3. js闭包,原型,作用域等再一次理解

    要理解闭包,原型等,首先要理解作用域 作用域:就是函数在定义的时候创建的,用于寻找使用到的变量的值的一个索引,而他内部的规则是,把函数自身的本地变量放在最前面,把自身的父级函数中的变量放在其次,把再高 ...

  4. Python 进阶学习笔记

    把函数作为参数 import math def add(x, y, f): return f(x) + f(y) print add(, , math.sqrt) map(f, list) 函数 接收 ...

  5. Sencha Touch2 -- 11.1:定义具有关联关系的模型

    在Sencha Touch2.0中,可以定义不同模型之间的关联关系.例如,在开发博客网站的时候,可以首先定义用户(User)模型,然后为用户定义文章(Article)模型.一个用户可以发表多篇文章,因 ...

  6. 图片上传是否为空,以及类型的js验证

    function check2() { var file = document.getElementsByName("file").value; if(file=="&q ...

  7. HDU1869---(最短路+floyd)

    http://acm.hdu.edu.cn/showproblem.php?pid=1869 思路:最短路+floyd 分析:1 题目是要求所有的数据能否满足“六度分离”,那么我们就想到所有点之间的最 ...

  8. python实现多个文件的分发

    之前写的脚本只能分发一个配置,每次分发多个配置总要执行很多次,很不爽,于是就有了这个脚本 from multiprocessing import Process import paramiko imp ...

  9. JVM 性能排查--查看哪个对象占用内存大

    参考:http://blog.csdn.net/chenleixing/article/details/44227327/ 1.  在IE地址栏中输入:http://localhost/test/in ...

  10. 25个常规方法优化你的jquery代码

    原文发布时间为:2011-06-06 -- 来源于本人的百度文章 [由搬家工具导入] http://www.tvidesign.co.uk/blog/improve-your-jquery-25-ex ...