javaweb使用JDBC处理MySQL大数据
一、基本概念
大数据也称之为LOB(LargeObjects),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配置文件
1driver=com.mysql.jdbc.Driver
2url=jdbc:mysql://localhost:3306/jdbcStudy
3username=root
4password=XDP
2.3、编写JdbcUtils工具类
复制代码
1packageme.gacl.utils;
2
3importjava.io.InputStream;
4importjava.sql.Connection;
5importjava.sql.DriverManager;
6importjava.sql.ResultSet;
7importjava.sql.SQLException;
8importjava.sql.Statement;
9importjava.util.Properties;
10
11publicclassJdbcUtils{
12
13privatestaticStringdriver=null;
14privatestaticStringurl=null;
15privatestaticStringusername=null;
16privatestaticStringpassword=null;
17
18static{
19try{
20//读取db.properties文件中的数据库连接信息
21InputStreamin=JdbcUtils.class.getClassLoader().getResourceAsStream("db.properties");
22Propertiesprop=newProperties();
23prop.load(in);
24
25//获取数据库连接驱动
26driver=prop.getProperty("driver");
27//获取数据库连接URL地址
28url=prop.getProperty("url");
29//获取数据库连接用户名
30username=prop.getProperty("username");
31//获取数据库连接密码
32password=prop.getProperty("password");
33
34//加载数据库驱动
35Class.forName(driver);
36
37}catch(Exceptione){
38thrownewExceptionInInitializerError(e);
39}
40}
41
42/
43@Method:getConnection
44@Description:获取数据库连接对象
45@Anthor:孤傲苍狼
46
47@returnConnection数据库连接对象
48@throwsSQLException
49/
50publicstaticConnectiongetConnection()throwsSQLException{
51returnDriverManager.getConnection(url,username,password);
52}
53
54/
55@Method:release
56@Description:释放资源,
57要释放的资源包括Connection数据库连接对象,负责执行SQL命令的Statement对象,存储查询结果的ResultSet对象
58@Anthor:孤傲苍狼
59
60@paramconn
61@paramst
62@paramrs
63/
64publicstaticvoidrelease(Connectionconn,Statementst,ResultSetrs){
65if(rs!=null){
66try{
67//关闭存储查询结果的ResultSet对象
68rs.close();
69}catch(Exceptione){
70e.printStackTrace();
71}
72rs=null;
73}
74if(st!=null){
75try{
76//关闭负责执行SQL命令的Statement对象
77st.close();
78}catch(Exceptione){
79e.printStackTrace();
80}
81}
82
83if(conn!=null){
84try{
85//关闭Connection数据库连接对象
86conn.close();
87}catch(Exceptione){
88e.printStackTrace();
89}
90}
91}
92}
复制代码
三、使用JDBC处理MySQL的大文本
对于MySQL中的Text类型,可调用如下方法设置
1PreparedStatement.setCharacterStream(index,reader,length);//注意length长度须设置,并且设置为int型
对MySQL中的Text类型,可调用如下方法获取
1reader=resultSet.getCharacterStream(StringcolumnLabel);2strings=resultSet.getString(StringcolumnLabel);
3.1、测试范例
1、编写SQL测试脚本
复制代码
1createdatabasejdbcstudy;
2usejdbcstudy;
3createtabletestclob
4(
5idintprimarykeyauto_increment,
6resumetext
7);
复制代码
2、编写测试代码如下:
复制代码
1packageme.gacl.demo;
2
3importjava.io.File;
4importjava.io.FileReader;
5importjava.io.FileWriter;
6importjava.io.Reader;
7importjava.sql.Connection;
8importjava.sql.PreparedStatement;
9importjava.sql.ResultSet;
10importme.gacl.utils.JdbcUtils;
11importorg.junit.Test;
12
13/
14@ClassName:JdbcOperaClob
15@Description:使用JDBC操作MySQL的大文本
16@author:孤傲苍狼
17@date:2014-9-19下午10:10:04
18
19/
20publicclassJdbcOperaClob{
21
22/
23@Method:add
24@Description:向数据库中插入大文本数据
25@Anthor:孤傲苍狼
26
27/
28@Test
29publicvoidadd(){
30Connectionconn=null;
31PreparedStatementst=null;
32ResultSetrs=null;
33Readerreader=null;
34try{
35conn=JdbcUtils.getConnection();
36Stringsql="insertintotestclob(resume)values(?)";
37st=conn.prepareStatement(sql);
38//这种方式获取的路径,其中的空格会被使用“%20”代替
39Stringpath=JdbcOperaClob.class.getClassLoader().getResource("data.txt").getPath();
40//将“%20”替换回空格
41path=path.replaceAll("%20","");
42Filefile=newFile(path);publicvoidread
43reader=www.wang027.comFileReader(file);
44st.setCharacterStream(1,reader,(int)file.length());
45intnum=st.executeUpdate();
46if(num>0){
47System.out.println("插入成功!!");
48}
49//关闭流
50reader.close();
51}catch(Exceptione){
52e.printStackTrace();
53}finally{
54JdbcUtils.release(conn,st,rs);
55}
56}
57
58/
59@Method:read
60@Description:读取数据库中的大文本数据
61@Anthor:孤傲苍狼
62
63/
64@Test
65publicvoidread(){
66Connectionconn=null;
67PreparedStatementst=null;
68ResultSetrs=null;
69try{
70conn=JdbcUtils.getConnection();
71Stringsql="selectresumefromtestclobwhereid=2";
72st=conn.prepareStatement(sql);
73rs=st.executeQuery();
74
75StringcontentStr="";
76Stringcontent="";
77if(rs.next()){
78//使用resultSet.getString("字段名")获取大文本数据的内容
79content=rs.getString("resume");
80//使用resultSet.getCharacterStream("字段名")获取大文本数据的内容
81Readerreader=rs.getCharacterStream("resume");
82charbuffer[]=newchar[1024];
83intlen=0;
84FileWriterout=newFileWriter("D:\\1.txt");
85while((len=reader.read(buffer))>0){
86contentStr+=newString(buffer);
87out.write(buffer,0,len);
88}
89out.close();
90reader.close();
91}
92System.out.println(content);
93System.out.println("-----------------------------------------------");
94System.out.println(contentStr);
95}catch(Exceptione){
96e.printStackTrace();
97}finally{
98JdbcUtils.release(conn,st,rs);
99}
100}
101}
复制代码
四、使用JDBC处理MySQL的二进制数据
对于MySQL中的BLOB类型,可调用如下方法设置:
1PreparedStatement.setBinaryStream(i,inputStream,length);
对MySQL中的BLOB类型,可调用如下方法获取:
1InputStreamin=resultSet.getBinaryStream(StringcolumnLabel);
2InputStreamin=resultSet.getBlob(StringcolumnLabel).getBinaryStream();
4.1、测试范例
1、编写SQL测试脚本
1createtabletestblob
2(
3idintprimarykeyauto_increment,
4imagelongblob
5);
2、编写测试代码如下:
复制代码
1packageme.gacl.demo;
2
3importjava.io.File;
4importjava.io.FileInputStream;
5importjava.io.FileOutputStream;
6importjava.io.InputStream;
7importjava.sql.Connection;
8importjava.sql.PreparedStatement;
9importjava.sql.ResultSet;
10importme.gacl.utils.JdbcUtils;
11importorg.junit.Test;
12
13/
14@ClassName:JdbcOperaClob
15@Description:使用JDBC操作MySQL的二进制数据(例如图像、声音、二进制文)
16@author:孤傲苍狼
17@date:2014-9-19下午10:10:04
18
19/
20publicclassJdbcOperaBlob{
21
22/
23@Method:add
24@Description:向数据库中插入二进制数据
25@Anthor:孤傲苍狼
26
27/
28@Test
29publicvoidadd(){
30Connectionconn=null;
31PreparedStatementst=null;
32ResultSetrs=null;
33try{
34conn=JdbcUtils.getConnection();
35Stringsql="insertintotestblob(image)values(?)";
36st=conn.prepareStatement(sql);
37//这种方式获取的路径,其中的空格会被使用“%20”代替
38Stringpath=JdbcOperaBlob.class.getClassLoader().getResource("01.jpg").getPath();
39//将“%20”替换会空格
40path=path.replaceAll("%20","");
41Filefile=newFile(path);
42FileInputStreamfis=newFileInputStream(file);//生成的流
43st.setBinaryStream(1,fis,(int)file.length());
44intnum=st.executeUpdate();
45if(num>0){
46System.out.println("插入成功!!");
47}
48fis.close();
49}catch(Exceptione){
50e.printStackTrace();
51}finally{
52JdbcUtils.release(conn,st,rs);
53}
54}
55
56/
57@Method:read
58@Description:读取数据库中的二进制数据
59@Anthor:孤傲苍狼
60
61/
62@Test
63publicvoidread(){
64Connectionconn=null;
65PreparedStatementst=null;
66ResultSetrs=null;
67try{
68conn=JdbcUtils.getConnection();
69Stringsql="selectimagefromtestblobwhereid=?";
70st=conn.prepareStatement(sql);
71st.setInt(1,1);
72rs=st.executeQuery();
73if(rs.next()){
74//InputStreamin=rs.getBlob("image").getBinaryStream();//这种方法也可以
75InputStreamin=rs.getBinaryStream("image");
76intlen=0;
77bytebuffer[]=newbyte[1024];
78
79FileOutputStreamout=newFileOutputStream("D:\\1.jpg");
80while((len=in.read(buffer))>0){
81out.write(buffer,0,len);
82}
83in.close();
84out.close();
85}
86}catch(Exceptione){
87e.printStackTrace();
88}finally{
89JdbcUtils.release(conn,st,rs);
90}
91}
|
|