往MySQL中存储图片的方法
1介绍
在设计到数据库的开发中,难免要将图片或音频文件插入到数据库中的情况。一般来说,我们可以同过插入图片文件相应的存储位置,而不是文件本身,来避免直接向数据库里插入的麻烦。但有些时候,向MySQL中插入图片更加容易管理。那么在MySQL中该怎么存储呢?
参考资料[1]中有个相当清晰的例子,不过是基于MySQL图形界面的查询工具QueryBrower的,你的机子上没有安装的话,可能得不到很好的理解。我在这里不在赘述,更详细的资料请看给出的链接吧。
还有,[1]中的例子其实只是向我们说明了QueryBrower的易用和强大,对我们在开发中实际应用不是很大。所以下面就让我们用JAVA写一个向MySQL中存储的简单实例。
2建表
首先,先要在数据库中建表。我在名为test的数据库下建立了一个叫pic的表。该表包括3列,idpic,caption和img。其中idpic是主键,caption是对图片的表述,img是图像文件本身。建表的SQL语句如下:
DROPTABLEIFEXISTS`test`.`pic`; CREATETABLE`test`.`pic`( `idpic`int(11)NOTNULLauto_increment, `caption`varchar(45)NOTNULLdefault'', `img`longblobNOTNULL, PRIMARYKEY(`idpic`) )ENGINE=InnoDBDEFAULTCHARSET=utf8;
将上面的语句输入到命令行中(如果安装了QueryBrower,你可以按照参考[1]中的指示来建表,那样会更加方便。),执行,表建立成功。
3实现图像存储类
表完成后,我们就开始写个Java类,来完成向数据库中插入图片的操作。我们知道,Java与数据库连接是通过JDBCdriver来实现的。我用的是MySQL网站上提供的MySQLConnector/J,如果你用的是其他类型的driver,在下面的实现过程中可能会有些许差别。
3.1装载JDBC驱动,建立连接
JDK中提供的DriverManager接口用来管理JavaApplication和JDBCDriver之间的连接。在使用这个接口之前,DriverManager需要知道要连接的JDBC驱动。最简单的方法就是用Class.forName()来向DriverManager注册实现了java.sql.Driver的接口类。对MySQLConnector/J来说,这个类的名字叫com.mysql.jdbc.Driver。
下面这个简单的示例说明了怎样来注册Connector/JDriver。
importjava.sql.Connection;
importjava.sql.DriverManager;
importjava.sql.SQLException;
publicclassLoadDriver{
publicstaticvoidmain(String[]args){
try{
//ThenewInstance()callisaworkaroundforsome
//brokenJavaimplementations
Class.forName("com.mysql.jdbc.Driver").newInstance();
//Connectioncon=DriverManager.getConnection(……)
//……
}catch(Exceptionex){
//handletheerror
}
}
向DriverManager注册了驱动后,我们就可以通过调用DriverManager.getConnection()方法来获得和数据库的连接。其实在上面的例子中就有这条语句,只不过被注释掉了。在后面的实现中会有完整的例子。
3.2PreparedStatement
完成上面的步骤后,我们就可以同过建立的连接创建Statement接口类,来执行一些SQL语句了。在下面的例子,我用的是PreparedStatement,还有CallableStatement,它可以执行一些存储过程和函数,这里不多讲了。下面的代码片断是向pic表中插入一条记录。其中(1)处Connection接口的对象con通过调用prepareStatement方法得到预编译的SQL语句(precompiledSQLstatement);(2)处是为该insert语句的第一个问号赋值,(3)为第二个赋值,(4)为第三个,这步也是最该一提的,用的方法是setBinaryStream(),第一个参数3是指第三个问号,fis是一个二进制文件流,第三个参数是该文件流的长度。
PreparedStatementps;
…
ps=con.prepareStatement("insertintoPICvalues(?,?,?)");//(1)
ps.setInt(1,id);//(2)
ps.setString(2,file.getName());(3)
ps.setBinaryStream(3,fis,(int)file.length());(4)
ps.executeUpdate();
…
3.3完整代码
上面列出了完整的代码。
packagecom.forrest.storepic;
importjava.io.File;
importjava.io.FileInputStream;
importjava.sql.Connection;
importjava.sql.DriverManager;
importjava.sql.PreparedStatement;
importjava.sql.ResultSet;
importjava.sql.SQLException;
/**
*ThisclassdescribeshowtostorepicturefileintoMySQL.
*@authorYanjiangQian
*@version1.0Jan-02-2006
*/
publicclassStorePictures{
privateStringdbDriver;
privateStringdbURL;
privateStringdbUser;
privateStringdbPassword;
privateConnectioncon;
privatePreparedStatementps;
publicStorePictures(){
dbDriver="com.mysql.jdbc.Driver";
dbURL="jdbc:mysql://localhost:3306/test";
dbUser="root";
dbPassword="admin";
initDB();
}
publicStorePictures(StringstrDriver,StringstrURL,
StringstrUser,StringstrPwd){
dbDriver=strDriver;
dbURL=strURL;
dbUser=strUser;
dbPassword=strPwd;
initDB();
}
publicvoidinitDB(){
try{
//LoadDriver
Class.forName(dbDriver).newInstance();
//Getconnection
con=DriverManager.getConnection(dbURL,
dbUser,dbPassword);
}catch(ClassNotFoundExceptione){
System.out.println(e.getMessage());
}catch(SQLExceptionex){
//handleanyerrors
System.out.println("SQLException:"+ex.getMessage());
System.out.println("SQLState:"+ex.getSQLState());
System.out.println("VendorError:"+ex.getErrorCode());
}catch(Exceptione){
System.out.println(e.getMessage());
}
}
publicbooleanstoreImg(StringstrFile)throwsException{
booleanwritten=false;
if(con==null)
written=false;
else{
intid=0;
Filefile=newFile(strFile);
FileInputStreamfis=newFileInputStream(file);
try{
ps=con.prepareStatement("SELECTMAX(idpic)FROMPIC");
ResultSetrs=ps.executeQuery();
if(rs!=null){
while(rs.next()){
id=rs.getInt(1)+1;
}
}else{
returnwritten;
}
ps=con.prepareStatement("insert"
+"intoPICvalues(?,?,?)");
ps.setInt(1,id);
ps.setString(2,file.getName());
ps.setBinaryStream(3,fis,(int)file.length());
ps.executeUpdate();
written=true;
}catch(SQLExceptione){
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();
//closedbcon
con.close();
}
}
returnwritten;
}
/**
*Startpointoftheprogram
*@paramargsCMDline
*/
publicstaticvoidmain(String[]args){
if(args.length!=1){
System.err.println("javaStorePicturesfilename");
System.exit(1);
}
booleanflag=false;
StorePicturessp=newStorePictures();
try{
flag=sp.storeImg(args[0]);
}catch(Exceptione){
e.printStackTrace();
}
if(flag){
System.out.println("Pictureuploadingissuccessful.");
}else{
System.out.println("Pictureuploadingisfailed.");
}
}
}
4总结
到此,我们就介绍完了使用往MySQL保存图片的全过程。这个例子是个最简单的实例,读者可以根据自己的实际需要加入其它的一些功能,比如读取文件,删除等,使整个程序更加完善。在写这篇文章的时候主要参考了参考[2],在此谢过。参考[3]中是一个相当漂亮的例子,不仅有保存还有读取,而且是有非常直观的图形界面,感兴趣的可以深入研究。
以上所述是小编给大家介绍的往MySQL中存储图片的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!