往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中存储图片的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!