一、基本概念

  大数据也称之为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. Java——String.split()函数

    在java doc里有 String[] java.lang.String.split(String regex) Splits this string around matches of the g ...

  2. Sql 基于列的Case表达式

    Case表达式可以用在 Select,update ,delete ,set,in,where ,order by,having子句之后, 只是case表达式不能控制sql程序的流程,只能作为基于列的 ...

  3. TLF相关资料

    1\(转)http://blog.csdn.net/hu36978/article/details/5796165 TFL 一般先创建TextFlow  通过控制flowComposer属性来控制文本 ...

  4. 10_Jaxws使用自定义pojo发布服务

    [简述] 查询三天的天气信息(天气概况.日期.温度),测试jaxws是否支持自定义pojo发布服务. [开发过程] 服务端: 1.自定义pojo(天气概况.日期.温度) 2.开发SEI接口及实现类 3 ...

  5. Jsp页面里引入一个javascript文件,在jsp的onclick里怎么添加脚本文件里的方法

    举个简单例子:首先新建use.js文件内容:function show(){ alert("aa");} 建html文件跟use.js放同目录下: <html>< ...

  6. Java标准输入输出流的重定向及恢复

    在Java中输入输出数据一般(图形化界面例外)要用到标准输入输出流System.in和System.out,System.in,System.out默认指向控制台,但有时程序从文件中输入数据并将结果输 ...

  7. entity framework mysql 那些写法你碰不得

    记 几次 ef 数据查询踩到的坑......未完待续

  8. 不用jsonp实现跨域请求

    这几天要用到跨域请求,我在网上找了好多资料,最后自己研究出来一个比较简单方便的, 请求的过程和jquery普通的ajax一样.我用的是.net平台 ,IIS7.5 来看一下后台的代码,我是用MVC的C ...

  9. PHP之图形处理

    图形处理 PHP 的图形处理,主要功能集中在 PHP 的图形处理函数. 需要先掌握一些要点.什么叫图片,怎么显示图片. 所谓的图片,其实也是一种文件,只是内容不是我们肉眼直接可见的.如果我们用记事本打 ...

  10. Nginx禁止通过IP,未绑定域名访问服务器

    这几天查看CNZZ统计后台看到,我的IP被两个未知的域名绑定了,为了避免被天朝和谐掉, 可以在Nginx上设置禁止通过IP访问服务器,只能通过绑定域名访问(同时设置未绑定域名返回500错误或者跳转到我 ...