iBATISカスタムタイププロセッサTypeHandlerCallback

iBATISはTypeHandlerCallbackを提供して、ユーザー定義のタイプの処理を提供します。

 パブリックインターフェイスTypeHandlerCallback {

     public void setParameter(ParameterSetter setter、Object parameter)
       SQLExceptionをスローします。

   public Object getResult(ResultGetter getter)
       SQLExceptionをスローします。

   パブリックオブジェクトvalueOf(String s);

 }

主に上記の3つのメソッドを使用してカスタム型変換をサポートします。 ここでは、それを使ってカスタムデータをサポートする方法を詳しく説明します。

デモの主な内容は、フォームの性別列のフィールドを必要なコンテンツ(女性< - >女性、男性< - >男性)に変換することです。

データベーステーブルの人

 テーブルの人を作成する(
  id int not null auto_increment、
 性別varchar(10)、
 制約pk主キー(id)
 );

 人(id、gender)の値(null、 'female')に挿入します。
 人(id、gender)の値(null、male)に挿入する。
 人(id、gender)の値(null、null)に挿入する。 

フォームは非常にシンプルで、主に自動インクリメントの主キーと除外ジェンダーを提供し、実験データを挿入します。

2.POJOカテゴリ

 パッケージcom.xxx.pojos;
 public class People {

    プライベートint id;

    プライベートストリングジェンダー。

     / **
      * @returnのid
      * /
     public int getId(){
         return id;
     }

     / **
      * @param id
      *設定するID
      * /
     public void setId(int id){
         this.id = id;
     }

     / **
      * @return the gender
      * /
     public String getGender(){
        ジェンダーを返す。
     }

     / **
      * @param gender
      *設定する性別
      * /
     public void setGender(String gender){
         this.gender = gender;
     }

     @Override
     public String toString(){
         return "id:" + id + "gender:" + gender;
     }

 }

TypeHandlerCallback実装クラス

 パブリッククラスGenderTypeHandlerCallbackは、TypeHandlerCallback {

    プライベートstatic final String R_FEMALE = "Female";

    プライベートstatic final String R_MALE = "Male";

    プライベートstatic final String FEMALE = "女性";

    プライベートstatic final String MALE = "男性";

     / **
      * @ com.ibatis.sqlmap.client.extensions.TypeHandlerCallback#getResult(com.ibatis.sqlmap.client.extensions.ResultGetter)を参照してください。
      * /
     public Object getResult(ResultGetter getter)throws SQLException {

         if(getter.getObject()== null)
         {
             nullを返す。
         }

         return convertDbToValue(getter.getString());
     }

     / **
      * @see com.ibatis.sqlmap.client.extensions.TypeHandlerCallback#setParameter(com.ibatis.sqlmap.client.extensions.ParameterSetter、
      * java.lang.Object)
      * /
     public void setParameter(ParameterSetter setter、Object value)
             throws SQLException {

         setter.setString(saveValueToDb((String)value));

     }

     / **
      * @see com.ibatis.sqlmap.client.extensions.TypeHandlerCallback#valueOf(java.lang.String)
      * /
     public Object valueOf(文字列値){

        戻り値convertDbToValue(value);
     }

     / **
      * POJO値変換データベースの値が格納されます*
      * @param値
      * @return
      * /
    プライベートString saveValueToDb(文字列値){
         if(value.equals(R_MALE))
         {
            女性を返します。
         } else if(value.equals(R_FEMALE))
         {
             MALEを返します。
         } else
         {
            新しいIllegalArgumentExceptionをスローする( "パラメータ値が正しくありません!" + value);
         }
     }

     / **
      * POJOに必要な値のデータベースの値*
      * @param値
      * @return
      * /
    プライベート文字列convertDbToValue(文字列値){

         if(value.equals(FEMALE))
         {
             R_FEMALEを返します。
         } else if(value.equals(MALE))
         {
             R_MALEを返す。
         } else
         {
            新しいIllegalArgumentExceptionをスローする( "パラメータ値が正しくありません!" + value);
         }
     }

 }

4.タイプハンドラーコールバックの登録

複数の設定ファイルに登録することができます:

1).sqlMapConfig.xml。 グローバル構成登録。

2)は、単一のparameterMapまたはresultMapに登録されます。

この例は、parameterMapの登録を示しています。

  <resultMap class = "com.xxx.pojos.People" id = "people">
    <result property = "id" column = "id" javaType = "int" jdbcType = "INT" />
    <result property = "gender" column = "gender" javaType = "string" nullValue = "male" jdbcType = "VARCHAR" typeHandler = "com.xxx.typeHandler.GenderTypeHandlerCallback" />

  </ resultMap> 

5.運営実績

ジェンダー列は元々は女性、男性、およびヌルとしてデータベースに格納されていましたが、カスタム型変換後には男性または女性になります。

遭遇した問題

私は問題なく上記をテストしましたが、関連する情報を見たときに問題がありました:

TypeHandlerCallbackメソッドにはvalueOf()メソッドがあり、その主な機能はデータベースの列がnullの場合に処理することです。 したがって、上記のnullValue = "male"のように、登録時のnullValueの結果をnullのデフォルト値で埋める必要があります。

さらに、登録時にnullValue = 'male'と入力しても、NUllpointer例外が発生し、trace()メソッドがgetResultメソッドにif(getter)を追加することに注意してください。 getObject()== null){return null;}

つまり、nullかどうかを手動で判断する必要があります。結果がnullの場合、returnはvalueOfメソッドを呼び出してnullValueのセットの値をロードします。

カテゴリ:Default 時間:2018-05-16 人気:0
この記事では、 iBatis

関連記事

Copyright (C) socapnw.com, All Rights Reserved.

Socapnw All Rights Reserved.

processed in 0.438 (s). 11 q(s)