一、基本概念

  大数据也称之为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. C#开发微信门户及应用-使用地理位置扩展相关应用

    C#开发微信门户及应用-使用地理位置扩展相关应用 我们知道,地理位置信息可以用来做很多相关的应用,除了我们可以知道用户所在的位置,还可以关联出一些地理位置的应用,如天气,热映影片,附近景点,附近影院, ...

  2. 使用自签SSL证书有什么风险?

    http://mt.sohu.com/20150602/n414267586.shtml 所谓自签SSL证书,是指不受信任的任意机构或个人,使用工具自己签发的SSL证书.自签名SSL证书可以随意签发, ...

  3. asp:手机扫描二维码跳转手机版

    如果想手机扫描用pc版网站生成的二维码跳转到对应的手机版的话,请在pc端的首页的<head></head>标签里面加入下面内容:   <script src=" ...

  4. 比之前那个版本更简单的C语言实现的比较大小

    之前那个是输入一堆数据,找最大那个,这次是更简单的版本,求两个数的最大值. #include "stdafx.h" #include <stdio.h> int Get ...

  5. c++实现类似Common Lisp的多参数加法和比较

    在CL里我们可以这样: $ sbcl * (+ 1 2 3) 6 * (< 1 2 3) T * (< 2 3 1) NIL * 从简单的方面看, CL的+和<就是一个接收多参数的函 ...

  6. sgu 101 domino

    题意还算简洁明了,加上有道翻译凑过着读完了题.题意大体上是 给你 n 个多米诺骨牌, 给出每个骨牌两端的数字, 只有数字相同才可以推到, 比如 2-3和3-2.你可以旋转这些多米诺骨牌, 输出一个可以 ...

  7. CentOS 开启GD库

    在php.ini 中没有找到"extension=php_gd2.dll"这行代码,这是因为CentOS一般没有预装GD库. 解决办法: 1.在线安装GD库 yum -y inst ...

  8. mysql大数据高并发处理

    一.数据库结构的设计 如果不能设计一个合理的数据库模型,不仅会增加客户端和服务器段程序的编程和维护的难度,而且将会影响系统实际运行的性能.所以,在一个系统开始实施之前,完备的数据库模型的设计是必须的. ...

  9. tomcat错误信息解决方案 严重:StandardServer.await:

    看到这个报错我的第一反应就是端口被占用,用netstat -ant命令查看发现8080端口没有被占用,也可以看到 tomcat的进程已经存在,但是不能对外提供服务. 1.独立运行的tomcat.exe ...

  10. asp.net 获取当前项目路径

    方法一://获取当前项目的路径System.AppDomain.CurrentDomain.BaseDirectory.ToString();   // 得到的是当前项目的根目录取的值:F://Pro ...