mybaits通过mapper文件进行数据库的增删改查操作,在进行增删改查操作时需要将java的数据类型与数据库的数据类型进行转换,此时就会用到TypeHandler类型处理器。mybatis内置了java基础数据类型的类型处理器,也支持自定义的类型处理器。

在博客系统开发时,对于博客文章的存储,我采用在oracle数据库中存储blob字段的形式,前端使用layui的富文本编辑器进行编辑和展示文章。前端传入需要保存的文章是一个string类型,怎样使用mybatis持久层保存到数据库的blob字段中呢,以及从数据库中查出blob字段并转换成java中的string类型以更好的返回给前端呢,此时就需要用到自定义的类型处理器。

1、自定义BlobTypeHandler类型处理:集成BaseTypeHandler类,实现抽象方法,在抽象方法中实现类型处理即可

/*** * @ClassName::BlobTypeHandler * @Description: 自定义mybatis blob字段处理* @author :柯雷* @date :2018年9月28日 下午2:54:36 **/
public class BlobTypeHandler extends BaseTypeHandler<String> {/*** @Description 日志打印对象 */Logger logger = LoggerFactory.getLogger(BlobTypeHandler.class);/*** <p>Title:setNonNullParameter</p> * <p>Description:insert或者update时前处理blob字段 </p> * @param ps* @param i* @param parameter* @param jdbcType* @throws SQLException * @see org.apache.ibatis.type.BaseTypeHandler#setNonNullParameter(java.sql.PreparedStatement, int, java.lang.Object, org.apache.ibatis.type.JdbcType)*/@Overridepublic void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType)throws SQLException {logger.info("【BlobTypeHandler】insert或者update时处理blob字段:");//声明一个输入流对象ByteArrayInputStream bis = null;  try {  //把字符串转为字节流bis = new ByteArrayInputStream(parameter.getBytes("gbk"));  } catch (Exception e) {  logger.error("【BlobTypeHandler】insert或者update处理blob字段出错,错误原因为:" + e);throw new RuntimeException("Blob Encoding Error!");  } finally {if (bis != null) {try {bis.close();} catch (IOException e) {logger.error("【BlobTypeHandler】insert或者update处理blob字段出错,错误原因为:" + e);throw new RuntimeException("Blob Encoding Error!");}}}ps.setBinaryStream(i, bis, Util.getDbLength(parameter));}/*** <p>Title:getNullableResult</p> * <p>Description: 查询成功后处理blob字段</p> * @param rs* @param columnName* @return* @throws SQLException * @see org.apache.ibatis.type.BaseTypeHandler#getNullableResult(java.sql.ResultSet, java.lang.String)*/@Overridepublic String getNullableResult(ResultSet rs, String columnName) throws SQLException {logger.info("【BlobTypeHandler】query查询时处理blob字段");Blob blob = (Blob) rs.getBlob(columnName);  byte[] returnValue = null;  if (null != blob) {  returnValue = blob.getBytes(1, (int) blob.length());  }  try {  //将取出的流对象转为utf-8的字符串对象return new String(returnValue, "gbk");  } catch (Exception e) {  logger.error("【BlobTypeHandler】查询处理blob字段出错,错误原因为:" + e);throw new RuntimeException("Blob Encoding Error!");}  }/*** <p>Title:getNullableResult</p> * <p>Description: 查询成功后处理blob字段 </p> * @param rs* @param columnIndex* @return* @throws SQLException * @see org.apache.ibatis.type.BaseTypeHandler#getNullableResult(java.sql.ResultSet, int)*/@Overridepublic String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {logger.info("【BlobTypeHandler】query查询时处理blob字段");Blob blob = (Blob) rs.getBlob(columnIndex); byte[] returnValue = null;  if (null != blob) {  returnValue = blob.getBytes(1, (int) blob.length());  }  try {  //将取出的流对象转为utf-8的字符串对象return new String(returnValue, "gbk");  } catch (Exception e) {  logger.error("【BlobTypeHandler】查询处理blob字段出错,错误原因为:" + e);throw new RuntimeException("Blob Encoding Error!");}}/*** <p>Title:getNullableResult</p> * <p>Description:  查询成功后处理blob字段</p> * @param cs* @param columnIndex* @return* @throws SQLException * @see org.apache.ibatis.type.BaseTypeHandler#getNullableResult(java.sql.CallableStatement, int)*/@Overridepublic String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {logger.info("【BlobTypeHandler】query查询时处理blob字段");Blob blob = (Blob) cs.getBlob(columnIndex); byte[] returnValue = null;  if (null != blob) {  returnValue = blob.getBytes(1, (int) blob.length());  }  try {  //将取出的流对象转为utf-8的字符串对象return new String(returnValue, "gbk");  } catch (Exception e) {  logger.error("【BlobTypeHandler】查询处理blob字段出错,错误原因为:" + e);throw new RuntimeException("Blob Encoding Error!");}}}

2、mapper文件中使用类型处理器:下图content字段处理

update,保存到数据库中

<!-- 更新文章信息 -->
<update id="updateArticle" parameterType="map">UPDATE BLOG_ARTICLE<set><if test="TITLE != null and TITLE != ''">TITLE = #{TITLE},</if><if test="ABSTRACT != null and ABSTRACT != ''">ABSTRACT = #{ABSTRACT},</if><if test="TYPEID != null and TYPEID != ''">TYPEID = #{TYPEID},</if><if test="TAGID != null and TAGID != ''">TAGID = #{TAGID},</if><if test="SOURCE != null and SOURCE != ''">SOURCE = #{SOURCE},</if><if test="PHOTO != null and PHOTO != ''">PHOTO = #{PHOTO},</if><if test="CONTENT != null and CONTENT != ''">CONTENT = #{CONTENT, typeHandler=cn.muchen.framework.dao.handler.BlobTypeHandler},</if><if test="SFFB != null and SFFB != ''">SFFB = #{SFFB},</if><if test="AUTHOR != null and AUTHOR != ''">AUTHOR = #{AUTHOR},</if><if test="PRAISECOUNT != null and PRAISECOUNT != ''">PRAISECOUNT = PRAISECOUNT + 1,</if><if test="TREADCOUNT != null and TREADCOUNT != ''">TREADCOUNT = TREADCOUNT + 1,</if><if test="CRITICCOUNT != null and CRITICCOUNT != ''">CRITICCOUNT = CRITICCOUNT + 1,</if><if test="READCOUNT != null and READCOUNT != ''">READCOUNT = READCOUNT + 1,</if><if test="VALIDATED != null and VALIDATED != ''">VALIDATED = #{VALIDATED},</if><if test="MEMO != null and MEMO != ''">MEMO = #{MEMO},</if><if test="BAE004 != null and BAE004 != ''">BAE003 = SYSDATE, BAE004 = #{BAE004},</if></set>WHERE ARTICLEID = #{ARTICLEID}
</update>

select,从数据库中查询

<!-- 根据文章id查询文章信息 -->
<select id="getArticleById" parameterType="integer" resultMap="queryArticleMap">SELECT <include refid="BLOG_ARTICLE_COLUMN"/> FROM BLOG_ARTICLE WHERE ARTICLEID = #{ARTICLEID}
</select>
<!-- 返回数据类型 -->
<resultMap id="queryArticleMap" type="map"><result column="ARTICLEID" property="ARTICLEID" jdbcType="INTEGER" /><result column="TITLE" property="TITLE" jdbcType="VARCHAR" /><result column="ABSTRACT" property="ABSTRACT" jdbcType="VARCHAR" /><result column="TYPEID" property="TYPEID" jdbcType="VARCHAR" /><result column="TAGID" property="TAGID" jdbcType="VARCHAR" /><result column="SOURCE" property="SOURCE" jdbcType="VARCHAR" /><result column="PHOTO" property="PHOTO" jdbcType="VARCHAR" /><result column="CONTENT" property="CONTENT" typeHandler="cn.muchen.framework.dao.handler.BlobTypeHandler" /><result column="SFFB" property="SFFB" jdbcType="VARCHAR" /><result column="AUTHOR" property="AUTHOR" jdbcType="VARCHAR" /><result column="PARENTID" property="PARENTID" jdbcType="INTEGER" /><result column="READCOUNT" property="READCOUNT" jdbcType="INTEGER" /><result column="VALIDATED" property="VALIDATED" jdbcType="VARCHAR" /><result column="MEMO" property="MEMO" jdbcType="VARCHAR" /><result column="BAE001" property="BAE001" jdbcType="DATE" /><result column="BAE002" property="BAE002" jdbcType="INTEGER" /><result column="BAE003" property="BAE003" jdbcType="DATE" /><result column="BAE004" property="BAE004" jdbcType="INTEGER" />
</resultMap>

经过上述配置,java代码中无需关心content字段在数据库中的存储类型,直接以string类型处理即可,因为每次在保存之前都会经过自定义的BlobTypeHandler类型处理器将java string类型处理为blob存入数据库,在查询之后会将从数据库查出的blob处理为string给到返回结果中。

个人博客系统开发总结之 mybatis操作blob字段相关推荐

