首页 > 代码库 > 使用SSH操作Oracle中BLOB大对象

使用SSH操作Oracle中BLOB大对象

package entity;

/**
 * Bigobject entity. @author MyEclipse Persistence Tools
 */

public class Bigobject implements java.io.Serializable {

    // Fields

    private Integer id;
    private byte[] tblob;
    private String filename;

    // Constructors

    /** default constructor */
    public Bigobject() {
    }

    /** minimal constructor */
    public Bigobject(Integer id) {
        this.id = id;
    }

    /** full constructor */
    public Bigobject(Integer id, byte[] tblob, String filename) {
        this.id = id;
        this.tblob = tblob;
        this.filename = filename;
    }

    // Property accessors

    public Integer getId() {
        return this.id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public byte[] getTblob() {
        return this.tblob;
    }

    public void setTblob(byte[]tblob) {
        this.tblob = tblob;
    }

    public String getFilename() {
        return this.filename;
    }

    public void setFilename(String filename) {
        this.filename = filename;
    }

}

翻转表生成实体类 默认生成为String类型 需要把String 类型改为 byte[]

当然映射文件也要记得改

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="entity.Bigobject" table="BIGOBJECT" schema="SCOTT">
        <id name="id" type="java.lang.Integer">
            <column name="ID" precision="6" scale="0" />
            <generator class="assigned" />
        </id>
        <property name="tblob" type="byte[]">  
            <column name="TBLOB" />
        </property>
        <property name="filename" type="java.lang.String">
            <column name="FILENAME" length="20" />
        </property>
    </class>
</hibernate-mapping>

接下来就开始写数据访问层代码

package dao;

import java.util.List;
 
import entity.Bigobject;
/**
  * 数据访问层接口
  * @author 尹涛
  *
  */
public interface BigobjectDao {
    /**
     * 获取所有信息
     * @return 信息列表
     */
  public List<Bigobject> find();
   /**
    * 添加信息
    * @param bigobject 实体对象
    * @return 添加结果(成功&失败)
    */
  public Integer addBigobject(Bigobject bigobject);
}

数据访问层接口实现类

package dao.impl;


import java.util.List;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import dao.BigobjectDao;
import entity.Bigobject;
 /**
  * 数据访问接口实现类
  * @author 尹涛
  *
  */
public class BigobjectDaoImpl extends HibernateDaoSupport implements
        BigobjectDao {

    @Override
    public List<Bigobject> find() {
        List<Bigobject> list=super.getHibernateTemplate().find("from Bigobject");    
        return list;
    }


    
    @Override
    public Integer addBigobject(Bigobject bigobject) {        
        return (Integer)super.getHibernateTemplate().save(bigobject);
    }


    
}

业务逻辑层代码

package service;

import java.util.List;

import entity.Bigobject;
 /**
  * 业务逻辑层接口
  * @author 尹涛
  *
  */
public interface BigobjectService {
    /**
     * 获取所有信息
     * @return 信息列表
     */
  public List<Bigobject> find();
   /**
    * 添加信息
    * @param bigobject 实体对象
    * @return 添加结果(成功&失败)
    */
  public Integer addBigobject(Bigobject bigobject);
}

业务逻辑层接口实现类

package service.impl;

import java.util.List;

import dao.BigobjectDao;

import entity.Bigobject;
import service.BigobjectService;
 /**
  * 业务逻辑层接口实现类
  * @author 尹涛
  *
  */
public class BigobjectServiceImpl implements BigobjectService {
    private BigobjectDao bd;  //数据访问层接口
    
    public BigobjectDao getBd() {
        return bd;
    }

    public void setBd(BigobjectDao bd) {
        this.bd = bd;
    }

    @Override
    public List<Bigobject> find() {
        // TODO Auto-generated method stub
        return bd.find();
    }

