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();
}
}
}