Java 操作MySQL数据库存取图片以及其它类型文件

一、需要注意的一个问题

1、当数据库字段为blob类型时,必须使用PreparedStatement中的setBinaryStream(int,InputStream,int)方法;

2、当数据库字段为longblob类型时,必须使用PreparedStatement中的setBinaryStream(int,InputStream,long)方法。

否则就会抛出如题的错误:

Exception in thread "main" java.lang.AbstractMethodError: Method com/mysql/jdbc/PreparedStatement.setCharacterStream(ILjava/io/Reader;)V is abstract

at com.mysql.jdbc.PreparedStatement.setCharacterStream(PreparedStatement.java)

at GetConnection.main(GetConnection.java:19)

当应用程序试图调用一个抽象方法时,抛出此错误。通常由编译器捕获此错误;如果某个类的定义自当前执行方法最后一次编译以后作了不兼容的更改,则此错误只可能在运行时发生。

二、实际编程操作

1、首先创建数据表

CREATE TABLE stuinfo(id int(11) NOT NULL auto_increment,name varchar(10) default NULL,content longText,image,longBlob,PRIMARY KEY(id))ENGINE=InnoDB;

2、编码存储图片以及文本文件

import java.sql.*;
import java.io.*;

public class GetConnection{
	public static void main(String[] args){
		Access2Database adb=new Access2Database();
		Connection conn=adb.getConn();	

		//transaction dealing
		PreparedStatement pstam=null;
		String sql="insert into stuinfo(name,content,image) values(?,?,?);";
		try {
			pstam=conn.prepareStatement(sql);
			pstam.setString(1, "cjc");

			File file=new File("D:/我的文档/Documents/JavaPrj/Test/src/test.txt");
			InputStream itxt=new FileInputStream(file);
			BufferedReader br=new BufferedReader(new InputStreamReader(itxt));
			pstam.setCharacterStream(2,br,(int)file.length());

			File file1=new File("D:/我的文档/Documents/JavaPrj/Test/src/1.jpg");
			InputStream isimg=new FileInputStream(file1);
			pstam.setBinaryStream(3, isimg, (int)file1.length());

			pstam.executeUpdate();

			br.close();
			itxt.close();
			isimg.close();
			pstam.close();
			conn.close();
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (FileNotFoundException e){
			e.printStackTrace();
		} catch (IOException e){
			e.printStackTrace();
		}
	}
}

结果:

3、编码读取图片以及文本文件

代码

import java.sql.*;
import java.io.*;

public class GetConnection{
	public static void main(String[] args){
		Access2Database adb=new Access2Database();
		Connection conn=adb.getConn();	

		//transaction dealing
		PreparedStatement pstam=null;
		String sql="select * from stuinfo where name=?;";
		try {
			pstam=conn.prepareStatement(sql);
			pstam.setString(1, "cjc");
			ResultSet reset=pstam.executeQuery();
			while(reset.next()){
				System.out.println("Read text document...");
				BufferedReader br=new BufferedReader(reset.getCharacterStream(3));
				String str=null;
				while((str=br.readLine())!=null){
					System.out.println(str);
				}
				System.out.println("Read text document OK!");

				System.out.println("Read image file...");
				BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(new File("result.jpg")));
				byte[] buf=new byte[1024];
				BufferedInputStream bis=new BufferedInputStream(reset.getBinaryStream(4));
				int count=-1;
				while((count=bis.read(buf, 0, 1024))!=-1){
					bos.write(buf, 0, count);
				}
				bos.flush();
				System.out.println("Read image file OK!");
				bos.close();
			}
			reset.close();
			pstam.close();
			conn.close();
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (FileNotFoundException e){
			e.printStackTrace();
		} catch (IOException e){
			e.printStackTrace();
		}
	}
}

时间: 2024-11-06 19:42:38

Java 操作MySQL数据库存取图片以及其它类型文件的相关文章

JAVA调用mysql数据操作时出现错误:impossible to write to binary log since statement is in row format and BINLOG_FORMAT = STATEMENT.'

使用mysql做持久化报错:Cannot execute statement: impossible to write to binary log since BINLOG_FORM ActiveMQ中如果使用mysql innodb的同时,开启了binlog,那么在ack消息的时候,日志里就可会报错:java.sql.SQLException: Cannot execute statement: binlogging impossible since BINLOG_FORMAT = STATE

android 数据库存取图片

Android数据库中存取图片通常使用两种方式,一种是保存图片所在路径,二是将图片以二进制的形式存储(sqlite3支持BLOB数据类型).对于两种方法的使用,好像第二种方法不如第一种方法更受程序员欢迎,他们认为,在很多数据库语言里,处理大字段都是不容易的,像图片这样的文件放在数据库里会有问题:对数据库的读写速度永远赶不上文件系统的处理速度,使数据库变得巨大:但也有很多人认为像图片这样的数据存放在数据库中也有好处:易于备份,且备份速度绝对比备份文件快,比较容易数据迁移等等.其实这两种方法都有优缺

java操作Json数据

最近要使用java来操作Json数据,虽然Json用过几次,但一直没有好好总结,趁这次来总结一下java操作Json数据.Java操作Json有很多工具包,地址为http://www.json.org/,可以自己上去挑选. 这里我使用第一个org.json,最新源码地址为:https://github.com/douglascrockford/JSON-java,可以自己去下载,我也会在附件上传.下载源码后放进工程即可,包名为org.json 我们要操作的Json数据如下: {"total&qu

java操作MySQL数据库(插入、删除、修改、查询、获取所有行数)

插播一段广告哈:我之前共享了两个自己写的小应用,见这篇博客百度地图开发的两个应用源码共享(Android版),没 想到有人找我来做毕设了,年前交付,时间不是很紧,大概了解了下就接下了,主要用到的就是和服务器端交互,这个我之前没做过,因此接下来的时间里会陆续更 新这一些列的博客,记录学习的点滴.第一篇主要是java读取mysql数据库文件.安装及配置文件稍后会上传到我的百度网盘供大家下载.其他的介绍在网 上都可以找到相关的博客,下面直接给出源代码. mysql建立一个名为“vge_whu”的数据库

Java 操作MySql数据库

Java 项目开发中数据库操作是很重要的一个方面,对于初学者来说,MySql是比较容易熟悉的一种常见数据库,这篇文章记录了如何用Java来操作MySql数据库. 第一章 JDBC的概念 JDBC(Java Database Connectivity)是连接Java和数据库的纽带,简单的说,就是Java利用JDBC API屏蔽掉了底层数据库具体实现的差异.对于不同的数据库,Java的操作方式是不同的,这样有两个优点: 简化了访问数据库的程序代码,无须涉及与底层数据库实现相关的细节 可以在同一个Ja

java对MySql数据访问

终于解决了所有困难,通过java程序实现对MySql数据的访问,其中有许多困难,尤其对于一个新接触JDBC编码来说,每一次的错误都让人有些摸不着头脑,趁现在对一些产生的问题还记得,帮大家记录下来. 1.首先通过上篇对MySql环境的一些配置,?需要先学习一些MySql基本语法,在MySql中创建新的数据库:MySql语法:create database if not exists 数据库名;然后在其中加入你所需要存储的数据. 2.第二种方法:在.sql文本中添加MySql语法通过cmd命令提示符

Java操作JSON数据(2)--Gson操作JSON数据

Gson是Google公司发布的一个开发源码的Java库,可用于将Java对象转换为JSON字符串,也可用于将JSON字符串转换为对应的Java对象.本介绍下Gson的基本使用方法,包括序列化和反序列化:文中所使用到的软件版本:Java 1.8.0_191.Gson 2.8.6. 1.引入依赖 <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactI

JAVA操作mysql(如何更加面向对象的操作数据库)

既然谈到面向对象,所以,先把连接信息给搞个对象出来: public class DBInfo { private String driver; private String host; private String port; private String user; private String pwd; private String dataBase; public DBInfo(){ this.driver = "com.mysql.jdbc.Driver"; this.host

Linux上检查MySQL数据表的存储引擎类型三板斧

MySQl主要使用两种存储引擎:MyISAM 和 Innodb.MyISAM是非事务的,因此拥有读取更快,然而InnoDB完全支持细颗粒度的事务锁定(比如:commit/rollback).当你创建一张新的MySQL表时,你要选择它的类型(也就是存储引擎).如果没有选择,你就会使用与预设置的默认引擎. 如果你想要知道已经存在的MySQL数据表的类型,这里有几种方法达到. 方法一 如果你可以访问phpMyAdmin,你可以从phpMyAdmin找出默认的数据库类型.从phpMyAdmin中选中数据