    @Override
    public Integer addBigobject(Bigobject bigobject) {
        
        return bd.addBigobject(bigobject);
    }

}

接下来就是action层代码

package action;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import java.util.List;

import org.apache.struts2.ServletActionContext;

import service.BigobjectService;

import com.opensymphony.xwork2.ActionSupport;


import entity.Bigobject;
 /**
  * action处理类
  * @author 尹涛
  *
  */
public class BigobjectAction extends ActionSupport {
    
    private BigobjectService bs; //业务逻辑层对象
    private List<Bigobject> list; //信息列表
    private Bigobject bj;   //实体对象
    private File upload;  //封装上传文件属性
    private String uploadContenType; //上传文件类型
    private String  uploadFileName; //上传文件名称
    FileOutputStream  fos=null;  //输出流对象
    FileInputStream fis=null;   //文件输入流对象
    //存储图片路径
    String path=ServletActionContext.getServletContext().getRealPath("/img/");
    //获取所有信息
    public String find() throws IOException{
        list=bs.find();  //获取列表信息
        if(list.size()>0){  //判断当前列表是否为空
            for (Bigobject lists : list) {
                try {
                     //将文件输出到WebRoot下img文件夹中
                    fos=new FileOutputStream(path+"\\"+lists.getFilename());
                    fos.write(lists.getTblob());                    
                } catch (FileNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }finally{
                    fos.close();
                }
            }            
        }
        return "doIndex";
   }
   //添加信息
  public String toAdd() throws IOException{
      
    try {
        bj=new Bigobject();
         //读取文件
        fis=new FileInputStream(upload);
        //保存文件,并设置保存路径 
        fos=new FileOutputStream(path+"\\"+this.uploadFileName); 
        //存储二进制文件的字节码
        byte [] buf=new byte[fis.available()];
         //获取读取到的文件的字节大小
         int length=fis.read(buf); 
         while (length>0) {
            fos.write(buf, 0, length);
            length=fis.read(buf);            
        }
        //读入类路径下的file文件的二进制数据
        InputStream in=new FileInputStream(path+"\\"+this.uploadFileName);
        byte[] byteArray=new byte[in.available()];
        in.read(byteArray);
        in.close();     
      bj.setId(7);
      bj.setTblob(byteArray);
      bj.setFilename(uploadFileName);
     int id= bs.addBigobject(bj);
    } catch (FileNotFoundException e) {        
        e.printStackTrace();
    }finally{
        fos.close();
        fis.close();
        
    }
      
      return "doAdd";
  }    
    //以下为 get 和 set方法..
    public BigobjectService getBs() {
        return bs;
    }
    public void setBs(BigobjectService bs) {
        this.bs = bs;
    }
    public List<Bigobject> getList() {
        return list;
    }
    public void setList(List<Bigobject> list) {
        this.list = list;
    }
    public Bigobject getBj() {
        return bj;
    }
    public void setBj(Bigobject bj) {
        this.bj = bj;
    }


    public File getUpload() {
        return upload;
    }


    public void setUpload(File upload) {
        this.upload = upload;
    }


    public String getUploadContenType() {
        return uploadContenType;
    }


    public void setUploadContenType(String uploadContenType) {
        this.uploadContenType = uploadContenType;
    }


    public String getUploadFileName() {
        return uploadFileName;
    }


    public void setUploadFileName(String uploadFileName) {
        this.uploadFileName = uploadFileName;
    }
    
}

要获取blob大对象中中存储的图片首先应该将图片先读取到WebRoot的指定文件夹下然后在显示到页面上

在添加的时候也先将文件上传到WebRoot的指定文件夹下然后在存储到数据库中 这里需要注意的是

web.xml文件中OpenSessionInViewFilter中如果没有配置

<init-param>   
           <param-name>flushMode</param-name>   
           <param-value>AUTO</param-value>   
   </init-param>

或者是 声明式事务配置有问题

则会有可能出现异常

org.springframework.dao.InvalidDataAccessApiUsageException:

Write operations are not allowed in read-only mode (FlushMode.NEVER) turn your Session into FlushMode.AUTO or remove ‘readOnly‘ marker from transaction definition;

 

接下来就是web.xml代码

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_9" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

