一、基本概念

  大数据也称之为LOB(Large Objects),LOB又分为:clob和blob,clob用于存储大文本,blob用于存储二进制数据,例如图像、声音、二进制文等。

  在实际开发中,有时是需要用程序把大文本或二进制数据直接保存到数据库中进行储存的。

  对MySQL而言只有blob,而没有clob,mysql存储大文本采用的是Text,Text和blob分别又分为:
  TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT
  TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB

二、搭建测试环境

2.1、搭建的测试项目架构

  如下:

  

2.2、编写db.properties配置文件

1 driver=com.mysql.jdbc.Driver
2 url=jdbc:mysql://localhost:3306/jdbcStudy
3 username=root
4 password=XDP

2.3、编写JdbcUtils工具类

 1 package me.gacl.utils;
 2
 3 import java.io.InputStream;
 4 import java.sql.Connection;
 5 import java.sql.DriverManager;
 6 import java.sql.ResultSet;
 7 import java.sql.SQLException;
 8 import java.sql.Statement;
 9 import java.util.Properties;
10
11 public class JdbcUtils {
12
13     private static String driver = null;
14     private static String url = null;
15     private static String username = null;
16     private static String password = null;
17
18     static{
19         try{
20             //读取db.properties文件中的数据库连接信息
21             InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream("db.properties");
22             Properties prop = new Properties();
23             prop.load(in);
24
25             //获取数据库连接驱动
26             driver = prop.getProperty("driver");
27             //获取数据库连接URL地址
28             url = prop.getProperty("url");
29             //获取数据库连接用户名
30             username = prop.getProperty("username");
31             //获取数据库连接密码
32             password = prop.getProperty("password");
33
34             //加载数据库驱动
35             Class.forName(driver);
36
37         }catch (Exception e) {
38             throw new ExceptionInInitializerError(e);
39         }
40     }
41
42     /**
43     * @Method: getConnection
44     * @Description: 获取数据库连接对象
45     * @Anthor:孤傲苍狼
46     *
47     * @return Connection数据库连接对象
48     * @throws SQLException
49     */
50     public static Connection getConnection() throws SQLException{
51         return DriverManager.getConnection(url, username,password);
52     }
53
54     /**
55     * @Method: release
56     * @Description: 释放资源,
57     *     要释放的资源包括Connection数据库连接对象,负责执行SQL命令的Statement对象,存储查询结果的ResultSet对象
58     * @Anthor:孤傲苍狼
59     *
60     * @param conn
61     * @param st
62     * @param rs
63     */
64     public static void release(Connection conn,Statement st,ResultSet rs){
65         if(rs!=null){
66             try{
67                 //关闭存储查询结果的ResultSet对象
68                 rs.close();
69             }catch (Exception e) {
70                 e.printStackTrace();
71             }
72             rs = null;
73         }
74         if(st!=null){
75             try{
76                 //关闭负责执行SQL命令的Statement对象
77                 st.close();
78             }catch (Exception e) {
79                 e.printStackTrace();
80             }
81         }
82
83         if(conn!=null){
84             try{
85                 //关闭Connection数据库连接对象
86                 conn.close();
87             }catch (Exception e) {
88                 e.printStackTrace();
89             }
90         }
91     }
92 }

三、使用JDBC处理MySQL的大文本

  对于MySQL中的Text类型,可调用如下方法设置

1 PreparedStatement.setCharacterStream(index, reader, length);//注意length长度须设置,并且设置为int型

  对MySQL中的Text类型,可调用如下方法获取

1 reader = resultSet. getCharacterStream(String columnLabel);2 string s = resultSet.getString(String columnLabel);

3.1、 测试范例

  1、编写SQL测试脚本

