实现在mysql数据库中保存text大文本和blob大二进制数据

项目代码如下:

config配置文件:

className=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/lob
user=root
password=root

com.itheima.util包下DBUtil.java

package com.itheima.util;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;

public class DBUtil {

	private static Properties properties = null;

	static {
		properties = new Properties();
		try {
			properties.load(new FileReader(DBUtil.class.getClassLoader().getResource("config.properties").getPath()));
		} catch (FileNotFoundException e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		} catch (IOException e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}
	public static Connection getConn() {
		String className = properties.getProperty("className");
		String url = properties.getProperty("url");
		String user = properties.getProperty("user");
		String password = properties.getProperty("password");

		Connection conn;
		try {
			Class.forName(className);
			conn = DriverManager.getConnection(url, user, password);
		} catch (SQLException e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
		return conn;
	}
	public static void close (Connection conn, PreparedStatement ps, ResultSet rs) {
		if(rs != null) {
			try {
				rs.close();
			} catch (SQLException e) {
				rs = null;
			}
		}
		if(ps != null) {
			try {
				ps.close();
			} catch (SQLException e) {
				ps = null;
			}
		}
		if(conn != null) {
			try {
				conn.close();
			} catch (SQLException e) {
				conn = null;
			}
		}

	}
}

com.itheima.lob包下TextDemo.java(实现存储大文本数据)

package com.itheima.lob;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.junit.Test;

import com.itheima.util.DBUtil;

public class TextDemo {

	/*
	 	create table textdemo (
	 		id int primary key auto_increment,
	 		name varchar(50),
	 		content mediumtext
	 	);

	 */
	@Test
	public void getText(){
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		String sql = "select * from textdemo";
		try {
			conn = DBUtil.getConn();
			ps = conn.prepareStatement(sql);
			rs = ps.executeQuery();
			while(rs.next()) {
				String name = rs.getString(2);
				Reader reader = rs.getCharacterStream(3);
				Writer writer = new FileWriter(name);
				int len = 0;
				char []data = new char[1024];
				while((len = reader.read(data)) != -1) {
					writer.write(data, 0, len);
				}
			}
		} catch (SQLException e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		} catch (IOException e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		} finally {
			DBUtil.close(conn, ps, rs);
		}
	}
	@Test
	public void addText() {
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		String sql = "insert into textdemo values(null,?,?)";
		try {
			conn = DBUtil.getConn();
			ps = conn.prepareStatement(sql);
			ps.setString(1, "钢铁是怎样炼成.txt");
			File file = new File("1.txt");
			ps.setCharacterStream(2, new FileReader(file), (int)file.length());
			ps.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		} finally {
			DBUtil.close(conn, ps, rs);
		}
	}
}

com.itheima.lob包下BlobDemo.java(实现存储大二进制数据)

package com.itheima.lob;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.junit.Test;

import com.itheima.util.DBUtil;

/*
 	create table blobdemo(
 		id int primary key auto_increment,
 		name varchar(50),
 		content blob
 	);
 */

public class BlobDemo {

	@Test
	public void getBlob() {
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		String sql = "select * from blobdemo";
		try {
			conn = DBUtil.getConn();
			ps = conn.prepareStatement(sql);
			rs = ps.executeQuery();
			while(rs.next()) {
				String name = rs.getString(2);
				InputStream is = rs.getBlob(3).getBinaryStream();
				OutputStream os = new FileOutputStream(name);
				int len = 0;
				byte[] data = new byte[1024];
				while((len = is.read(data)) != -1) {
					os.write(data, 0, len);
				}
			}
		} catch (SQLException e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		} catch (IOException e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		} finally {
			DBUtil.close(conn, ps, rs);
		}
	}

	@Test
	public void addBlob() {
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		String sql = "insert into blobdemo values (null,?,?)";
		try {
			conn = DBUtil.getConn();
			ps = conn.prepareStatement(sql);
			ps.setString(1, "洛天依.mp3");
			File file = new File("1.mp3");
			ps.setBinaryStream(2, new FileInputStream(file), (int)file.length());
			ps.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		} finally {
			DBUtil.close(conn, ps, rs);
		}
	}
}

需要注意的是:

ps.setCharacterStream(2, new FileReader(file), (int)file.length());有三种重载形式

ps.setBinaryStream(2, new FileInputStream(file), (int)file.length());有三种重载形式

这两个方法只有第二种重载形式mysql的jar包里实现了,其余两种没实现,故为抽象方法,所以如果使用这两种方法会提示抽象方法错误

还有就是如果上传时,提示java.lang.OutOfMemoryError,则说明超出虚拟机内存,这是可以点击

-Xms64m设置虚拟机最小内存为64M

-Xmx256m设置虚拟机最大内存为256M

注:jdk5.0以前虚拟机默认的最大内存为64M

如果提示com.mysql.jdbc.PacketTooBigException,说明程序和数据库之间传送的数据包超过了默认数据包的大小,这时通过可以修改mysql目录下的配置文件my.ini解决。

只需要在【mysqld】标签下添加一行max_allowed_packet属性值就可以了

[mysqld]
max_allowed_packet=64M



时间: 2024-10-10 02:36:19

实现在mysql数据库中保存text大文本和blob大二进制数据的相关文章

Python脚本---在 MySQL数据库中跑批加载多个表的数据

转载请注明出处:http://blog.csdn.net/guoyjoe/article/details/45841117 #!/usr/bin/env python # -*- coding:utf-8 -*- """  Purpose: 生成日明细账单数据  Created: 2015/4/21  Modified:2015/4/24  @author: guoyJoe"""#导入模块import MySQLdbimport timeimpo

如何在mysql数据库中保存emoji特殊字符

MySQL在5.5.3版本之后增加了这个utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode.其实,utf8mb4是utf8的超集,理论上原来使用utf8,然后将字符集修改为utf8mb4,也 会不会对已有的utf8编码读取产生任何问题. 做微信小程序的项目时,发现保存微信用户信息的nickname时报错,寻找原因发现是有些用户昵称是带有emoji表情符的,并且当时的数据库表属性设置的字符编码还是utf8的,数据库当然会报错.经过网上搜索一些资料,找

将 text 文件里的数据导入到 mysql 数据库中

如题,将 text 文件里的数据导入到 mysql 数据库中. 我自己具体的实现可以分为几种了: 1.写你擅长的程序设计语言 进行读写文件,然后连接数据库,进行写入: 2.在 mysql 里直接进行运行 sql 脚本语句,进行导入. 第一个现在就不再说了,简单. 现在就说说怎么直接将 .text 文件利用 sql 语句 进行导入. 1.首先在数据库中新建一个表(这里的表至少要和 你数据里的字段进行匹配,即一行存在的字段数): 2.运行sql脚本语句: 比如: 你的文件为 D:/field.txt

MySQL数据库中的索引(一)——索引实现原理

今天我们来探讨一下数据库中一个很重要的概念:索引. MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构,即索引是一种数据结构. 我们知道,数据库查询是数据库的最主要功能之一.我们都希望查询数据的速度能尽可能的快,因此数据库系统的设计者会从查询算法的角度进行优化.最基本的查询算法当然是顺序查找(linear search),这种复杂度为O(n)的算法在数据量很大时显然是糟糕的,好在计算机科学的发展提供了很多更优秀的查找算法,例如二分查找(binary searc

Java学习总结(十八)——MySQL数据库(4)MySQL数据库中的视图,函数,存储过程中常见循环

一.MySQL存储过程中常见的循环1.while循环:WHILE.....DO.....END WHILE例1:创建存储过程(求1+2+.......+num的和):创建成功,进行调用:显示结果:2.REPEAT循环: REPEAT.........UNTLL END REPEAT例2:创建存储过程:创建完成,调用存储过程:显示结果:3.LOOP循环:LOOP END LOOP 例3:创建存储过程:创建成功,调用存储过程:显示结果:二.MySQL中的视图1.概念:有结构(有行有列),但没有结果(

MySQL数据库中的算术运算符

MySQL数据库中的算数运算符 MySQL数据库中的算术运算符 一.运算符的概述: 运算符在MySQL数据库中也是很重要的知识体,在执行sql语句的时候这个运算符对操作数据帮助很大.其中运算符的运用可以帮助你减省大量的时间,操作起来也比较灵活. 二.运算符 运算符主要包括"算数运算符"."比较运算符"."罗运算符"."位运算符"四大类,下面我们就一次学习一下. 1.算术运算符 算术运算符在sql语句的时候经常使用,例如对表的字

Oracle数据库中实现mysql数据库中auto-increment功能

在Mysql数据库中,想要实现一条数据的自增一功能(即插入此数据时填写null即可,系统自动+1),可直接在所在列使用语句auto-increment. id int primary key auto_increment 而在Oracle数据库中不可这样使用.下面介绍怎样在Oracle数据库中实现对id列的自增一的功能. 1 创建一张表cutomers.(无需多言) 1 create table customers( 2 id number(10), 3 name varchar(30) not

在mysql数据库中制作千万级测试表

在mysql数据库中制作千万级测试表 前言: 最近准备深入的学一下mysql,包括各种引擎的特性.性能优化.分表分库等.为了方便测试性能.分表等工作,就需要先建立一张比较大的数据表.我这里准备先建一张千万记录用户表. 步骤: 1 创建数据表(MYISAM方式存储插入速度比innodb方式快很多)   数据表描述 数据量:1千万 字段类型: id :编号 uname:用户名 ucreatetime: 创建时间 age:年龄 CREATE TABLE usertb(    id serial,   

MySql数据库中的datediff函数

MySql数据库中的datediff函数:主要是用来返回两个日期之间相隔的天数   一半情况下是大日期在前,小日期在后的 这样写也是能够运行的 要注意查询结果: 原文地址:https://www.cnblogs.com/dongyaotou/p/12080565.html