mybatis操作oracle blob类型数据

1、需求:正在开发的一个系统,需要给另外一个系统提供一个文件,交互方式:网闸(通过表的映射),对方不接受文件服务器的方式上传/下载文件。对方提出的要求是把文件以二进制的形式存到数据库中。

2、操作过程

      a、实体类

public class JczxChkbillMes implements Serializable{


    /**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	/**
     * 自检任务结果
     */
    private String gid;
    /**
     * 检测单据号
     */
    private String code;
    /**
     * 派工单编号
     */
    private String dispatch_code;
    /**
     * 产品名称
     */
    private String product_name;
    /**
     * 产品编码
     */
    private String produ_uid;
    /**
     * 工序名称
     */
    private String op_name;
    /**
     * 工序编号
     */
    private String op_code;
    /**
     * 工位编号
     */
    private String workstation_code;
    /**
     * 单据检测结果(0未判定、1不合格、7合格)
     */
    private Integer result;
    /**
     * 检测项编码
     */
    private String citem_code;
    /**
     * 检测项名称
     */
    private String citem_name;
    /**
     * 检测项说明
     */
    private String citem_remark;
    /**
     * 检测项类型(0定性检测1定量检测2装配信息)
     */
    private Integer check_model;
    /**
     * 标准值(1定量检测)
     */
    private Double standard_value;
    /**
     * 控制下限(1定量检测)
     */
    private Double min_value;
    /**
     * 控制上限(1定量检测)
     */
    private Double max_value;
    /**
     * 控制上限(1定量检测)
     */
    private String chk_value;
    /**
     * 控制上限(1定量检测)
     */
    private Integer chk_result;
    /**
     * 备注(2装配信息-填写序列号)
     */
    private String remark;
    /**
     * 处理人工号
     */
    private String processer;
    /**
     * 处理时间
     */
    private Date process_date;
    /**
     * 特殊编码
     */
    private String special_code;
    /**
     * 检测项分组
     */
    private String check_group;
    /**
     * 标志位
     */
    private Integer flag;
    private byte[] file_content;
   
}

b、业务层代码

public String insertBlob(byte [] bytes,String id,String fileName ){
        //bytes 是文件转成字节数组
		fileName = fileName.replace(".doc", ".pdf");
		String result = "上传成功";
		List<Map<String, Object>> checkBillById = stationDao.getCheckBillById(id);
		Map<String,Object> bill = checkBillById.get(0);
		Map<String,Object> paramMap = new HashMap<String,Object>();
		String OP_CODE = (String)bill.get("OP_CODE") ;
		String CHECK_MODE = "4" ;
		String DISPATCH_CODE = (String)bill.get("ORDERCODE") ;
		String OP_NAME = (String)bill.get("OP_NAME") ;
		String PRODUCT_NAME = (String)bill.get("PRODUCT_NAME") ;
		String CITEM_NAME = (String)bill.get("CITEM_NAME") ;
		String PRODU_UID = (String)bill.get("PRODU_UID") ;
		String ID = (String)bill.get("ID") ;
		String CITEM_CODE = (String)bill.get("CITEM_CODE") ;
		String CODE = (String)bill.get("CODE") ;
		String PROCESSER = "李海强" ;
		String PROCESS_DATE = (String)bill.get("PROCESS_DATE") ;
		String WORKSTATION_CODE = "GW033008009005";
		String RESULT = "7" ;
		String REMARK = fileName ;
		String FLAG = "0" ;
		paramMap.put("OP_CODE", OP_CODE);
		paramMap.put("CHECK_MODE", CHECK_MODE);
		paramMap.put("DISPATCH_CODE", DISPATCH_CODE);
		paramMap.put("OP_NAME", OP_NAME);
		paramMap.put("PRODUCT_NAME", PRODUCT_NAME);
		paramMap.put("CITEM_NAME", CITEM_NAME);
		paramMap.put("PRODU_UID", PRODU_UID);
		paramMap.put("ID", ID);
		paramMap.put("CITEM_CODE", CITEM_CODE);
		paramMap.put("CODE", CODE);
		paramMap.put("PROCESSER", PROCESSER);
		paramMap.put("PROCESS_DATE", PROCESS_DATE);
		paramMap.put("WORKSTATION_CODE", WORKSTATION_CODE);
		paramMap.put("RESULT", RESULT);
		paramMap.put("REMARK", REMARK);
		paramMap.put("FLAG", FLAG);
		paramMap.put("FILE_CONTENT", bytes);
		JczxChkbillMes mes = new JczxChkbillMes();
		mes.setOp_code(OP_CODE);
		mes.setCheck_model(4);
		mes.setDispatch_code(DISPATCH_CODE);
		mes.setOp_name(OP_NAME);
		mes.setProduct_name(PRODUCT_NAME);
		mes.setCitem_name(CITEM_NAME);
		mes.setProdu_uid(PRODU_UID);
		mes.setGid(ID);
		mes.setCitem_code(CITEM_CODE);
		mes.setCode(CODE);
		mes.setProcesser("李海强");
		mes.setWorkstation_code(WORKSTATION_CODE);
		mes.setResult(7);
		mes.setRemark(REMARK);
		mes.setFlag(0);
		DBHelper db = new DBHelper();
		mes.setFile_content(bytes);
		mesDao.addCheckFileBillToMes(mes);
		return result ;
	}

c、xml

