Service代码实现:
@Transactional//因为没有加这个注解,报错ORA-22990 public boolean insertCover(MultipartFile image, Book book, String imagePath){ InputStream inputStream = null; BookCover bookCover; OutputStream outputStream= null; int insertFlag=bookDao.insertBookCover(book.getBookId()); if(insertFlag>0) { try { bookCover = bookDao.queryBookCover(book.getBookId()); //BookCover中的bookCover设置为Object对象,最开始设置为String,报java.lang.NullPointerException Blob blob = (Blob)bookCover.getBookCover(); byte[] data = null; //要保存到数据库的文件 inputStream = new FileInputStream(imagePath); //book_cover作为接收输入文件流的对象 outputStream=blob.setBinaryStream(0); data = FileCopyUtils.copyToByteArray(inputStream); outputStream.write(data); } catch (IOException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); }finally { try { outputStream.flush(); outputStream.close(); inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } }
dao.xml的代码实现
<insert id="insertBookCover" useGeneratedKeys="true" keyColumn="book_id" parameterType="Integer"> insert into book_cover(book_id,book_cover) <--在数据库中先插入empty_blob()--> values(#{book_id},empty_blob()) </insert> <select id="queryBookCover" parameterType="Integer" resultType="com.bookdeer.bookdeer.entity.BookCover"> select * from book_cover where book_id = #{bookId} for update </select>
大致的思路:在数据库中先插入empty_blob(),然后select,将blob(book_cover)作为一个被输入的对象,将要保存的文件流输入到这个被输入对象里