  1. 和lock一起学beego 博客系统开发为例(六)

    为什么80%的码农都做不了架构师?>>>    接着上篇来写<和lock一起学beego 博客系统开发为例(五)> 这篇主要完成以下事项: 下篇我们要完成下面三个任务: ...

  2. 和lock一起学beego 博客系统开发为例(五)

    为什么80%的码农都做不了架构师?>>>    接着上篇来写<和lock一起学beego 博客系统开发为例(四)> 这篇主要完成以下事项: 下篇我们要完成下面三个任务: ...

  3. 【SSM架构】博客系统开发(七)-登陆界面

    [SSM架构]博客系统开发7-登陆界面 1 完成效果 2 建login.jsp 3 导入静态资源 4 建login.jsp 5 配置springmvc 6 发布项目,在浏览器地址栏访问 7 所需文件下 ...

  4. 视频教程-python项目之博客系统开发-Python

    python项目之博客系统开发 TriAquae开源运维软件创始人,混迹IT运维领域多年,曾就职于松下.国政通.飞信.中金.NOKIA等公司,维护过少至几十台,多至数万台设备的IT系统,致力于提高企业 ...

  5. python项目之博客系统开发-李杰-专题视频课程

    python项目之博客系统开发-3133人已学习 课程介绍         系统由于主站.个人博客.后台管理三部分组成,其中包含Web开发中的知识,如:多级评论.文章点赞.主题定制.iframe伪Aj ...

