1. 程式人生 > >Mybatis實現自定義的型別轉換器TypeHandler

Mybatis實現自定義的型別轉換器TypeHandler

此文其實是java操作Oracle型別XMLType總結二:使用Mybatis附帶的一篇小結。

Mybatis實現自定義的轉換器,十分的簡單,其主要步驟分為三步,這裡以操作XMLType型別為例。

第一步

新建一個轉換類,實現TypeHandler介面,介面的泛型指定引數型別,不指定則為Object:

  1. publicclassXmltypeTypeHandlerimplementsTypeHandler<String>

該介面主要有以下4個方法:

public void setParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) public String getResult(ResultSet rs, String columnName) throws SQLException

public String getResult(ResultSet rs, int columnIndex) throws SQLException

public String getResult(CallableStatement cs, int columnIndex) throws SQLException

方法的作用看名字應該就能明白,setParameter是傳入引數時的操作,在引數傳入到資料庫前需要做加工處理的程式碼,可以寫在該方法內,其它三個均為獲取查詢結果方法,在得到jdbc的查詢結果後可以轉換為任意你想要的型別。

第二步

在mapper-config中,註冊你實現的轉換器類,其中jdbcType可以指定的型別在Mybatis的列舉類org.apache.ibatis.type.JdbcType中有明確的定義,不能為該列舉以外的值,不然會出錯。這裡因為列舉中沒有我們需要的XMLType型別,所以指定為UNDEFINED。(也可以不指定具體的型別,在使用時用typeHandler指定具體的類即可):

  1. <typeHandlers>
  2. <typeHandlerjavaType="string"jdbcType="UNDEFINED"handler="com.tyyd.dw.context.XmltypeTypeHandler"/>
  3. </typeHandlers>
第三步

在你的mapper對映檔案中使用型別轉換器:

  1. insert into T_Content(
  2. <include refid="fullColumns"/>
  3. ) values (
  4. #{controlId,jdbcType=BIGINT},
  5. #{xmlFile,javaType=string,jdbcType=UNDEFINED,typeHandler=com.tyyd.dw.context.XmltypeTypeHandler},
  6. #{drmFile,jdbcType=BLOB}
  7. )

注意傳入的xmlFile引數,指定了javaType、jdbcType和typeHandler,表明我們要使用哪個型別處理器,當然你也可以只指定其中的某一項,但是該項存在必須唯一,如果一模一樣存在多個又指定不清晰的話,Mybatis會因為不能進行區分而出現錯誤。

至此,一個mybatis的自定義型別轉換器就實現完成了,需要注意的是,上面指定的型別處理器僅在插入資料時起作用,想要在查詢時也使用自定義的型別處理器,需要在resultMap內屬性的標籤中進行指定,其指定的標籤javaType、jdbcType和typeHandler名稱和使用方式都是一樣的,這裡就不再贅述。

附上完整的型別轉換器程式碼,因為XMLType型別要查詢時,可以使用資料庫的xmltype.getclobval()直接返回當成string來操作,所以返回的方法都沒有進行特殊處理。(也可以使用xmltype.getstringval()函式返回string,但在實際使用過程中發現當欄位為null時,getstringval()會出現ORA-06502:numeric or value error:character string buffer too small的錯誤,getclobval()則不會出現錯誤,所以推薦使用getclobval()函式):

  1. /**
  2. * oracle SYS.XMLTYPE 型別自定義處理器
  3. *
  4. * User: liyd
  5. * Date: 13-12-27
  6. * Time: 下午4:53
  7. */
  8. publicclassXmltypeTypeHandlerimplementsTypeHandler<String>{
  9. @Override
  10. publicvoid setParameter(PreparedStatement ps,int i,String parameter,JdbcType jdbcType)
  11. throwsSQLException{
  12. //防止為null時,建立XMLType出現錯誤
  13. if(StringUtils.isNotBlank(parameter)){
  14. DelegatingConnection connection =(DelegatingConnection) ps.getConnection()
  15. .getMetaData().getConnection();
  16. XMLType xmltype =XMLType.createXML(connection.getDelegate(), parameter);
  17. ps.setObject(i, xmltype);
  18. }else{
  19. ps.setString(i,null);
  20. }
  21. }
  22. @Override
  23. publicString getResult(ResultSet rs,String columnName)throwsSQLException{
  24. //資料庫sql查詢時xmltype欄位使用xmltype.getclobval()返回
  25. return rs.getString(columnName);
  26. }
  27. @Override
  28. publicString getResult(ResultSet rs,int columnIndex)throwsSQLException{
  29. return rs.getString(columnIndex);
  30. }
  31. @Override
  32. publicString getResult(CallableStatement cs,int columnIndex)throwsSQLException{
  33. return cs.getString(columnIndex);
  34. }
  35. }

相關推薦

MyBatis配置typeHandler型別轉換 (定義型別轉換)

MyBatis配置のtypeHandler型別轉換器 - 簡書 https://www.jianshu.com/p/8e0a2d06892c     初始typeHandler 在JDBC中,需要在PreparedStatement物件中設定那些已經預編譯過的

mybatis typeHandler定義型別轉換

