JDBC技术总结(二)
上一节主要讲了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技术总结(二)的更多相关文章
- 使用JDBC技术连接数据库(附源码)--JAVA的简单应用
一.创建数据库(以mysql数据库为例) mysql数据库的下载安装与配置 -可参考博主之前的随笔:Windows平台下搭建MySQL数据库 创建wxb数据库-create database wxb; ...
- JDBC技术总结(一)
1. JDBC简介 SUN公司为了简化.统一对数据库的操作,定义了一套Java操作数据库的规范,称之为JDBC,JDBC不能直接操作数据库,JDBC通过接口加载数据库的驱动,然后操作数据库.JDBC: ...
- Javaweb学习笔记7—JDBC技术
今天来讲javaweb的第7阶段学习. JDBC技术,关于JDBC本篇博客只介绍了它的一部分,后面博客会更加深入探讨. 老规矩,首先先用一张思维导图来展现今天的博客内容. ps:我的思维是用的 ...
- 【阿里聚安全·安全周刊】阿里双11技术十二讲直播预约|AWS S3配置错误曝光NSA陆军机密文件
关键词:阿里双11技术十二讲直播丨雪人计划丨亚马逊AWS S3配置错误丨2018威胁预测丨MacOS漏洞丨智能风控平台MTEE3丨黑客窃取<权利的游戏>剧本|Android 8.1 本 ...
- Excel阅读模式/聚光灯开发技术之二 超级逐步录入提示功能开发原理简述—— 隐鹤 / HelloWorld
Excel阅读模式/聚光灯开发技术之二 超级逐步录入提示功能开发原理简述———— 隐鹤 / HelloWorld 1. 引言 自本人第一篇博文“Excel阅读模式/单元格行列指示/聚光灯开发技术要 ...
- JDBC驱动程序注册 JDBC简介(二)
使用JDBC进行数据库操作的第一步就是驱动注册(当然你得先导入JAR). 驱动注册有多种方式,第一步必然是获得正确的驱动名称与URL格式 驱动名称与URL格式 RDBMS 驱动程序名称 ...
- 网络虚拟化技术(二): TUN/TAP MACVLAN MACVTAP (转)
网络虚拟化技术(二): TUN/TAP MACVLAN MACVTAP 27 March 2013 TUN 设备 TUN 设备是一种虚拟网络设备,通过此设备,程序可以方便得模拟网络行为.先来看看物理设 ...
- JAVA数据库编程(JDBC技术)-入门笔记
本菜鸟才介入Java,我现在不急着去看那些基本的语法或者一些Java里面的版本的特征或者是一些晋级的知识,因为有一点.Net的OOP编程思想,所以对于Java的这些语法以及什么的在用到的时候在去发现学 ...
- 背景建模技术(二):BgsLibrary的框架、背景建模的37种算法性能分析、背景建模技术的挑战
背景建模技术(二):BgsLibrary的框架.背景建模的37种算法性能分析.背景建模技术的挑战 1.基于MFC的BgsLibrary软件下载 下载地址:http://download.csdn.ne ...
- 转 JDBC连接数据库(二)——连接池
https://www.cnblogs.com/xiaotiaosi/p/6398371.html 数据库保持长连接,不过一直都是idle,除非有用户激活连接,这样后果是无法删除用户,但是不影响数据库 ...
随机推荐
- MyBatis学习总结(一)mybatis与spring整合
MyBatis学习总结(一)mybatis与spring整合 一.需要的jar包 1.spring相关jar包 2.Mybatis相关的jar包 3.Spring+mybatis相关jar包 4.My ...
- windows 修改xhsell安全加密配置
由于xhsell旧版的与新版的有差别,导致新版的不能用旧版的xsh文件 1.将xshell升级到最新版本2.安装sed与grep到C:\Program Files (x86)\GnuWin323.将b ...
- NetStream论文
https://max.book118.com/html/2016/0102/32573670.shtm http://www.docin.com/p-1568348795.html
- HDU 5923 Prediction(2016 CCPC东北地区大学生程序设计竞赛 Problem B,并查集)
题目链接 2016 CCPC东北地区大学生程序设计竞赛 B题 题意 给定一个无向图和一棵树,树上的每个结点对应无向图中的一条边,现在给出$q$个询问, 每次选定树中的一个点集,然后真正被选上的是这 ...
- 拓扑排序+数学+DP【p1685】游览
Description 顺利通过了黄药师的考验,下面就可以尽情游览桃花岛了! 你要从桃花岛的西头开始一直玩到东头,然后在东头的码头离开.可是当你游玩了一次后,发现桃花岛的景色实在是非常的美丽!!!于是 ...
- mac-command-line-doing
创建文件夹 mkdir myDirectory 新建文件 touch a.html 编辑文件 vim a.html 删除文件 rm a.html 删除整个文件夹 rm -rf myDirectory ...
- CV
Business Analyst Resume Name: Zhou Heng Cell: 15821661982 Email : jackyzhouheng@gmail.com Self A ...
- POJ 3057 Evacuation(二分图匹配+BFS)
[题目链接] http://poj.org/problem?id=3057 [题目大意] 给出一个迷宫,D表示门,.表示人,X表示不可通行, 每个门每时间单位只允许一个人通过, 每个人移动一格的为一时 ...
- Matrix.LookAtLH()和Matrix.LookAtRH()所表达的涵义
function lookAtLH(eye:Vector3D, at:Vector3D, up:Vector3D) 一个摄像机矩阵可有由三个部分组成:摄像机位置.目标位置以及摄像机上下方.对应的就是上 ...
- 在C#中用RX库和await来实现直观的状态机
在程序的设计过程中,我们经常会遇到一些需要使用状态机的场景,相信状态机的编写和维护是令每一个程序员都非常头大的事情.到了C# 5.0后,由于引进了await语法糖,我们可以通过await和Reacti ...