通常狀況下 咱們存取圖片在數據庫都是存一個地址 可是今天接觸到一個 直接把二進制的圖片存在數據庫的問題 html
固然是順利解決了 全部咋這裏作一個總結 java
框架背景 是spring hibernatespring
一下是要注意的幾點sql
1》建表的時候數據庫
A.類型是 blod 格式 要有默認值 (後面代碼裏會講到默認值的做用)app
B.實體類是對應的blod類型是byte框架
2》就是在存儲的時候要注意 寫三條sqldom
第一條 sqlide
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 }
基本上就這樣了 有不足的地方 歡迎補充 多作交流