mybatis操作数据库,读取文件的二进制流
1、数据库存储二进制流使用的数据类型为BLOB2、mybatis语句二进制流存入数据库<update id="saveKeyValue" parameterType="java.util.Map" statementType="PREPARED">update license set keyValue=#{content,jdbcType=BLOB} where...
·
1、数据库存储二进制流使用的数据类型为BLOB
2、mybatis语句
- 二进制流存入数据库
<update id="saveKeyValue" parameterType="java.util.Map" statementType="PREPARED">
update license set keyValue=#{content,jdbcType=BLOB} where id=#{id}
</update>
需要注意的是keyValue=#{content,jdbcType=BLOB},此处传参使用的是Map,mybatis会自动获取指定的key。
- 读取数据库中的二进制流。
<select id="getKeyValue" parameterType="java.lang.String" resultType="java.util.Map" statementType="PREPARED" >
select keyValue from license where id=#{id}
</select>
这个没有去纠结具体的返回类型是什么,直接使用map进行接收。
3、mapper不做任何处理,直接传参
/**
* 保存key值
* @param map
*/
public void saveKeyValue(Map<String, Object> map);
/**
* 获取key值
* @param id
* @return
*/
public Map<String, Object> getKeyValue(String id);
4、service需要进行逻辑处理
- 存储二进制流
/**
* 通过file获取key并保存
* @param source
*/
public void readKeyValue(File source,String id) {
InputStream input = null;
byte[] content = null;
Map<String, Object> map = new HashMap<String, Object>();
map.put("id", id);
try {
input = new FileInputStream(source);
byte[] buf = new byte[1024];
int len;
while ((len = input.read(buf)) != -1) {
java.sql.Blob blob=null;
content = Arrays.copyOfRange(buf, 0, len);
blob = new SerialBlob(content);
map.put("content", blob);
}
}catch(Exception e){
e.printStackTrace();
}finally {
try {
input.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
licenseMapper.saveKeyValue(map);
}
大致过程:
- 获取文件的位置
- 获取文件的二进制流
特别需要注意的就是这段代码。获取二进制流之后,需要对流进行操作。转成blob文件
java.sql.Blob blob=null;
content = Arrays.copyOfRange(buf, 0, len);
blob = new SerialBlob(content);
map.put("content", blob);
3.调用mybatis存储数据
- 读取二进制流
/** * 通过id获取keyvalue并写入key.txt * @param dest * @param id */ public void writeKeyValue(File dest,String id) { OutputStream output = null; try { output = new FileOutputStream(dest); Map<String, Object> map = licenseMapper.getKeyValue(id); output.write((byte[]) map.get("keyValue")); } catch(Exception e) { e.printStackTrace(); } finally { try { output.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
大致过程:
- 首先通过mybatis获取对象实体,
- 通过实体获取二进制流。
这个地方需要注意:其实取出的二进制需要实质是byte[]
3.输出流将文件输出到硬盘上。
最后跟前端页面的交互记录一下
前端页面传文件时使用的是
enctype="multipart/form-data"
web层可以直接使用下面的代码。获取文件的二进制流。
@RequestMapping(value = "/license/create",method = RequestMethod.POST)
@ResponseBody
public JSONObject createLicense(HttpSession session,HttpServletRequest request,Model model,@RequestParam("file") MultipartFile file) throws Exception{
byte[] content = file.getBytes();
}
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
已为社区贡献1条内容
所有评论(0)