一般情况下 我们存取图片在数据库都是存一个地址 但是今天接触到一个 直接把二进制的图片存在数据库的问题
当然是顺利解决了 所有咋这里做一个总结
框架背景 是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 }
基本上就这样了 有不足的地方 欢迎补充 多做交流