1 create database jdbcstudy;
2 use jdbcstudy;
3 create table testclob
4 (
5          id int primary key auto_increment,
6          resume text
7 );

  2、编写测试代码如下:

  1 package me.gacl.demo;
  2
  3 import java.io.File;
  4 import java.io.FileReader;
  5 import java.io.FileWriter;
  6 import java.io.Reader;
  7 import java.sql.Connection;
  8 import java.sql.PreparedStatement;
  9 import java.sql.ResultSet;
 10 import me.gacl.utils.JdbcUtils;
 11 import org.junit.Test;
 12
 13 /**
 14 * @ClassName: JdbcOperaClob
 15 * @Description: 使用JDBC操作MySQL的大文本
 16 * @author: 孤傲苍狼
 17 * @date: 2014-9-19 下午10:10:04
 18 *
 19 */
 20 public class JdbcOperaClob {
 21
 22     /**
 23     * @Method: add
 24     * @Description:向数据库中插入大文本数据
 25     * @Anthor:孤傲苍狼
 26     *
 27     */
 28     @Test
 29     public void add(){
 30         Connection conn = null;
 31         PreparedStatement st = null;
 32         ResultSet rs = null;
 33         Reader reader = null;
 34         try{
 35             conn = JdbcUtils.getConnection();
 36             String sql = "insert into testclob(resume) values(?)";
 37             st = conn.prepareStatement(sql);
 38             //这种方式获取的路径,其中的空格会被使用“%20”代替
 39             String path = JdbcOperaClob.class.getClassLoader().getResource("data.txt").getPath();
 40             //将“%20”替换回空格
 41             path = path.replaceAll("%20", " ");
 42             File file = new File(path);
 43             reader = new FileReader(file);
 44             st.setCharacterStream(1, reader,(int) file.length());
 45             int num = st.executeUpdate();
 46             if(num>0){
 47                 System.out.println("插入成功!!");
 48             }
 49             //关闭流
 50             reader.close();
 51         }catch (Exception e) {
 52             e.printStackTrace();
 53         }finally{
 54             JdbcUtils.release(conn, st, rs);
 55         }
 56     }
 57
 58     /**
 59     * @Method: read
 60     * @Description: 读取数据库中的大文本数据
 61     * @Anthor:孤傲苍狼
 62     *
 63     */
 64     @Test
 65     public void read(){
 66         Connection conn = null;
 67         PreparedStatement st = null;
 68         ResultSet rs = null;
 69         try{
 70             conn = JdbcUtils.getConnection();
 71             String sql = "select resume from testclob where id=2";
 72             st = conn.prepareStatement(sql);
 73             rs = st.executeQuery();
 74
 75             String contentStr ="";
 76             String content = "";
 77             if(rs.next()){
 78                 //使用resultSet.getString("字段名")获取大文本数据的内容
 79                 content = rs.getString("resume");
 80                 //使用resultSet.getCharacterStream("字段名")获取大文本数据的内容
 81                 Reader reader = rs.getCharacterStream("resume");
 82                 char buffer[] = new char[1024];
 83                 int len = 0;
 84                 FileWriter out = new FileWriter("D:\\1.txt");
 85                 while((len=reader.read(buffer))>0){
 86                     contentStr += new String(buffer);
 87                     out.write(buffer, 0, len);
 88                 }
 89                 out.close();
 90                 reader.close();
 91             }
 92             System.out.println(content);
 93             System.out.println("-----------------------------------------------");
 94             System.out.println(contentStr);
 95         }catch (Exception e) {
 96             e.printStackTrace();
 97         }finally{
 98             JdbcUtils.release(conn, st, rs);
 99         }
100     }
101 }

四、使用JDBC处理MySQL的二进制数据

  对于MySQL中的BLOB类型,可调用如下方法设置:

1 PreparedStatement. setBinaryStream(i, inputStream, length);

  对MySQL中的BLOB类型,可调用如下方法获取:

1 InputStream in  = resultSet.getBinaryStream(String columnLabel);
2 InputStream in  = resultSet.getBlob(String columnLabel).getBinaryStream(); 

4.1、 测试范例

  1、编写SQL测试脚本

1 create table testblob
2 (
3      id int primary key auto_increment,
4      image longblob
5 );

  2、编写测试代码如下:

 1 package me.gacl.demo;
 2
 3 import java.io.File;
 4 import java.io.FileInputStream;
 5 import java.io.FileOutputStream;
 6 import java.io.InputStream;
 7 import java.sql.Connection;
 8 import java.sql.PreparedStatement;
 9 import java.sql.ResultSet;
