一般情况下 我们存取图片在数据库都是存一个地址 但是今天接触到一个 直接把二进制的图片存在数据库的问题
当然是顺利解决了 所有咋这里做一个总结
框架背景 是spring hibernate
一下是要注意的几点
1》建表的时候
A.类型是 blod 格式 要有默认值 (后面代码里会讲到默认值的作用)
B.实体类是对应的blod类型是byte
2》就是在存储的时候要注意 写三条sql
第一条 sql
insert into Test_Img(id,msg,user_Id) values ('f018469a-b9bb-4081-8d23-4aba14b80f41','测试数据','0991-4849655')
不要set这个byte类型的字段 其余的都先添加进去 因为这个byte的字段要单独的set进去那就是要涉及到第二条sql sql先看一下第二条sql
第二条 sql
select img from Test_Img where id = 'f018469a-b9bb-4081-8d23-4aba14b80f41' FOR UPDATE
这条sql主要的作用的查到这条数据 FOR UPDATE的意思是锁定这张表 (在锁定之后其他用户是不能操作这张表的 这也是这个方法的弊端)
我现在把前提工作做完之后开始要写入数据了
第三条 sql
update Test_Img set img=? where id = 'f018469a-b9bb-4081-8d23-4aba14b80f41'
光有sql还不ok 还要有 一些图 (这里不做多的解释 下面会有代码 其中用到的Util.getSc(tsetImg.getId() 也会有)
这样就顺利的存储完成了
下面是详细的代码 :
Util.getSc的工具类 (这个方法我也没有仔细的研究i 别人写的我直接拿来用的 )
1 static public String getSqlPlaceCh(String str) { // 将查询字串里的'用‘’代替,并且输出加引号的字串 2 // return str.replaceAll(".*([';]+|(--)+).*", " "); 3 if (str == null || str.length() == 0) 4 return null; 5 StringBuffer sb = new StringBuffer(str.length()); 6 for (int i = 0; i < str.length(); i++) { 7 switch (str.charAt(i)) { 8 case '\'': 9 sb.append("\'\'"); 10 break; 11 /* 12 * case'\"': sb.append("\\\""); break; case'\\': sb.append("\\\\"); 13 * break; 14 */ 15 default: 16 sb.append(str.charAt(i)); 17 break; 18 } 19 } 20 String result = sb.toString(); 21 return "\'" + result + "\'"; 22 }
实体类:
1 import java.sql.Blob; 2 3 public class TestImg { 4 5