<insert id="addCheckFileBillToMes" parameterType="com.spps.pojo.JczxChkbillMes">
	insert into JCZX_CHKBILL_MES 
        (GID, CODE, DISPATCH_CODE, PRODUCT_NAME, PRODU_UID,     
            OP_NAME, OP_CODE, WORKSTATION_CODE, RESULT, CITEM_CODE, CITEM_NAME,     
            CHECK_MODEL, REMARK, PROCESSER, PROCESS_DATE, FLAG, FILE_CONTENT)
	values     
        (#{gid}, #{code}, #{dispatch_code}, #{product_name}, #{produ_uid}, #{op_name}, #            
          {op_code}, #{workstation_code}, #{result}, #{citem_code}, #{citem_name}, #    
          {check_model}, #{remark}, #{processer}, to_date(to_char(sysdate, 'yyyy-MM-dd'),         
           'yyyy-mm-dd'),#{flag}, #{file_content,jdbcType=BLOB})
</insert>

还有另一种解决方案原声JDBC

public class DBHelper {
	private static Connection conn;                                        //用于建立数据库连接
	private PreparedStatement pres;                                        //执行sql的preparedStatement
	static{
		try {
			Class.forName("oracle.jdbc.OracleDriver");                     //加载驱动类
			String url="jdbc:oracle:thin:@localhost:1521:orcl";     //连接数据库的url
			String user="chenggevi";
			String pwd="chenggevi";
			
			conn=DriverManager.getConnection(url,user,pwd);                //请求数据库连接
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	//写入blob数据
	public void writeBlob(String id ,byte [] content){
		try {
			conn.setAutoCommit(false);                                     //关闭自动提交
			String sql="insert into JCZX_CHKBILL_MES (gid,file_content) values(?,?)";               //插入语句
			//String sql="insert into JCZX_CHKBILL_MES (gid,code) values(?,?)";               //插入语句
			
			pres=conn.prepareStatement(sql);
			pres.setString(1, id);                          
			pres.setBlob(2,oracle.sql.BLOB.getEmptyBLOB());                //先插入空的BLOB,获取游标
			
			
			pres.executeUpdate();
			
			sql="select file_content from JCZX_CHKBILL_MES where gid = ? ";
			pres=conn.prepareStatement(sql);
			pres.setString(1, id);                                             //找出ID为1的,也就是刚刚插入的
			ResultSet res=pres.executeQuery();
			res.next();
			Blob imageBlob=res.getBlob(1);                                 //得到该空的blob
			
			OutputStream os = imageBlob.setBinaryStream(0); 
			os.write(content);
            os.flush();  
            os.close();  
            conn.commit();  
            conn.setAutoCommit(true);// 恢复现场 
            
            if(res!=null)
            	res.close();
            if(pres!=null)
            	pres.close();
            
            System.out.println("插入成功!!!");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	
	public void getImage(){
		String sql="select photo from blobtest where id=?";
		
		try {
			pres=conn.prepareStatement(sql);
			pres.setInt(1, 1);
			ResultSet res=pres.executeQuery();
			
			while(res.next()){
				Blob image=res.getBlob(1);                                         //得到该blob
				
				InputStream is = image.getBinaryStream();                          //获得该blob的输出流
                FileOutputStream fos = new FileOutputStream("E:\\outputImage.jpg");  
                int i = 0;  
                while ((i = is.read()) != -1) {  
                    fos.write(i);  
                }  
                fos.flush();  
                fos.close();  
                is.close();  
			}
			System.out.println("成功输出图片!!!");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis提供了Blob类型的支持,可以将二进制数据(如图片)存储到OracleBlob字段中。 首先,在Mapper.xml中定义一个insert语句,如下所示: ``` <insert id="insertImage" parameterType="Map"> INSERT INTO image_table(id, image) VALUES(#{id}, #{image,jdbcType=BLOB}) </insert> ``` 其中,#{image,jdbcType=BLOB}表示将image属性映射到数据库的BLOB字段。 然后,在Java代码中,将图片转换成字节数组,再将字节数组封装到一个Map中,作为参数调用insertImage方法,如下所示: ``` byte[] imageBytes = Files.readAllBytes(Paths.get("path/to/image.png")); Map<String, Object> paramMap = new HashMap<>(); paramMap.put("id", 1); paramMap.put("image", imageBytes); mapper.insertImage(paramMap); ``` 以上代码将读取一个PNG格式的图片文件,将其转换成字节数组,然后将字节数组封装到一个Map中,作为参数调用insertImage方法,将图片存储到数据库中。 查询Blob类型数据时,可以使用MyBatis提供的ResultHandler接口来处理Blob类型数据,如下所示: ``` public class ImageResultHandler implements ResultHandler { @Override public void handleResult(ResultContext context) { ImageEntity entity = (ImageEntity) context.getResultObject(); Blob blob = entity.getImage(); byte[] bytes = null; try (InputStream inputStream = blob.getBinaryStream()) { bytes = IOUtils.toByteArray(inputStream); } catch (SQLException | IOException e) { e.printStackTrace(); } entity.setImageBytes(bytes); } } public interface ImageMapper { @Select("SELECT id, image FROM image_table WHERE id=#{id}") @ResultType(ImageEntity.class) void getImage(long id, ResultHandler handler); } ``` 以上代码定义了一个ImageResultHandler类,实现了ResultHandler接口,用于处理查询结果中的Blob类型数据。在调用ImageMapper的getImage方法时,将ImageResultHandler实例作为参数传入,MyBatis会自动调用ImageResultHandler的handleResult方法,将查询结果封装成ImageEntity实例。 在ImageEntity类中,可以定义一个byte[]类型的属性,用于存储从Blob字段中读取的字节数组。这样,查询到的图片数据就可以直接使用了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值