数据库存储图片 Blod格式

Posted on 2018-03-16 17:21  弯弓射雕的男人  阅读(797)  评论(0编辑  收藏  举报

  一般情况下 我们存取图片在数据库都是存一个地址 但是今天接触到一个 直接把二进制的图片存在数据库的问题 

当然是顺利解决了 所有咋这里做一个总结 

框架背景 是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     private String id;
 6     private String userId;
 7     private byte[] img;
 8     private String msg;
 9     public String getId() {
10         return id;
11     }
12     public void setId(String id) {
13         this.id = id;
14     }
15     public String getUserId() {
16         return userId;
17     }
18     public void setUserId(String userId) {
19         this.userId = userId;
20     }
21     public String getMsg() {
22         return msg;
23     }
24     public void setMsg(String msg) {
25         this.msg = msg;
26     }
27     
28     public byte[] getImg() {
29         return img;
30     }
31     public void setImg(byte[] img) {
32         this.img = img;
33     }
34     @Override
35     public String toString() {
36         return "TestImg [id=" + id + ", userId=" + userId + ", img=" + img
37                 + ", msg=" + msg + "]";
38     }
39 }

实现类:(这里面有很多注释的内容 我也没有仔细看 就贴在这里吧 有心情的时候可以看哟)

 1     public void save(TestImg tsetImg) throws SQLException {
 2         // TODO Auto-generated method stub
 3         Connection conn = null;
 4         Statement stmt = null;
 5         PreparedStatement pstmt = null;
 6         ResultSet rs = null;
 7         
 8         conn = DataSourceUtils.getConnection(jdbcTemplate.getDataSource());
 9         conn.setAutoCommit(false);
10         stmt = conn.createStatement();
11         
12         String Sql=    "insert into "+tableName+ 
13                 "(id,msg,user_Id) values ("
14         +Util.getSc(tsetImg.getId())
15         +","+Util.getSc(tsetImg.getMsg())
16         +","+Util.getSc(tsetImg.getUserId())+")";
17         System.out.println(Sql);
18         stmt.executeUpdate(Sql);
19         conn.commit();
20                 
21                 
22                 
23 //                 sql = "select fjnr from info_data where fjbh = " +Util.getSc(data.getFjbh())+ " FOR UPDATE ";
24 //                 rs = stmt.executeQuery(sql);
25 //                 if(rs.next()){
26 //                     Blob blob = (Blob)rs.getBlob(1);
27 //                     //blob.putBytes(1,data.getClnr());
28 //                     //BLOB b=(BLOB)blob;
29 //                     //System.err.println(data.getClnr().length+"******************4");
30 //                     blob.setBytes(1, data.getFjnr());
31 //                     //System.err.println(blob.getBytes(1, (int)blob.length()).length+"******************6");
32 //                     sql = "update info_data set fjnr=?,gxsj=sysdate where fjbh = " +Util.getSc(data.getFjbh());
33 //                     pstmt = conn.prepareStatement(sql);
34 //                     pstmt.setBlob(1, blob);
35 //                     pstmt.executeUpdate();
36 //                     conn.commit();
37 //                 }
38          Sql = "select img from "+tableName+
39                  " where id = " +
40                  Util.getSc(tsetImg.getId())+
41                  " FOR UPDATE ";
42          System.out.println(Sql);
43 //         stmt.executeUpdate(Sql);//executeUpdate用于执行INSERT、DELETE或者UPDATE以及操作TABLE的语句,返回值是int,表示受到影响的行数,对于操作TABLE的语句而言,返回值为0。
44          rs = stmt.executeQuery(Sql);
45             System.out.println(rs);
46         if(rs.next()){
47             Blob blob = (Blob)rs.getBlob(1);
48             System.out.println(blob);
49             //blob.putBytes(1,data.getClnr());
50             //BLOB b=(BLOB)blob;
51             //System.err.println(data.getClnr().length+"******************4");
52             blob.setBytes(1, tsetImg.getImg());
53             //System.err.println(blob.getBytes(1, (int)blob.length()).length+"******************6");
54             Sql = "update "+tableName+
55                     " set img=? where id = " +Util.getSc(tsetImg.getId());
56             System.out.println(Sql);
57             pstmt = conn.prepareStatement(Sql);
58             pstmt.setBlob(1, blob);
59             pstmt.executeUpdate();
60             conn.commit();
61         }
62         
63    

dao:

 1 import java.sql.SQLException;
 2 import java.util.List;
 3 
 4 import com.hz.qbzb.bean.TestImg;
 5 
 6 public interface TestImgDao {
 7 
 8     
 9     public void save(TestImg tsetImg) throws SQLException;
10 
11 
12 }

controller: 

 

 1     public void fileUpload (HttpServletRequest request,HttpServletResponse response,TestImg testImg) throws IOException{
 2                response.setContentType("text/html; charset=GBK");
 3                MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest)request;
 4                Iterator iterator=multipartRequest.getFileNames();
 5                MultipartFile file=multipartRequest.getFile("myFile");
 6                byte[] b=file.getBytes();
 7                System.out.println("length="+b.length);
 8                 
 9                 
10 //                String datadel=request.getParameter("datadel");
11 //                if(datadel!=null){
12 //                    String[] data_array=datadel.split(",");
13 //                    info.setDatadel(data_array);//设置已有需要删除的附件
14 //                }
15                 try{
16                     while(iterator.hasNext()){
17                         String fileData=(String)iterator.next();
18 //                        MultipartFile file = multipartRequest.getFile(fileData);
19                         if(file != null && !file.isEmpty()){
20                             String fileName = file.getOriginalFilename();
21                             String[] suffixs=fileName.split("\\."); 
22                             String suffix = suffixs[suffixs.length-1]; 
23                             byte bytes[] = file.getBytes();
24                             TestImg tImg=new TestImg();
25                             tImg.setImg(bytes);
26                             UserSession userSession = (UserSession)WebUtils.getSessionAttribute(request, "userSession");
27                             Sysuser sysuser = userSession.getSysuser();
28                             String uId=sysuser.getBgdh();
29                             String Id= UUID.randomUUID().toString();
30                             tImg.setId(Id);
31                             tImg.setMsg("测试数据");
32                             tImg.setUserId(uId);
33                             testImgDao.save(tImg);
34                         }
35                     }
36                 }catch(Exception e){
37 //                    String s = toolsService.cScriptInfoStr(e.getMessage());
38 //                    System.err.println(s);
39                 }
40         }

基本上就这样了 有不足的地方 欢迎补充 多做交流