1.文件输入流(FileInputStream)
2.预处理语句对象(PreparedStatement)
3.InputStream存储到blob (MySQL的longblob)字段中
4.文件输出流(FileOutputStream)
5.输入输出流对接
PreparedStatement
为预处理语句对象,可以使用占位符(?)创建SQL语句,在SQL语句创建后再使用具体的值替换占位符(?)示例如下:
package com.hzyc.io.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class IOLearn {
private static final String URL = "jdbc:mysql://localhost:3306/hzyc";
private static final String USERNAME = "root";
private static final String PASSWORD = "root";
public static void main(String[] args) {
try {
Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);
String sql = "INSERT INTO student (sid,sname,photo) " +
" VALUES (?,?,?)";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setObject(1, 1201);
preparedStatement.setObject(2, "张三");
preparedStatement.setObject(3, "");
preparedStatement.execute();
preparedStatement.close();
connection.close();
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
}
}
文件输入流(FileInputStream)
FileInputStream是以字节(byte)为单位的文件输入流,可以将FileInputStream的对象(实例)直接保存到数据表(blob类型字段)中。
例如:创建数据表myImage的SQL语句如下:
create table myImage (code int, imgName varchar(30), img blob)
如果使用的是MySQL数据库,则需要创建longblob类型的字段
存储文件(图片)到数据库
package com.hzyc.io.jdbc;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class IOLearn {
private static final String URL = "jdbc:mysql://localhost:3306/hzyc";
private static final String USERNAME = "root";
private static final String PASSWORD = "root";
public static void main(String[] args) {
try {
FileInputStream fileInputStream = new FileInputStream(new File("D:\\Downloads\\sy.png"));
Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);
String sql = "INSERT INTO student (sid,sname,photoName,photo) " +
" VALUES (?,?,?,?)";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setInt(1, 1201);
preparedStatement.setString(2, "张三");
preparedStatement.setString(3, "sy");
preparedStatement.setBinaryStream(4, fileInputStream, fileInputStream.available());
preparedStatement.execute();
preparedStatement.close();
connection.close();
} catch (ClassNotFoundException | SQLException | IOException e) {
e.printStackTrace();
}
}
}
文件输出流(FileOutputStream)
u从数据库中可以把存储到表中的输入流(input)对象获取出来,并通过文件输出流以字节(byte)为单位写入到目标,代码如下:
•ResultSet rs = stmt. executeQuery (select * from myImage);
•rs. next();
•InputStream input = rs. getBinaryStream (“img”);
–以上代码可以获取到存储到数据库中的input对象
•File target = new File(“ E:/test.jpg ” );
•FileOutputStream output = new FileOutputStream (target);
–到此已经准备好输入流对象input和输出流对象output