🍉接上次 爬取坤坤表情包 ,这次我们直接将表情包存到MySQL数据库而不是本地。🍉
🥭1. 创建数据库
首先创建一个数据库,数据库名为ikun,表名为img,3个字段分别为id(图片id)、img(二进制码)、date(存储时间)
其中,二进制码的存储格式应该为 BLOB类型,下面为不同类型对应的最大存储空间
TINYBLOB
255个字节BLOB
65535字节MEDIUMBLOB
16MLONGBLOB
4G
USE ikun; CREATE TABLE `img` ( `id` int NOT NULL AUTO_INCREMENT, `img` mediumblob NOT NULL, `date` date NOT NULL, PRIMARY KEY (`id`) ) ;
🍈2. 保存图片到数据库
将图片转为二进制流
对于图片的输入和输出,我们更多使用BufferedInputStream或者BufferedOutPutStream
public static void saveInMySQL(String url) throws IOException { //获得连接对象 Connection con = DBUtil.getConnection("root","******","ikun"); PreparedStatement pre = null; //获取图片信息,做输出流 InputStream in = getEntityByHttpGetMethod(url).getContent(); BufferedInputStream inputStream = new BufferedInputStream(in); try { String sql = "insert into img (img,date) values (?,?)"; pre = con.prepareStatement(sql); pre.setBinaryStream(1,inputStream,in.available()); Date date = new Date(System.currentTimeMillis()); pre.setDate(2,date); //获取返回结果 int i = pre.executeUpdate(); System.out.println(i); } catch (SQLException e) { e.printStackTrace(); } }
查看效果
🍅 3. 从数据库读取图片
将二进制流转为文件输出到本地查看
public static void readFromMysql(){ //获得连接对象 Connection con = DBUtil.getConnection("root","******.","ikun"); PreparedStatement pre = null; ResultSet res = null; try { //这里读取一张 String sql = "select * from img where id = 1"; pre = con.prepareStatement(sql); res = pre.executeQuery(sql); while (res.next()){ int id = res.getInt("id"); InputStream stream = res.getBinaryStream("img"); Date date = res.getDate("date"); System.out.println("图片id为"+id+" 创建时间为"+date.toString()); Files.copy(stream, Paths.get("D:\\ikun.jpg")); } } catch (SQLException | IOException e) { e.printStackTrace(); } //断开连接 DBUtil.close(); }
写在最后
我发现阅读量挺高的但是没人收藏,确实,一般人相信看完下面就果断划走了,但试错不易,能不能留个点赞再走呢,谢谢~
🍊通常我们建议不要直接将图片存到数据库中,而是放到本地磁盘目录下,我们通常将图片统一命名,通过其文件名或路径来访问数据库实现获取图片的目的。
🍅而不建议直接往数据库存放图片的原因如下:
- 数据库性能下降:存储大量数据将占用大量的磁盘空间和系统资源,特别影响数据库性能,尤其是多用户访问的情况
- 数据库的备份和维护变得困难,且可读性差
- 压力测试:多用户同时上传或下载图片时,将导致数据库服务器压力负载过大
4.图片质量下降:比如我们待会的运行结果其实是这样的,左边是我们下载到本地的图片,右边则是下载到数据库,再从数据库读取出来的效果。而且我将二进制数值类型设置为最大还是模糊。