  6. uliweb新教程--多人博客系统开发

    2019独角兽企业重金招聘Python工程师标准>>> 开始写一个uliweb的新教程,主要围绕着一个多人博客系统的开发来写.下面是我想实现的功能: blog功能 blog首页展示 ...

  7. JSP~Qing博客系统开发

    本篇文章主要对自己做的一个C#识别软件.一个Web博客系统做项目总结. 一.ToTool识别转换助手 软件打包之后在我电脑上运行正常,识别印刷体没有问题,但在不同系统不同电脑下运行会出问题.因为核心算 ...

  8. 个人博客系统开发总结之 lucene全文检索

    博客系统前台提供搜索功能,希望不仅仅是通过文章标题.摘要来模糊搜索,而是可以跟文章内容进行匹配.由于文章内容在数据库中使用blob字段存储,无法使用数据库进行模糊查询.于是决定采用Lucene全文检索 ...

  9. 个人博客系统开发总结之 第三方登录(QQ、微博)

    当别人访问我的博客系统时,如果需要评论,就需要登录.如果此时要求注册,就比较麻烦,并且会引起访问者的反感.于是就采用第三方登录.目前支持QQ.微博登录. QQ登录 QQ互联开放平台为第三方网站提供了丰 ...

最新文章

  1. Java8简明学习之接口默认方法
  2. java多线程w3c_多线程
  3. 几道偏序问题(数据结构)
  4. django mysql 创建表_关于 django ORM 中,数据库建表方式的问题
  5. oracle常用操作指令
  6. 3C趋势价值对云计算发展的驱动作用
  7. python保存模型与参数_基于pytorch的保存和加载模型参数的方法
  8. New Monday
  9. *1LL在c++中的意义
  10. python cx_oracle配置_用Python设置cx_Oracle环境变量
  11. pytorch如何用自己训练好的模型预测新的图片类型?
  12. 学习笔记20--定位系统之多传感器融合定位技术
  13. vue项目访问的时候,用localhost能访问,但是用本机ip就不能访问 的解决办法,亲测有效
  14. 文件分隔符和转义字符
  15. 笔记本电脑无故System占用很高解决方案
  16. 地磅称重管理系统智能称重——称重软件必备的10大功能
  17. android操作系统
  18. 如何扩大自己的知识面成为IT大神
  19. 安科瑞电能质量产品怎么治理谐波电流注入电网?
  20. python字典实现switch功能

热门文章

  1. 如何使用Quire管理产品积压
  2. 含有一个量词的命题的否命题_火影手游:普通玩家如何“快速”升战力?这本身就是一个伪命题!...
  3. IOS 图片自动旋转
  4. fence集群实现HA(高可用)
  5. 9.23 Intel DSE编译器开发二面(30min)
  6. 非数值表示字符和汉字表示、声音表示、图像表示
  7. 露天矿卡车数学建模_鼓风机和露天GPU散热器之间有何区别?
  8. 教学记事:用提问的方式解疑
  9. Vue-cli 使用 vue-axios Element 完成数据列表分页 以及增删操作
  10. 算法 JAVA 对数器