MyBatisベースの使用--resultMapを使用して高度なマッピング規則をカスタマイズ


目次
resultMapの概要
resultMapの使い方
id & result
constructor
association
ネストされたクエリー
ネストされた結果
collection
ネストされたクエリー
ネストされた結果
discriminator
resultMapの概要
前の2つの記事では、select要素のresultTypeプロパティを使用してクエリー結果の戻り値タイプを指定することで、MyBatisがクエリー結果セットを希望するタイプに自動的にカプセル化して戻ります.
resultTypeプロパティは非常に便利ですが、結果のタイプが複雑な場合には何もできません.そのため、MyBatisはselect要素に別のresultMapプロパティを提供し、要素で定義されたカスタム結果セットマッピングルールを参照します.
MyBatisの中で最も重要で、最も強力な要素です.JDBC呼び出し結果セットを使用するよりも90%のコードを節約したり、JDBCがサポートしていないことをたくさんしたりすることができます.実際には、複雑な文を組み合わせてマッピングするコードを記述するには、数千行が必要になる可能性があります.resultMapの設計は、単純な文は明確な結果マッピングを必要とせず、多くの複雑な文はそれらの関係を記述する必要があることです.  
resultMapの使い方
要素にはサブ要素がたくさんあります.
		 /*                      */
		 /*       ID*/

			 /*          */


			 /*  ID  ,       ID*/
		 /*      ,JavaBean        */
		 /*       */

		 /*         */

	         /*   ,         ,      */
		 /*        ,         */

1つの要素では、これらのサブ要素の出現順序は厳格に規定されており、constructor-->id-->result--> association-->collection-->discriminatorの順である.  
id & result
およびresultMapの最も基本的なマッピング内容です.クエリー結果の個々のカラムの値を、結果オブジェクトの単純なデータ型(文字列、整数、二重精度浮動小数点数、日付など)を返す個々の属性またはフィールドにマッピングできます.この2つの間の唯一の違いは、idが示す結果が、オブジェクトインスタンスを比較する際に使用される識別属性であることである.これは、特にキャッシュおよび埋め込み結果マッピング(すなわち、コンビネーションマッピング)の全体的な表現を改善するのに役立ちます. 


	
	
	
	
	


	
	
	
	
	

とともに、次のプロパティがサポートされています.
ツールバーの
説明
column
データベースからクエリーされた結果セットのカラム名またはカラム別名
property
columnプロパティで指定したカラム結果をオブジェクトのどのプロパティにマッピングするか
javaType
列の結果はオブジェクトに対応するJavaデータ型であり、戻りタイプがMapの場合に指定する必要があります.
jdbcType
カラム結果データベースでサポートされているJDBCタイプ
typeHandler
使用するタイプのプロセッサ
将来の参考のために、MyBatisは、含まれるjdbcType列挙型により、以下のJDBCタイプをサポートします.
BIT
FLOAT
CHAR
TIMESTAMP
OTHER
UNDEFINED
TINYINT
REAL
VARCHAR
BINARY
BLOB
NVARCHAR
SMALLINT
DOUBLE
LONGVARCHAR
VARBINARY
CLOB
NCHAR
INTEGER
NUMERIC
DATE
LONGVARBINARY
BOOLEAN
NCLOB
BIGINT
DECIMAL
TIME
NULL
CURSOR
ARRAY
constructor
要素を使用すると、オブジェクトをインスタンス化するときに、インスタンスの構造方法にクエリーを結果セットにパラメータとして注入し、インスタンス化オブジェクトの特殊な処理を実現できます.
たとえば、データベースの学生テーブルの年齢フィールドが長期にわたって更新されていないため、検索された学生の年齢情報が不正確になることを防止するために、データベースから学生の年齢情報を直接取得するのではなく、学生の誕生日に基づいて学生の年齢を計算したいと考えています.
まず、学生エンティティクラスStudentEntityでは、次の構成方法を追加します.
private static final SimpleDateFormat yearFormat = new SimpleDateFormat(
			"yyyy");