    <display-name>Struts Blank</display-name>
    <!-- 上下文参数 : Spring配置文件存储路径-->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>
    <!-- 监听器 :负责初始化spring配置文件/启用spring容器-->
    <listener>
        <!-- 注意:要导入spring-web.xxx.jar文件包 -->
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <!-- OpenSessionInViewFilter -->
    <filter>
        <filter-name>OpenSessionInViewFilter</filter-name>
        <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>        
    </filter>
    <filter-mapping>
        <filter-name>OpenSessionInViewFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>    
    <!-- Struts2核心控制器 -->
   <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>  
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
</web-app>

Spring配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
     http://www.springframework.org/schema/aop 
     http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
     http://www.springframework.org/schema/tx 
     http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
     ">

   <!--配置数据源  -->
   <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
      <property name="driverClassName" value="http://www.mamicode.com/oracle.jdbc.OracleDriver"></property>
      <property name="url" value="http://www.mamicode.com/jdbc:oracle:thin:@localhost:1521:orcl"></property>
      <property name="username" value="http://www.mamicode.com/scott"></property>
      <property name="password" value="http://www.mamicode.com/bdqn"></property>
   </bean>
    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource"></property>
         <!-- 添加hibernate配置参数 -->
        <!--  <property name="hibernateProperties">
            <props>
             <prop key="hibernate.show_sql">true</prop>
             <prop key="hibernate.format_sql">true</prop>
           </props>
         </property> -->
        <!--添加对象关系映射文件信息  -->
        <property name="mappingDirectoryLocations">
         <list>
          <value>classpath:entity/</value>
         </list>
        </property>
    </bean>
    <!--配置事务管理器 -->
    <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
     <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>
    <!-- 通过tx标签定义事务管理增强,并指定事务管理器 -->
     <tx:advice id="txAdvice" transaction-manager="txManager">
      <tx:attributes>
        <tx:method name="get*" read-only="true"/>
        <tx:method name="select*" read-only="true"/>
        <tx:method name="add*" propagation="REQUIRED"/>
        <tx:method name="update*" propagation="REQUIRED"/>
        <tx:method name="delete*" propagation="REQUIRED"/>
        <tx:method name="*" propagation="REQUIRED" read-only="true"/>
      </tx:attributes>
     </tx:advice>
     <!-- 定义切面 -->
     <aop:config>
       <!-- 切入点 -->
       <aop:pointcut expression="execution(* service.impl.*.*(..))" id="pointcut"/>
       <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut"/>
     </aop:config>
    <!-- dao层 -->
    <bean id="bigobjectDao" class="dao.impl.BigobjectDaoImpl" p:sessionFactory-ref="sessionFactory">    </bean>
    <!--service  -->
    <bean id="bigobjectService" class="service.impl.BigobjectServiceImpl" p:bd-ref="bigobjectDao"></bean>
    <!-- action -->
    <bean id="bigobjectAction" class="action.BigobjectAction" p:bs-ref="bigobjectService" scope="prototype"></bean>
    </beans>

struts2配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

    <constant name="struts.enable.DynamicMethodInvocation" value="false" />
    <constant name="struts.devMode" value="true" />

    <package name="default" namespace="/" extends="struts-default">
     <action name="big_*" class="bigobjectAction" method="{1}">
      <result name="doIndex">index.jsp</result>
       <result name="doAdd" type="redirectAction">big_find</result>
     </action>
    </package>

</struts>

添加信息的jsp页面 这里也需要注意的是 form表单提交的方式 一定要设置为多部分提交

 

 <body>
      <form action="big_toAdd" method="post" enctype="multipart/form-data">
                请选择文件:<input type="file" name="upload">
        <input type="submit" value="添加">            
      </form>
  </body>

一个简单的使用SSH操作Oracle数据库BLOB大对象图片上传 及显示就实现了

如果不是SSH框架组合需要注意的是要导入两个jar文件

commons-fileupload-1.2.2.jar

commons-io-2.4.jar

使用SSH操作Oracle中BLOB大对象