上一节主要讲了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. (七)insmod/rmmod

    insmod: insmod命令用于将给定的模块加载到内核中.Linux有许多功能是通过模块的方式,在需要时才载入kernel.如此可使kernel较为精简,进而提高效率,以及保有较大的弹性.这类可载 ...

  2. kvm虚拟机最佳实践系列1-kvm宿主机准备

    KVM宿主机配置 系统环境:ubuntu16, bond0 业务网口 bond1 管理网口+存储网口 安装KVM环境支持 sudo apt-get install qemu-kvm sudo apt- ...

  3. 新建module---获取带宽信息

    借鉴自http://blog.csdn.net/xjtuse2014/article/details/53968726 1.MoniterBandwidth模块: package net.floodl ...

  4. hdu 5155(递推)

    Harry And Magic Box Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  5. 纯CSS实现轮播图效果,你不知道的CSS3黑科技

    前言 轮播图已经是一个很常见的东西,尤其是在各大App的首页顶部栏,经常会轮番显示不同的图片. 一提到轮播图如何实现时,很多人的第一反应就是使用Javascript的定时器,当然这种方法是可以实现的. ...

  6. 洛谷——P1170 兔八哥与猎人

    P1170 兔八哥与猎人 题目描述 兔八哥躲藏在树林旁边的果园里.果园有M × N棵树,组成一个M行N列的矩阵,水平或垂直相邻的两棵树的距离为1.兔八哥在一棵果树下. 猎人背着猎枪走进了果园,他爬上一 ...

  7. bzoj 3462: DZY Loves Math II

    3462: DZY Loves Math II Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 211  Solved: 103[Submit][Sta ...

  8. linux-启动脚本-souce与sh

    source:        在当前shell程序中执行,  因此当前shell程序中的变量和环境变量,均可见.   执行的脚本,能更新到当前shell程序. sh:            开启一个新 ...

  9. IE8下 input标签内padding失效

    在做网页兼容时 发现在ie8下的input内用padding失效 为了达到居中文字的效果 使用line-height可以解决问题

  10. Oracle多用户对一个表进行并发插入数据行操作

    oracle数据库支持多用户间同时对同一个表进行操作,但是数据不一定同步,因为oracle数据库是支持脏数据的,比如A用户删除了表的数据但没有提交,B用户也能查询访问到,如果要避免这种情况只能加锁,A ...