public StudentEntity(Long studentId, Date studentBirthday) {
	super();
	this.studentId = studentId;
	if (null != studentBirthday) {
        	this.studentBirthday = studentBirthday;
		int startYear = Integer
				.parseInt(yearFormat.format(studentBirthday));
		int nowYear = Integer.parseInt(yearFormat.format(new Date()));
		this.studentAge = nowYear - startYear;
	}
}

対応するMapperの構成は次のとおりです.

	
		
		
	
	
	
	


要素の和は、例のcolumnおよびjavaTypeの属性に加えて、jdbcType、typeHandler、select、resultMap、nameのいくつかの属性をサポートする、ここでnameの属性は3.4からである.3バージョンから導入が開始され、構築方法でパラメータの名前を指定します.注意:要素を使用してコンストラクションメソッドで初期化されたパラメータresultMapの他のサブ要素を使用してマッピングすると、コンストラクションメソッドがオブジェクトインスタンスに与える属性値が上書きされます.
association
要素は、クエリー結果に他のオブジェクトが関連付けられている場合に使用されます.たとえば、1人の学生が1つのクラスに属している場合、私たちは1人の学生の情報をクエリーするときに、彼のクラスも一緒に検出したいと思っています.
public class StudentEntity {

	private Long studentId;

	private String studentName;

	private ClassEntity studentClass;
	
	//    get set  

}

MyBatisでは、ネストされたクエリーとネストされた結果の2つの異なる方法でオブジェクト関連クエリーを処理できます.
ネストされたクエリー
ネストされたクエリーとは、別のSQLマッピング文を実行することによって関連するオブジェクトタイプを返します.

	
	
	



	
	


注意:要素はcolumnPrefixプロパティを使用して、クエリー結果内のカラム名の指定した接頭辞を除去できます.
ネストされた結果
ネストされた結果とは、テーブル・クエリーを使用して必要なすべてのフィールドの内容をクエリーし、カスケード・プロパティ・マッピングを使用して複雑なタイプの結果オブジェクトを作成することです.

	
	
	
	


	s.STUDENT_ID AS STUDENT_ID,
	s.STUDENT_NAME AS STUDENT_NAME,
	c.CLASS_ID AS CLASS_ID,
	c.CLASS_NAME AS CLASS_NAME


この場合のresultMapは、以下の2つの形式で書くこともできます.

	
	
	
		
		
	

	
	
	
	


	
	

collection
要素は、クエリー結果に他のオブジェクトの集合を関連付ける場合に使用されます.たとえば、1つのクラスに複数の学生が含まれている場合、私たちは1つのクラスの情報を検索するときに、このクラスの学生の集合も一緒に検出したいと思っています.
public class ClassEntity {

	private Long classId;

	private String className;

	private List students;

	//    get set  
}

ネストされたクエリー

		
		
		
		
	

	
		
		
	

	

	

ネストされた結果

	
	
	
		
		
	


	c.CLASS_ID AS CLASS_ID,
	c.CLASS_NAME AS CLASS_NAME,
	s.STUDENT_ID AS STUDENT_ID,
	s.STUDENT_NAME AS STUDENT_NAME


このときのresultMapは以下のように書くこともできます.

	
	
	
	
	

	
	

discriminator
要素はJava言語のswitch文に似ており、ユーザーはクエリー結果で指定したフィールドの異なる値に基づいて異なるマッピングルールを実行することができます.たとえば、1つのクラスの学生情報をクエリーするときに、学生が男子学生であれば年齢情報を一括して検索し、学生が女子学生であれば年齢情報をクエリーせずにクラス情報を一括して検出します.

	
		
		
	


	
	
	


	
	
	
		
		
	

このときのresultMapは以下のように書くこともできます.

	
	
	
		
			
		
		
			
				
				
			
		
	

注意:要素を使用してステップ・クエリーを行う場合、関連するクエリー・ステートメントに複数のパラメータを渡す必要がある場合は、column=「{classId=CLASS_ID}」を使用してパラメータをMapにカプセル化してパラメータを渡すことができます.パラメータを受信するクエリー・ステートメントはparameterTypeをMapタイプに設定する必要があります.