10 import me.gacl.utils.JdbcUtils;
11 import org.junit.Test;
12
13 /**
14 * @ClassName: JdbcOperaClob
15 * @Description: 使用JDBC操作MySQL的二进制数据(例如图像、声音、二进制文)
16 * @author: 孤傲苍狼
17 * @date: 2014-9-19 下午10:10:04
18 *
19 */
20 public class JdbcOperaBlob {
21
22     /**
23     * @Method: add
24     * @Description:向数据库中插入二进制数据
25     * @Anthor:孤傲苍狼
26     *
27     */
28     @Test
29     public void add(){
30         Connection conn = null;
31         PreparedStatement st = null;
32         ResultSet rs = null;
33         try{
34             conn = JdbcUtils.getConnection();
35             String sql = "insert into testblob(image) values(?)";
36             st = conn.prepareStatement(sql);
37             //这种方式获取的路径,其中的空格会被使用“%20”代替
38             String path = JdbcOperaBlob.class.getClassLoader().getResource("01.jpg").getPath();
39             //将“%20”替换会空格
40             path = path.replaceAll("%20", " ");
41             File file = new File(path);
42             FileInputStream fis = new FileInputStream(file);//生成的流
43             st.setBinaryStream(1, fis,(int) file.length());
44             int num = st.executeUpdate();
45             if(num>0){
46                 System.out.println("插入成功!!");
47             }
48             fis.close();
49         }catch (Exception e) {
50             e.printStackTrace();
51         }finally{
52             JdbcUtils.release(conn, st, rs);
53         }
54     }
55
56     /**
57     * @Method: read
58     * @Description: 读取数据库中的二进制数据
59     * @Anthor:孤傲苍狼
60     *
61     */
62     @Test
63     public void read() {
64         Connection conn = null;
65         PreparedStatement st = null;
66         ResultSet rs = null;
67         try {
68             conn = JdbcUtils.getConnection();
69             String sql = "select image from testblob where id=?";
70             st = conn.prepareStatement(sql);
71             st.setInt(1, 1);
72             rs = st.executeQuery();
73             if (rs.next()) {
74                 //InputStream in = rs.getBlob("image").getBinaryStream();//这种方法也可以
75                 InputStream in = rs.getBinaryStream("image");
76                 int len = 0;
77                 byte buffer[] = new byte[1024];
78
79                 FileOutputStream out = new FileOutputStream("D:\\1.jpg");
80                 while ((len = in.read(buffer)) > 0) {
81                     out.write(buffer, 0, len);
82                 }
83                 in.close();
84                 out.close();
85             }
86         } catch (Exception e) {
87             e.printStackTrace();
88         } finally {
89             JdbcUtils.release(conn, st, rs);
90         }
91     }
92 }

  关于使用JDBC处理MySQL大数据的内容就总结这么多!