Mybatis預設不支援Calendar 解決辦法: mybatis提供了對自定義的型別轉換器(typeHandler)的支援,因此我們可以自己編寫型別轉換器來實現這一自動轉換的功能。 實現步驟: 第一步:編寫自定義型別轉換器 public

定義型別轉換

1. 繼承DefaultTypeConverter(實現了ognl.TypeConverter介面)。修改如下方法: public Object convertValue(Map<String, Object> context, Object value, Class toType)

springMVC定義型別轉換(date型別轉換

//日期的月份不能寫成小寫mm,因為在日期中還有分鐘mm,這兩者不能相同。 1.建立一個類實現Convert介面,實現convert方法 public date convert(String source){   if(source!=null&&!source.equals(""){

Struts2定義型別轉換

package com.loaderman.d_type; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Da

springmvc學習筆記(26)——定義型別轉換

資料繫結流程 使用springmvc框架有諸多好處,其中較為突出的就是它的資料繫結。 當我們的前端傳過來一個表單的時候,我們只需要使用一個類物件(如Student物件)就接收,springmvc將幫我們把屬性一一對應的填充進去。這就是資料繫結。 資料繫結過程中,springmvc幫我們把前端

Geometry型別定義型別轉換

WebGIS處理避免不了會用到wkt 字串傳入java後臺轉成Geometry的需求,但是我們以往的作法是後臺直接接受一個字串然後認為進行轉換工作。其實Spring MVC 字串自動對映成物件的處理方便相當方便,但是對於這種Geometry複雜型別是不支援的。其

spring mvc定義型別轉換

參考spring boot 配置全域性日期型別轉換器 1 定義轉換器 @Component public class DateConvert implements Converter<String,Date> { @Override public Dat

SpringMVC_15_定義型別轉換

ConversionService是Spring型別轉換體系的核心介面。 可以利用ConversionSeviceFactoryBean在Spring的IOC容器中定義ConversionService.Spring將自動識別出IOC容器中的ConversionService,

Spring中的定義型別轉換

ConversionService 是 Spring 型別轉換體系的核心介面。可以利用 ConversionServiceFactoryBean 在 Spring 的 IOC容器中定義一個 ConversionService. Spring 將自動識別出IOC 容器中的 C

springMvc定義型別轉換(把接收引數String轉成為Date型別

1.  首先建立一個類,實現Converter介面,並實現其未實現方法。import org.springframework.core.convert.converter.Converter; public class CustomGlobalStrToDateConver

Struts2的型別轉換及輸入校驗(定義型別轉換)

typeconverter2.jsp <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@ taglib uri="/struts-tags" prefix="s"

定義型別轉換--區域性和全域性

 在Struts2框架中使用自定義型別轉換器需要註冊,這樣在處理使用者請求的時候系統才知道使用哪個型別轉換器進行轉換。 1、 註冊區域性型別轉換器 區域性型別轉換器的作用範圍為Action範圍。註冊區域性型別轉換器需要建立一個命名規則為ActionName-conv

【Struts2框架】第七節型別轉換-型別轉換原理和定義型別轉換例項

1.型別轉換原理 型別轉換是struts攔截器來實現的。 型別轉換的意思是能夠把引數轉換成action裡面所需要的型別。 轉換不了可以使用自己寫的轉換器(但幾乎不用自己寫)。 在struts的傳參過程中,我們已經不知不覺的在使用型別轉換了 例如: http://localh

Mybatis實現定義型別轉換TypeHandler

此文其實是java操作Oracle型別XMLType總結二:使用Mybatis附帶的一篇小結。 Mybatis實現自定義的轉換器,十分的簡單,其主要步驟分為三步,這裡以操作XMLType型別為例。 第一步 新建一個轉換類,實現TypeHandler介面,介面的泛型指定引數型別,不指定則為Object:

mybatis-generator程式碼生成(支援定義型別轉換

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

springboot中mybatis定義型別轉換

import org.apache.ibatis.type.JdbcType; import org.apache.ibatis.type.TypeHandler; import java.sql.CallableStatement; import java.sql.Pre

flask第十一篇——定義url轉換

不可 edi quest img med 去掉 app 系統 pic 首先和大家說一下flask的組成,flask其實是werkzeug(路由和http處理)+SQLAlchemy(數據庫)+Jinja2(模板)組成的,今天我們要看到的東西就是`werkzeug`裏面的

Java原始碼分析——Class類、ClassLoader類解析(三) 類載入實現定義類載入

    在這個系列的第一篇章就講解了Class類的獲取以及載入過程,但是並沒有提及具體的載入過程,在java中,載入一個類是通過ClassLoader類來執行的,也就是類載入器完成。java中所有的類,都必須載入進jvm中才能執行,這個載入的意思是

spring boot 定義訊息轉換

需求分析:在請求返回中,想統一返回的資料格式。在controller層中通過aop中的環繞通知實現了這個功能。但是在轉換的過程中,提示沒有自定義的格式轉換器。所有我們需要自己實現這個轉換器。 實現方式:通過繼承 AbstractHttpMessageConverter這個類來實現功能。 pu