上一节主要讲了JDBC的基本操作,这一节主要总结一下JDBC如何处理大文本、如何处理图片以及进行批处理。

1.JDBC处理大文本

MySQL中,大文本是text类型,使用Java操作数据库中的大文本需要两个方法setCharacterStream和getCharacterStream,一个是写入数据库的字符流,一个是从数据库中读取的字符流。setCharacterStream(index,Reader,length)有三个参数,Reader表示获取文件的流,length表示文件的长度,index表示参数的索引。那么获取文件的流Reader如何获得呢?我们可以通过下面方法获取:

String path = Demo1.class.getClassLoader().getResource("1.txt").getPath(); //获取指定文件的Path
File file = new File(path); //以这个path为参数构建一个file对象
Reader reader = new FileReader(file); //以这个file对象为参数构建Reader流,这个流与这个文件就关联了

下面我们来看一下如何向数据库中存入大文本以及如何从数据库中取出大文本。先建立一个数据库:

create database test;
use test;
create table testclob
(
id int primary key auto_increment,
resume text
);

下面看Demo1.java:

public class Demo1 {  

    @Test//向数据库中插入一个文本
public void add() throws FileNotFoundException {
Connection conn = null;
PreparedStatement st = null;
ResultSet rs = null; try {
conn = JDBCUtils.getConnection(); //使用上一节中的JDBCUtils
String sql = "insert into testclob(resume) values(?)";
st = conn.prepareStatement(sql); //预处理sql语句 String path = Demo1.class.getClassLoader().getResource("1.txt").getPath();//在工程src目录下存放一个1.txt文件
File file = new File(path);
st.setCharacterStream(1, new FileReader(file), file.length());
int num = st.executeUpdate(); //执行向数据库中插入
if(num > 0) {
System.out.println("插入成功");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
JdbcUtils.release(conn, st, rs);
}
} @Test //从数据库中读取文本
public void read() throws IOException {
Connection conn = null;
PreparedStatement st = null;
ResultSet rs = null;
try {
conn = JDBCUtils.getConnection();
String sql = "select resume from testclob where id=?";
st = conn.prepareStatement(sql);
st.setInt(1, 1);
rs = st.executeQuery(); //执行sql语句
if(rs.next()){
Reader reader = rs.getCharacterStream("resume"); //获取字段未resume的项,也就是我们刚刚存到数据库的1.txt文件
char buffer[] = new char[1024];
int len = 0;
FileWriter out = new FileWriter("D:\\1.txt"); //写到D盘下
while((len = reader.read(buffer)) > 0){
out.write(buffer, 0, len);
}
out.close();
reader.close();
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
JdbcUtils.release(conn, st, rs);
}
} }

以上就是处理大文本的方法,比较简单,下面我们来看看如何处理图片。

2. JDBC处理图片

在MySQL中,大文本是image类型,我们现在数据库中建立新的表:

create table testblob
(
id int primary key auto_increment,
image longblob
);

然后我们直接看处理图片的java程序Demo2.java:

public class Demo2 {
@Test //向数据库中写入图片
public void add() throws FileNotFoundException {
Connection conn = null;
PreparedStatement st = null;
ResultSet rs = null; try {
conn = JdbcUtils.getConnection();
String sql = "insert into testblob(image) values(?)";
st = conn.prepareStatement(sql);
String path = Demo2.class.getClassLoader().getResource("honey.jpg").getPath(); //图片存在src目录下
st.setBinaryStream(1, new FileInputStream(path), new File(path).length());//这里用的是setBinaryStream,字节流
//这种方法也行,FileInputStream方法重载了,既可以传递路径,也可以传递具体文件
//st.setBinaryStream(1, new FileInputStream(new File(path)), new File(path).length());
int num = st.executeUpdate();
/*这里会有这个错误:
* Packet for query is too large (4531349 > 1048576).
* You can change this value on the server by setting the max_allowed_packet' variable.
* 原因:MySQL的一个系统参数:max_allowed_packet,其默认值为1048576(1M),即允许传递的最大packet为1M,如果照片超过1M无法导入
* 查询:show VARIABLES like '%max_allowed_packet%';修改此变量的值:set global max_allowed_packet = 1024*1024*10;(10M)
* */
if(num > 0){
System.out.println("插入成功");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
JdbcUtils.release(conn, st, rs);
}
} @Test //从数据库中读取图片
public void read() throws IOException {
Connection conn = null;
PreparedStatement st = null;
ResultSet rs = null; try {
conn = JdbcUtils.getConnection();
String sql = "select image from testblob where id=?";
st = conn.prepareStatement(sql);
st.setInt(1, 1);
rs = st.executeQuery();
while(rs.next()){
InputStream in = rs.getBinaryStream("image");//获取用getBinaryStream,也是字节流
int len = 0;
byte buffer[] = new byte[1024];
FileOutputStream out = new FileOutputStream("D:\\honey.jpg"); //写到D盘下
while((len = in.read(buffer)) > 0){
out.write(buffer, 0, len);
}
out.close();
in.close();
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
JdbcUtils.release(conn, st, rs);
}
} }

JDBC操作图片也比较简单,跟操作大文本差不多。下面看看JDBC如何进行批处理。

3. JDBC进行批处理

首先我们还是先建立一个表:

create table testbatch
(
id int primary key,
name varchar(20)
);

然后我们看看JDBC进行批处理的具体代码:

//jdbc进行批处理
public class Demo3 { @Test
public void testBatch() {
Connection conn = null;
Statement st = null;
ResultSet rs = null; try {
conn = JdbcUtils.getConnection();
String sql1 = "insert into testbatch(id,name) values(1,'aaa')";
String sql2 = "insert into testbatch(id,name) values(2,'bbb')";
String sql3 = "insert into testbatch(id,name) values(3,'ccc')";
String sql4 = "delete from testbatch where id=1"; st = conn.createStatement();
st.addBatch(sql1);
st.addBatch(sql2);
st.addBatch(sql3);
st.addBatch(sql4); //将四条sql语句加入Batch st.executeBatch(); //然后依次执行这四条sql语句
st.clearBatch();//执行完后清除batch
} catch (Exception e) {
e.printStackTrace();
} finally {
JdbcUtils.release(conn, st, rs);
}
} @Test //大量插入
public void testBatch2() {
Connection conn = null;
PreparedStatement st = null;
ResultSet rs = null; try {
conn = J<span style="font-family:Microsoft YaHei;">DBC</span>Utils.getConnection();
String sql = "insert into testbatch(id,name) values(?,?)";
st = conn.prepareStatement(sql); for(int i = 0; i < 10000000; i++){
st.setInt(1, i);
st.setString(2, "aa"+i);
st.addBatch();
if(i % 1000 == 0){//每1000条向数据库中添加一次
st.executeBatch();
st.clearBatch();
}
}
st.executeBatch();//防止还剩一些零头的数据,这里刚好是1000的倍数
st.clearBatch();
} catch (Exception e) {
e.printStackTrace();
} finally {
JdbcUtils.release(conn, st, rs);
}
}
}

JDBC大文本、图片的操作以及批处理其实很简单,掌握几个关键的API就可以了,不再赘述,如有错误之处,欢迎留言指正~

JDBC技术总结(二)的更多相关文章

  1. 使用JDBC技术连接数据库(附源码)--JAVA的简单应用

    一.创建数据库(以mysql数据库为例) mysql数据库的下载安装与配置 -可参考博主之前的随笔:Windows平台下搭建MySQL数据库 创建wxb数据库-create database wxb; ...

  2. JDBC技术总结(一)

    1. JDBC简介 SUN公司为了简化.统一对数据库的操作,定义了一套Java操作数据库的规范,称之为JDBC,JDBC不能直接操作数据库,JDBC通过接口加载数据库的驱动,然后操作数据库.JDBC: ...

  3. Javaweb学习笔记7—JDBC技术

      今天来讲javaweb的第7阶段学习. JDBC技术,关于JDBC本篇博客只介绍了它的一部分,后面博客会更加深入探讨. 老规矩,首先先用一张思维导图来展现今天的博客内容.   ps:我的思维是用的 ...

  4. 【阿里聚安全·安全周刊】阿里双11技术十二讲直播预约|AWS S3配置错误曝光NSA陆军机密文件

    关键词:阿里双11技术十二讲直播丨雪人计划丨亚马逊AWS S3配置错误丨2018威胁预测丨MacOS漏洞丨智能风控平台MTEE3丨黑客窃取<权利的游戏>剧本|Android 8.1   本 ...

  5. Excel阅读模式/聚光灯开发技术之二 超级逐步录入提示功能开发原理简述—— 隐鹤 / HelloWorld

    Excel阅读模式/聚光灯开发技术之二 超级逐步录入提示功能开发原理简述———— 隐鹤  /  HelloWorld 1. 引言 自本人第一篇博文“Excel阅读模式/单元格行列指示/聚光灯开发技术要 ...

  6. JDBC驱动程序注册 JDBC简介(二)

    使用JDBC进行数据库操作的第一步就是驱动注册(当然你得先导入JAR). 驱动注册有多种方式,第一步必然是获得正确的驱动名称与URL格式 驱动名称与URL格式 RDBMS 驱动程序名称        ...

  7. 网络虚拟化技术(二): TUN/TAP MACVLAN MACVTAP (转)

    网络虚拟化技术(二): TUN/TAP MACVLAN MACVTAP 27 March 2013 TUN 设备 TUN 设备是一种虚拟网络设备,通过此设备,程序可以方便得模拟网络行为.先来看看物理设 ...

  8. JAVA数据库编程(JDBC技术)-入门笔记

    本菜鸟才介入Java,我现在不急着去看那些基本的语法或者一些Java里面的版本的特征或者是一些晋级的知识,因为有一点.Net的OOP编程思想,所以对于Java的这些语法以及什么的在用到的时候在去发现学 ...

  9. 背景建模技术(二):BgsLibrary的框架、背景建模的37种算法性能分析、背景建模技术的挑战

    背景建模技术(二):BgsLibrary的框架.背景建模的37种算法性能分析.背景建模技术的挑战 1.基于MFC的BgsLibrary软件下载 下载地址:http://download.csdn.ne ...

  10. 转 JDBC连接数据库(二)——连接池

    https://www.cnblogs.com/xiaotiaosi/p/6398371.html 数据库保持长连接,不过一直都是idle,除非有用户激活连接,这样后果是无法删除用户,但是不影响数据库 ...

随机推荐

  1. POCO库中文编程参考指南(5)Poco::Net::SocketAddress

    1 枚举 最大地址长度,这个与Poco::Net::IPAddress中的定义可以类比,不过这里指的是`struct sockaddr_in6 enum { MAX_ADDRESS_LENGTH = ...

  2. 读取文本文件时<U+FEFF> 导致的奇怪问题

    项目中经常会从一些文本文件中读取数据进行业务处理,最近遇到一个问题,另外一个部门提供一个txt文本给我们进行业务处理,当我们使用字符流读取文本之后,处理时,发现第一行数据无法匹配,其他数据可以正常处理 ...

  3. PHP面向对象知识点总结

    1.$this是什么 当前类实例化的对象 2.访问对象中的成员 对象->成员 3.构造方法 通常用来初始化对象的属性,不用把属性写死,不同的对象就有了不同的属性 4.get.set的用法 通常将 ...

  4. MSSQL纵列转横列

    在工作中我们一般会遇到将纵列转横列的需求,具体代码: 1.建表 CREATE TABLE [dbo].[AcrossChangeEndLong]( ,) NOT NULL, ) NOT NULL, ) ...

  5. python 将windows字体中的汉字生成图片的方法

    #encoding: utf-8import osimport pygame chinese_dir = '黑体常规'if not os.path.exists(chinese_dir): os.mk ...

  6. Python的功能模块[3] -> binascii -> 编码转换

    binascii模块 / binascii Module binascii模块包含很多在二进制和 ASCII 编码的二进制表示之间的转换方法.关于进制转换可以参考一些内置函数. hexlify 与 u ...

  7. C++ 二位数组做参数传递

    指针的强大功能,,,,简直牛逼!!! #include<iostream> #include<cstdio> #include<map> using namespa ...

  8. BFS+最小生成树+倍增+LCA【bzoj】4242 水壶

    [bzoj4242 水壶] Description JOI君所居住的IOI市以一年四季都十分炎热著称. IOI市是一个被分成纵H*横W块区域的长方形,每个区域都是建筑物.原野.墙壁之一.建筑物的区域有 ...

  9. Logger Rate Limiter -- LeetCode

    Design a logger system that receive stream of messages along with its timestamps, each message shoul ...

  10. Sum of bit differences among all pairs

    This article was found from Geeksforgeeks.org. Click here to see the original article. Given an inte ...