数据库存储图片 Blod格式

Posted on   弯弓射雕的男人  阅读(825)  评论(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         }
复制代码

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

  

努力加载评论中...
点击右上角即可分享
微信分享提示