往MySQL中存储图⽚的⽅法
1 介绍
在设计到数据库的开发中,难免要将图⽚或⾳频⽂件插⼊到数据库中的情况。⼀般来说,我们可以同过插⼊图⽚⽂件相应的存储位置,⽽不是⽂件本⾝,来避免直接向数据库⾥插⼊的⿇烦。但有些时候,向MySQL中插⼊图⽚更加容易管理。那么在MySQL中该怎么存储呢?
参考资料[1]中有个相当清晰的例⼦,不过是基于MySQL图形界⾯的查询⼯具Query Brower的,你的机⼦上没有安装的话,可能得不到很好的理解。我在这⾥不在赘述,更详细的资料请看给出的链接吧。
还有,[1]中的例⼦其实只是向我们说明了Query Brower的易⽤和强⼤,对我们在开发中实际应⽤不是很⼤。所以下⾯就让我们⽤JAVA写⼀个向MySQL中存储的简单实例。
2 建表
⾸先,先要在数据库中建表。我在名为test的数据库下建⽴了⼀个叫pic的表。该表包括3列,idpic, caption和img。其中idpic 是主键,caption是对图⽚的表述,img是图像⽂件本⾝。建表的SQL语句如下:
DROP TABLE IF EXISTS `test`.`pic`;
CREATE TABLE `test`.`pic` (
`idpic` int(11) NOT NULL auto_increment,
`caption` varchar(45) NOT NULL default '',
`img` longblob NOT NULL,
PRIMARY KEY (`idpic`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
将上⾯的语句输⼊到命令⾏中(如果安装了Query Brower,你可以按照参考[1]中的指⽰来建表,那样会更加⽅便。),执⾏,表建⽴成功。
3 实现图像存储类
表完成后,我们就开始写个Java类,来完成向数据库中插⼊图⽚的操作。我们知道,Java与数据库连接是通过JDBC driver来实现的。我⽤的是MySQL⽹站上提供的MySQL Connector/J,如果你⽤的是其他类型的driver,在下⾯的实现过程中可能会有些许差别。
3.1 装载JDBC驱动,建⽴连接
JDK中提供的DriverManager接⼝⽤来管理Java Application 和 JDBC Driver之间的连接。在使⽤这个接⼝之前,DriverManager需要知道要连接的JDBC 驱动。最简单的⽅法就是⽤Class.forName()来向DriverManager注册实现了
java.sql.Driver 的接⼝类。对MySQL Connector/J来说,这个类的名字叫sql.jdbc.Driver。
下⾯这个简单的⽰例说明了怎样来注册Connector/J Driver。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class LoadDriver {
public static void main(String[] args) {
try {
// The newInstance() call is a work around for some
// broken Java implementations
Class.forName("sql.jdbc.Driver").newInstance();
// Connection con = Connection(……)
// ……
} catch (Exception ex) {
// handle the error
}
}
向DriverManager注册了驱动后,我们就可以通过调⽤Connection()⽅法来获得和数据库的连接。其实在上⾯的例⼦中就有这条语句,只不过被注释掉了。在后⾯的实现中会有完整的例⼦。
3.2 PreparedStatement
完成上⾯的步骤后,我们就可以同过建⽴的连接创建Statement接⼝类,来执⾏⼀些SQL语句了。在下⾯的例⼦,我⽤的是PreparedStatement,还有CallableStatement,它可以执⾏⼀些存储过程和函数,这⾥不多讲了。下⾯的代码⽚断是向pic表
中插⼊⼀条记录。其中(1)处Connection接⼝的对象con通过调⽤prepareStatement ⽅法得到预编译的SQL 语句(precompiled SQL statement);(2)处是为该insert语句的第⼀个问号赋值,(3)为第⼆个赋值,(4)为第三个,这步也是最该⼀提的,⽤的⽅法是setBinaryStream(),第⼀个参数3是指第三个问号,fis是⼀个⼆进制⽂件流,第三个参数是该⽂件流的长度。PreparedStatement ps;
ps = con.prepareStatement("insert into PIC values (?,?,?)"); // (1)
ps.setInt(1, id); //(2)
ps.setString(2, Name()); (3)
ps.setBinaryStream(3, fis, (int)file.length()); (4)
3.3 完整代码
上⾯列出了完整的代码。
package com.forrest.storepic;
import java.io.File;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* This class describes how to store picture file into MySQL.
* @author Yanjiang Qian
* @version 1.0 Jan-02-2006
*/
public class StorePictures {
private String dbDriver;
private String dbURL;
private String dbUser;
private String dbPassword;
private Connection con;
mysql存储文档private PreparedStatement ps;
public StorePictures() {
dbDriver = "sql.jdbc.Driver";
dbURL = "jdbc:mysql://localhost:3306/test";
dbUser = "root";
dbPassword = "admin";
initDB();
}
public StorePictures(String strDriver, String strURL,
String strUser, String strPwd) {
dbDriver = strDriver;
dbURL = strURL;
dbUser = strUser;
dbPassword = strPwd;
initDB();
}
public void initDB() {
try {
// Load Driver
Class.forName(dbDriver).newInstance();
// Get connection
con = Connection(dbURL,
dbUser, dbPassword);
} catch(ClassNotFoundException e) {
System.out.Message());
} catch(SQLException ex) {
// handle any errors
System.out.println("SQLException: " + ex.getMessage());
System.out.println("SQLState: " + ex.getSQLState());
System.out.println("VendorError: " + ex.getErrorCode());
} catch (Exception e) {
System.out.Message());
}
}
public boolean storeImg(String strFile) throws Exception {
boolean written = false;
if (con == null)
written = false;
else {
int id = 0;
File file = new File(strFile);
FileInputStream fis = new FileInputStream(file);
try {
ps = con.prepareStatement("SELECT MAX(idpic) FROM PIC");
ResultSet rs = ps.executeQuery();
if(rs != null) {
()) {
id = rs.getInt(1)+1;
}
} else {
return written;
}
ps = con.prepareStatement("insert "
+ "into PIC values (?,?,?)");
ps.setInt(1, id);
ps.setString(2, Name());
ps.setBinaryStream(3, fis, (int) file.length());
written = true;
} catch (SQLException e) {
written = false;
System.out.println("SQLException: "
+ e.getMessage());
System.out.println("SQLState: "
+ e.getSQLState());
System.out.println("VendorError: "
+ e.getErrorCode());
e.printStackTrace();
} finally {
ps.close();
fis.close();
// close db con
con.close();
}
}
return written;
}
/**
* Start point of the program
* @param args CMD line
*/
public static void main(String[] args) {
if(args.length != 1) {
}
boolean flag = false;
StorePictures sp = new StorePictures();
try {
flag = sp.storeImg(args[0]);
} catch (Exception e) {
e.printStackTrace();
}
if(flag) {
System.out.println("Picture uploading is successful.");
} else {
System.out.println("Picture uploading is failed.");
}
}
}
4 总结
到此,我们就介绍完了使⽤往MySQL保存图⽚的全过程。这个例⼦是个最简单的实例,读者可以根据⾃⼰的实际需要加⼊其
它的⼀些功能,⽐如读取⽂件,删除等,使整个程序更加完善。在写这篇⽂章的时候主要参考了参考[2],在此谢过。参考[3]中是⼀个相当漂亮的例⼦,不仅有保存还有读取,⽽且是有⾮常直观的图形界⾯,感兴趣的可以深⼊研究。
以上所述是⼩编给⼤家介绍的往MySQL中存储图⽚的⽅法,希望对⼤家有所帮助,如果⼤家有任何疑问请给我留⾔,⼩编会及时回复⼤家的。在此也⾮常感谢⼤家对⽹站的⽀持!
如果你觉得本⽂对你有帮助,欢迎转载,烦请注明出处,谢谢!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。