关于如何使用JDBC来操控oracle的blob数据类型:
首先给出数据库表的结果描述:
ID VARCHAR2(64)--表关键字
IMGS BLOB --图片数据
IMGS_SIZE NUMBER(10) --图片大小
IMGS_TYPE VARCHAR2(30)--图片类型
NOTES CLOB --图片的解释
………… --这里还有其他一些字段,就不再列举出来
需求:
如果用户没有提交上传的图片数据信息,则不对IMGS字段进行修改,否则修改此信息,(这也就决定了这里的操作如果使用hibernate
的话需要用hibernate和JDBC混合编程实现)
POJO数据对象:
代码
- @Entity
- @Table(name="image_datas")
- public class ImageNotesData implements Serializable{
- private String id;
- private long imageSize;
- private String imageType;
- private String notes;
- private Blob imageData;
- @Id
- @Column(updatable = true,nullable=false,name="ID")
- public String getId(){
- return this.id;
- }
- @Column(updatable = true,nullable=true,name="NOTES")
- @Type(type="")
- public String getNotes(){
- return this.notes;
- }
- @Transient
- public String getImageType(){
- return this.imageType;
- }
- @Transient
- public long getImageSize(){
- return this.imageSize;
- }
- @Transient
- public Blob getImageData(){
- return this.imageData;
- }
- }
<script type="text/javascript">render_code();</script>
处理流程分为两步进行:
1、存储对图片数据信息的说明和其他一些非图片区数据信息;2、存储图片数据信息;
对于流程1,使用hibernate实现:
代码
- public void saveOrUpdateImageNodesData(ImageNodesData data){
- if(data.getId==null){
- hibUtil.save(data);
- } else {
- hibUtil.update(data);
- }
- }
<script type="text/javascript">render_code();</script>
对于流程2,使用JDBC实现:
代码
- public void updateImageData(String id,long size,String type,InputStream in){
- Session session = getSession();
- Connection conn = session.connection();
- session.flush();
- PreparedStatement pstmt = null;
- BLOB blob = null;
- try {
- pstmt = conn.prepareStatement("update image_datas s set s.imgs =empty_blob() where s.id =?");
- pstmt.setString(1,id);
- pstmt.executeUpdate();
- pstmt = conn.prepareStatement("select s.imgs img from image_datas s where s.id= ? for update");
- pstmt.setString(1,id);
- ResultSet rs = pstmt.executeQuery();
- rs.next();
- blob = (BLOB) rs.getBlob("img");
- if(blob==null){
-
- }
- int zize = in.available();
- pstmt = conn.prepareStatement("update image_datas s set s.imgs=?,s.imgs_size=?,s.imgs_type=? where id=?");
- OutputStream out = blob.getBinaryOutputStream();
- byte[] data = new byte[(int)in.available()];
- in.read(data);
- out.write(data);
- out.close();
- pstmt.setBlob(1,blob);
- pstmt.setLong(2,zize);
- pstmt.setString(3,type);
- pstmt.setString(4,id);
- pstmt.executeUpdate();
- } catch (SQLException e) {
- throw new DAOException(e);
- } catch(IOException e){
- throw new DAOException(e);
- }finally{
- JdbcHelper.close(pstmt,null);
- }
- }
<script type="text/javascript">render_code();</script>
需要注意的是因为写入“一般类型”的数据发生在写入图片数据之前,同时他们作为一个事务而存在为此在更新图片数据的时候(流程2)需要显式的调用session.flush(),否则我们不可能select 到任何在流程一中写入的数据信息
分享到:
相关推荐
关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥...
关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥...
24. 写一个用jdbc连接并访问oracle数据的程序代码 25、Class.forName的作用?为什么要用? 26、大数据量下的分页解决方法。 27、用 JDBC 查询学生成绩单, 把主要代码写出来(考试概率极大). 28、这段代码有什么...
24. 写一个用jdbc连接并访问oracle数据的程序代码 111 25、Class.forName的作用?为什么要用? 111 26、大数据量下的分页解决方法。 111 27、用 JDBC 查询学生成绩单, 把主要代码写出来(考试概率极大). 112 28、这段...
24. 写一个用jdbc连接并访问oracle数据的程序代码 111 25、Class.forName的作用?为什么要用? 111 26、大数据量下的分页解决方法。 111 27、用 JDBC 查询学生成绩单, 把主要代码写出来(考试概率极大). 112 28、这段...
24. 写一个用jdbc连接并访问oracle数据的程序代码 111 25、Class.forName的作用?为什么要用? 111 26、大数据量下的分页解决方法。 111 27、用 JDBC 查询学生成绩单, 把主要代码写出来(考试概率极大). 112 28、这段...
24. 写一个用jdbc连接并访问oracle数据的程序代码 111 25、Class.forName的作用?为什么要用? 111 26、大数据量下的分页解决方法。 111 27、用 JDBC 查询学生成绩单, 把主要代码写出来(考试概率极大). 112 28、这段...
24. 写一个用jdbc连接并访问oracle数据的程序代码 111 25、Class.forName的作用?为什么要用? 111 26、大数据量下的分页解决方法。 111 27、用 JDBC 查询学生成绩单, 把主要代码写出来(考试概率极大). 112 28、这段...
24. 写一个用jdbc连接并访问oracle数据的程序代码 111 25、Class.forName的作用?为什么要用? 111 26、大数据量下的分页解决方法。 111 27、用 JDBC 查询学生成绩单, 把主要代码写出来(考试概率极大). 112 28、...
24. 写一个用jdbc连接并访问oracle数据的程序代码 121 25、Class.forName的作用?为什么要用? 121 26、大数据量下的分页解决方法。 121 27、用 JDBC 查询学生成绩单, 把主要代码写出来(考试概率极大). 122 28、这段...
24. 写一个用jdbc连接并访问oracle数据的程序代码 111 25、Class.forName的作用?为什么要用? 111 26、大数据量下的分页解决方法。 111 27、用 JDBC 查询学生成绩单, 把主要代码写出来(考试概率极大). 112 28、这段...
13、是否可以从一个 static 方法内部发出对非 static 方法的调用? ........................ 13 14、Integer 与 int 的区别 .....................................................................................