javaweb学习总结(三十四)——使用JDBC处理MySQL大数据的更多相关文章

  1. javaweb(三十四)——使用JDBC处理MySQL大数据

    一.基本概念 大数据也称之为LOB(Large Objects),LOB又分为:clob和blob,clob用于存储大文本,blob用于存储二进制数据,例如图像.声音.二进制文等. 在实际开发中,有时 ...

  2. JavaWeb学习总结(三十五)——使用JDBC处理Oracle大数据

    一.Oracle中大数据处理 在Oracle中,LOB(Large Object,大型对象)类型的字段现在用得越来越多了.因为这种类型的字段,容量大(最多能容纳4GB的数据),且一个表中可以有多个这种 ...

  3. Mysql学习总结(13)——使用JDBC处理MySQL大数据

    一.基本概念 大数据也称之为LOB(Large Objects),LOB又分为:clob和blob,clob用于存储大文本,blob用于存储二进制数据,例如图像.声音.二进制文等. 在实际开发中,有时 ...

  4. JavaWeb(三十五)——使用JDBC处理Oracle大数据

    一.Oracle中大数据处理 在Oracle中,LOB(Large Object,大型对象)类型的字段现在用得越来越多了.因为这种类型的字段,容量大(最多能容纳4GB的数据),且一个表中可以有多个这种 ...

  5. javaweb学习总结(三十六)——使用JDBC进行批处理

    在实际的项目开发中,有时候需要向数据库发送一批SQL语句执行,这时应避免向数据库一条条的发送执行,而应采用JDBC的批处理机制,以提升执行效率. JDBC实现批处理有两种方式:statement和pr ...

  6. 风炫安全web安全学习第三十四节课 文件包含漏洞防御

    风炫安全web安全学习第三十四节课 文件包含漏洞防御 文件包含防御 在功能设计上不要把文件包含的对应文件放到前台去操作 过滤各种../,https://, http:// 配置php.ini文件 al ...

  7. 十七:使用JDBC处理MySQL大数据

    一.基本概念 大数据也称之为LOB(Large Objects),LOB又分为:clob和blob,clob用于存储大文本,blob用于存储二进制数据,例如图像.声音.二进制文等. 在实际开发中,有时 ...

  8. JavaWeb学习笔记(十四)—— 使用JDBC处理MySQL大数据

    一.什么是大数据 所谓大数据,就是大的字节数据,或大的字符数据.大数据也称之为LOB(Large Objects),LOB又分为:clob和blob,clob用于存储大文本,blob用于存储二进制数据 ...

  9. JavaWeb学习总结(十四)--Apache的DBUtils

    一.commons-dbutils简介 commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化 ...

随机推荐

  1. Linux系统各发行版镜像下载(2)

    Fedora ISO镜像下载: Fedora 是一个开放的.创新的.前瞻性的操作系统和平台,基于 Linux.它允许任何人自由地使用.修改和重发布,无论现在还是将来.它由一个强大的社群开发,这个社群的 ...

  2. Cordova+angularjs+ionic+vs2015开发(三)

    欢迎加群学习:457351423 这里有4000多部学习视频,涵盖各种技术,有需要的欢迎进群学习! 一.基础设置 1.修改App名称和程序起始页 打开config.xml配置文件显示如下,在[通用]选 ...

  3. 解决:The Operation couldn't be completed.(LaunchServicesError error 0.)

    问题描述:当运行Xcode6时,编译代码成功,但是登陆模拟器失败,显示错误: The Operation couldn't be completed.(LaunchServicesError erro ...

  4. 暑假集训(3)第一弹 -----还是畅通工程(hdu1233)

    题意梗概:N(n<100)个村子想要富起来,自然就要先修路,不过到底还是没富起来,所以陷入了一个怪圈 :资金不足->修不起路->资金不足...... 为了实现走向全民小康社会,全面实 ...

  5. C++中使用多线程

    使用的函数是CreateThread和CloseHandle相互配合. 举个简单的例子: 申明类变量 HANDLE hThread; DWORD ThreadID; 在需要创建线程的地方使用: hTh ...

  6. centos 6.4 安装php-fpm 及常用扩展,(转)

    今天又装了一次开发环境,以前忘记记录了 这次记录一下 ---------------------------------------- centos6 yum安装nginx.php-fpm 时间201 ...

  7. libpcap 主要函数及过程详解

    http://blog.chinaunix.net/uid-21556133-id-120228.html libpcap(Packet Capture Library),即数据包捕获函数库,是Uni ...

  8. pngfix 实现Png图片透明效果

    1.http://www.jb51.net/codes/67324.html 2.DD_belatedPNG工具

  9. 电脑升级完Xcode8后 注释快捷键无效的问题

    1.部分电脑升级完Xcode8 后直接重启电脑就可以使用Command +/ 快捷键注释代码, 2.如果上述方法没有效果,可以在终端输入sudo /usr/libexec/xpccachectl  然 ...

  10. 一个空格也可以让html格式显示大不相同

    今天在编写html时出现了bug,有两个标签一直贴近显示,但是两段代码完全一样前一段就没有问题. 错误代码如下 <div id="tool1" style="wid ...