Mysql学习总结(13)——使用JDBC处理MySQL大数据
一、基本概念
大数据也称之为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大数据的内容就总结这么多!
Mysql学习总结(13)——使用JDBC处理MySQL大数据的更多相关文章
- JavaWeb学习总结(三十五)——使用JDBC处理Oracle大数据
一.Oracle中大数据处理 在Oracle中,LOB(Large Object,大型对象)类型的字段现在用得越来越多了.因为这种类型的字段,容量大(最多能容纳4GB的数据),且一个表中可以有多个这种 ...
- mysql 5.7 innodb count count(*) count(1) 大数据 查询慢 耗时多 优化
原文:mysql 5.7 innodb count count(*) count(1) 大数据 查询慢 耗时多 优化 问题描述 mysql 5.7 innodb 引擎 使用以下几种方法进行统计效率差不 ...
- 使用JDBC处理Oracle大数据
一.Oracle中大数据处理 在Oracle中,LOB(Large Object,大型对象)类型的字段现在用得越来越多了.因为这种类型的字段,容量大(最多能容纳4GB的数据),且一个表中可以有多个这种 ...
- 利用jdbc处理oracle大数据---大文件和二进制文件
一.Oracle中大数据处理 在Oracle中,LOB(Large Object,大型对象)类型的字段现在用得越来越多了.因为这种类型的字段,容量大(最多能容纳4GB的数据),且一个表中可以有多个这种 ...
- JavaWeb(三十五)——使用JDBC处理Oracle大数据
一.Oracle中大数据处理 在Oracle中,LOB(Large Object,大型对象)类型的字段现在用得越来越多了.因为这种类型的字段,容量大(最多能容纳4GB的数据),且一个表中可以有多个这种 ...
- 42步进阶学习—让你成为优秀的Java大数据科学家!
作者 灯塔大数据 本文转自公众号灯塔大数据(DTbigdata),转载需授权 如果你对各种数据类的科学课题感兴趣,你就来对地方了.本文将给大家介绍让你成为优秀数据科学家的42个步骤.深入掌握数据准备, ...
- MySql学习—— 查询性能优化 深入理解MySql如何执行查询
本篇深入了解查询优化和服务器的内部机制,了解MySql如何执行特定查询,从中也可以知道如何更改查询执行计划,当我们深入理解MySql如何真正地执行查询,明白高效和低效的真正含义,在实际应用中就能扬长避 ...
- Mysql学习—查看表结构、修改和删除数据表
原文出自:http://blog.csdn.net/junjieguo/article/details/7668775 查看表结构 查看表结构可以用语句DESCRIBE或SHOW CREATE TAB ...
- MySQL学习(一)MySQLWorkbench(MySQL可视化工具)下载,安装,测试连接,以及注意事项
PS:MySQLWorkbench是MYSQL自带的可视化工具,无论使用哪个可视化工具,其实大同小异,如果想以后走的更远的话,可以考虑使用命令行操作数据库MYSQL.可视化工具让我们初学者更能理解数据 ...
- MySQL学习系列一---命令行连接mysql和执行sql文件
1.命令行连接mysql #mysql -h(主机) -u(用户名) -p (数据库名) mysql -hlocalhost -uroot -p testdb Enter password: **** ...
随机推荐
- yii2.0缓存篇之页面缓存
页面缓存: 如果整个页面都不会发生改变,就可以使用页面缓存缓存整个页面. public function behaviors(){ //此方法[也叫行为]会提前控制器内其他方法执 ...
- 从Chrome源码看audio/video流媒体实现二(转)
第一篇主要介绍了Chrome加载音视频的缓冲控制机制和编解码基础,本篇将比较深入地介绍解码播放的过程.以Chromium 69版本做研究. 由于Chromium默认不能播放Mp4,所以需要需要改一下源 ...
- ArcGIS api for javascript——设置自定义范围和空间参考
描述 这个示例展示了在创建地图时如果定义一个自定义的范围和空间参考. 在 ArcGIS JavaScript API的1.0和1.1版本,任何要使用的地图服务图层都需要和地图的空间参考一致.1.2版本 ...
- 剑指Offer面试题27(Java版):二叉搜索树与双向链表
题目:输入一颗二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建新的结点.仅仅能调整树中结点指针的指向. 比方例如以下图中的二叉搜索树.则输出转换之后的排序双向链表为: 在二叉树中,每一 ...
- DDR工作原理
DDR SDRAM全称为Double Data Rate SDRAM,中文名为“双倍数据流SDRAM”.DDR SDRAM在原有的SDRAM的基础上改进而来.也正因为如此,DDR能够凭借着转产成本优势 ...
- div动态加载页面
div动态加载页面 /* /// method 1 var url="<%=basePath%>/qne.do?p=pessegerCountSet"; $.post( ...
- XT800 在域环境在运行设置
测试时先将防火墙关了,不然无法远程,找个问题后再打开防火墙 0. 防火墙中建立规则,允许XT800通过. 1.在客户端当前用户下运行XT800安装程序 2.输入管理员账号及密码 3.安装时选择D或E盘 ...
- 如何在VMware中创建虚拟机
今天给大家分享如何在VMware中创建虚拟机,具体的教程如下.在这里小编提前下载了Ubuntu14.04桌面系统,为后面在虚拟机中安装Ubuntu14.04桌面系统做准备. 1.从官网上或者直接百度上 ...
- Metro界面的真正意义
昨天去客户那给安装防火墙和交换机,因为客户和我们公司签订了维保的合同,然后我们公司两个人去了客户那跟客户沟通也去顺路去做巡检. 客户之前跟我们公司采购了一台DELL的PC服务器,预装了win serv ...
- iOS 的组件化开发
在一个APP开发过程中,如果项目较小且团队人数较少,使用最基本的MVC.MVVM开发就已经足够了,因为维护成本比较低. 但是当一个项目开发团队人数较多时,因为每个人都会负责相应组件的开发,常规开发模式 ...