この記事では、主に mybatis チュートリアルの resultmap を紹介します。編集者がそれを紹介し、参考にさせていただきます。エディターに従って、一緒に見てみましょう
SQL マッピング XML ファイルには、すべての SQL ステートメントが配置されます。ワークスペースを定義する必要があります。ワークスペースは通常、対応するインターフェイス クラスへのパスとして定義されます。 SQL ステートメント マッピング ファイルを作成した後、MyBAtis 構成ファイルのマッパー タグ内で引用符で囲む必要があります。例:
<mappers> <mapper resource="com/bjpowernode/manager/data/mappers/UserMapper.xml" /> <mapper resource="com/bjpowernode/manager/data/mappers/StudentMapper.xml" /> <mapper resource="com/bjpowernode/manager/data/mappers/ClassMapper.xml" /> <mapper resource="com/bjpowernode/manager/data/mappers/TeacherMapper.xml" /> </mappers>
Java インターフェイスと XML ファイルが相対パスにある場合、それらは指定されません。 myBatis 設定ファイルのマッパーで宣言する必要があります。
SQL マッピング XML ファイルのいくつかの基本要素:
1. キャッシュ – 特定のスキーマのキャッシュを構成します
2. 別のスキーマからキャッシュを参照します
3. これは最も複雑ですが強力です。の要素。結果セットからオブジェクトをロードする方法を記述します。
4. SQL – 他のステートメントで再利用できる SQL ブロックです。
5. Insert – INSERT ステートメントをマップします。
6. UPDATE ステートメントをマップします。
7. – マップ DELEETE ステートメント
8. select - SELECT ステートメントのマッピング
2.1 resultMap
resultMap は、MyBatis で最も重要かつ強力な要素です。 JDBC を使用して結果セットを呼び出すよりもコードの 90% を節約でき、JDBC がサポートしていない多くのことも実行できるようになります。実際、対話型マッピングと同等の複雑なステートメントを記述するには、数千行のコードが必要になる場合があります。 ResultMap の目的は、冗長な結果マッピングを必要とせずに、このような単純なステートメントを使用することです。より複雑なステートメントの場合は、関係を記述するために絶対に必要なステートメントを除いて、それ以上のステートメントは必要ありません。
resultMap 属性: type は Java エンティティ クラス、id は resultMap の ID です。
resultMap はマッピングを設定できます:
1. コンストラクター - 結果をインスタンス化されたクラスに反映するために使用されるコンストラクター
a) idArg - グローバルな利便性のために結果セットを ID としてマークします
b) arg を呼び出します。 – コンストラクターに反映される通常の結果
2. ID – グローバル呼び出しを容易にするために結果セットを ID としてマークします
3. 結果 – JavaBean プロパティに反映される通常の結果
4.複合型; 複数の結果で構成される型
a) ネストされた結果マッピング - 内部の複数の resultMap ネストされた関連付け、または別の結果マッピングを参照することができます
5. 複合型のネストされた結果マッピングのコレクション
6. - resultMap のコレクション。別の resultMap を参照することもできます
7. 識別子 - 結果の値を使用して、どの resultMap を使用するかを決定します
a) case - いくつかの基本的な値の結果マッピングのケース状況
i. ネストされた結果マッピング – ケース自体が結果マッピングであるため、同じ要素の一部を含めることも、外部の resultMap を参照することもできます。
id、result
id、resultは最も単純なマッピング、idは主キーのマッピング、resultは他の基本的なデータベーステーブルフィールドのエンティティクラス属性へのマッピングです。
最も単純な例:
<resultMap type="bjpowernodestudentmanagerdatamodelStudentEntity" id="studentResultMap"> <id property="studentId" column="STUDENT_ID" javaType="String" jdbcType="VARCHAR"/> <result property="studentName" column="STUDENT_NAME" javaType="String" jdbcType="VARCHAR"/> <result property="studentSex" column="STUDENT_SEX" javaType="int" jdbcType="INTEGER"/> <result property="studentBirthday" column="STUDENT_BIRTHDAY" javaType="Date" jdbcType="DATE"/> <result property="studentPhoto" column="STUDENT_PHOTO" javaType="byte[]" jdbcType="BLOB" typeHandler="orgapacheibatistypeBlobTypeHandler" /> </resultMap>
id、結果ステートメントの属性設定の詳細:
属性の説明
Attribute |
Description |
|
property |
はJavaBeanのプロパティ名にマッピングする必要があります。 |
|
column |
データテーブルの列名またはラベルの別名。 |
|
javaType |
完全なクラス名、または型の別名。 JavaBean に一致する場合、通常、MyBatis はそれを独自に検出します。次に、HashMap にマッピングする場合は、javaType の目的を指定する必要があります。 |
|
jdbcType |
データテーブルでサポートされている型のリスト。この属性は、挿入、更新、または削除中に NULL を許可する列にのみ役立ちます。 JDBC ではこれが必要ですが、MyBatis では必要ありません。 JDBC に対して直接コーディングしていて、NULL を許可する列がある場合は、これを指定する必要があります。 |
|
typeHandler |
この属性を使用して、タイプ ハンドラーをオーバーライドします。この値には、完全なクラス名または型の別名を指定できます。 |
支持的JDBC类型
为了将来的引用,MyBatis 支持下列JDBC 类型,通过JdbcType 枚举:
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
constructor
我们使用id、result时候,需要定义java实体类的属性映射到数据库表的字段上。这个时候是使用JavaBean实现的。当然我们也可以使用实体类的构造方法来实现值的映射,这个时候是通过构造方法参数的书写的顺序来进行赋值的。
使用construcotr功能有限(例如使用collection级联查询)。
上面使用id、result实现的功能就可以改为:
<resultMap type="StudentEntity" id="studentResultMap" > <constructor> <idArg javaType="String" column="STUDENT_ID"/> <arg javaType="String" column="STUDENT_NAME"/> <arg javaType="String" column="STUDENT_SEX"/> <arg javaType="Date" column="STUDENT_BIRTHDAY"/> </constructor> </resultMap>
当然,我们需要定义StudentEntity实体类的构造方法:
public StudentEntity(String studentID, String studentName, String studentSex, Date studentBirthday){ this.studentID = studentID; this.studentName = studentName; this.studentSex = studentSex; this.studentBirthday = studentBirthday; }
association联合
联合元素用来处理“一对一”的关系。需要指定映射的Java实体类的属性,属性的javaType(通常MyBatis 自己会识别)。对应的数据库表的列名称。如果想覆写的话返回结果的值,需要指定typeHandler。
不同情况需要告诉MyBatis 如何加载一个联合。MyBatis 可以用两种方式加载:
1. select: 执行一个其它映射的SQL 语句返回一个Java实体类型。较灵活;
2. resultsMap: 使用一个嵌套的结果映射来处理通过join查询结果集,映射成Java实体类型。
例如,一个班级对应一个班主任。
首先定义好班级中的班主任属性:
private TeacherEntity teacherEntity;
使用select实现联合
例:班级实体类中有班主任的属性,通过联合在得到一个班级实体时,同时映射出班主任实体。
这样可以直接复用在TeacherMapper.xml文件中定义好的查询teacher根据其ID的select语句。而且不需要修改写好的SQL语句,只需要直接修改resultMap即可。
ClassMapper.xml文件部分内容:
<resultMap type="ClassEntity" id="classResultMap"> <id property="classID" column="CLASS_ID" /> <result property="className" column="CLASS_NAME" /> <result property="classYear" column="CLASS_YEAR" /> <association property="teacherEntity" column="TEACHER_ID" select="getTeacher"/> </resultMap> <select id="getClassByID" parameterType="String" resultMap="classResultMap"> SELECT * FROM CLASS_TBL CT WHERE CTCLASS_ID = #{classID}; </select>
TeacherMapper.xml文件部分内容:
<resultMap type="TeacherEntity" id="teacherResultMap"> <id property="teacherID" column="TEACHER_ID" /> <result property="teacherName" column="TEACHER_NAME" /> <result property="teacherSex" column="TEACHER_SEX" /> <result property="teacherBirthday" column="TEACHER_BIRTHDAY"/> <result property="workDate" column="WORK_DATE"/> <result property="professional" column="PROFESSIONAL"/> </resultMap> <select id="getTeacher" parameterType="String" resultMap="teacherResultMap"> SELECT * FROM TEACHER_TBL TT WHERE TT.TEACHER_ID = #{teacherID} </select>
使用resultMap实现联合
与上面同样的功能,查询班级,同时查询器班主任。需在association中添加resultMap(在teacher的xml文件中定义好的),新写sql(查询班级表left join教师表),不需要teacher的select。
修改ClassMapper.xml文件部分内容:
<resultMap type="ClassEntity" id="classResultMap"> <id property="classID" column="CLASS_ID" /> <result property="className" column="CLASS_NAME" /> <result property="classYear" column="CLASS_YEAR" /> <association property="teacherEntity" column="TEACHER_ID" resultMap="teacherResultMap"/> </resultMap> <select id="getClassAndTeacher" parameterType="String" resultMap="classResultMap"> SELECT * FROM CLASS_TBL CT LEFT JOIN TEACHER_TBL TT ON CT.TEACHER_ID = TT.TEACHER_ID WHERE CT.CLASS_ID = #{classID}; </select>
其中的teacherResultMap请见上面TeacherMapper.xml文件部分内容中。
collection聚集
聚集元素用来处理“一对多”的关系。需要指定映射的Java实体类的属性,属性的javaType(一般为ArrayList);列表中对象的类型ofType(Java实体类);对应的数据库表的列名称;
不同情况需要告诉MyBatis 如何加载一个聚集。MyBatis 可以用两种方式加载:
1. select: 执行一个其它映射的SQL 语句返回一个Java实体类型。较灵活;
2. resultsMap: 使用一个嵌套的结果映射来处理通过join查询结果集,映射成Java实体类型。
例如,一个班级有多个学生。
首先定义班级中的学生列表属性:
private List<StudentEntity> studentList;
使用select实现聚集
用法和联合很类似,区别在于,这是一对多,所以一般映射过来的都是列表。所以这里需要定义javaType为ArrayList,还需要定义列表中对象的类型ofType,以及必须设置的select的语句名称(需要注意的是,这里的查询student的select语句条件必须是外键classID)。
ClassMapper.xml文件部分内容:
<resultMap type="ClassEntity" id="classResultMap"> <id property="classID" column="CLASS_ID" /> <result property="className" column="CLASS_NAME" /> <result property="classYear" column="CLASS_YEAR" /> <association property="teacherEntity" column="TEACHER_ID" select="getTeacher"/> <collection property="studentList" column="CLASS_ID" javaType="ArrayList" ofType="StudentEntity" select="getStudentByClassID"/> </resultMap> <select id="getClassByID" parameterType="String" resultMap="classResultMap"> SELECT * FROM CLASS_TBL CT WHERE CT.CLASS_ID = #{classID}; </select>
StudentMapper.xml文件部分内容:
<!-- java属性,数据库表字段之间的映射定义 --> <resultMap type="StudentEntity" id="studentResultMap"> <id property="studentID" column="STUDENT_ID" /> <result property="studentName" column="STUDENT_NAME" /> <result property="studentSex" column="STUDENT_SEX" /> <result property="studentBirthday" column="STUDENT_BIRTHDAY" /> </resultMap> <!-- 查询学生list,根据班级id --> <select id="getStudentByClassID" parameterType="String" resultMap="studentResultMap"> <include refid="selectStudentAll" /> WHERE STCLASS_ID = #{classID} </select>
使用resultMap实现聚集
使用resultMap,就需要重写一个sql,left join学生表。
<resultMap type="ClassEntity" id="classResultMap"> <id property="classID" column="CLASS_ID" /> <result property="className" column="CLASS_NAME" /> <result property="classYear" column="CLASS_YEAR" /> <association property="teacherEntity" column="TEACHER_ID" resultMap="teacherResultMap"/> <collection property="studentList" column="CLASS_ID" javaType="ArrayList" ofType="StudentEntity" resultMap="studentResultMap"/> </resultMap> <select id="getClassAndTeacherStudent" parameterType="String" resultMap="classResultMap"> SELECT * FROM CLASS_TBL CT LEFT JOIN STUDENT_TBL ST ON CT.CLASS_ID = ST.CLASS_ID LEFT JOIN TEACHER_TBL TT ON CT.TEACHER_ID = TT.TEACHER_ID WHERE CT.CLASS_ID = #{classID}; </select>
其中的teacherResultMap请见上面TeacherMapper.xml文件部分内容中。studentResultMap请见上面StudentMapper.xml文件部分内容中。
discriminator鉴别器
有时一个单独的数据库查询也许返回很多不同(但是希望有些关联)数据类型的结果集。鉴别器元素就是被设计来处理这个情况的,还有包括类的继承层次结构。鉴别器非常容易理解,因为它的表现很像Java语言中的switch语句。
定义鉴别器指定了column和javaType属性。列是MyBatis查找比较值的地方。JavaType是需要被用来保证等价测试的合适类型(尽管字符串在很多情形下都会有用)。
下面这个例子为,当classId为20000001时,才映射classId属性。
<resultMap type="bjpowernodestudentmanagerdatamodelStudentEntity" id="resultMap_studentEntity_discriminator"> <id property="studentId" column="STUDENT_ID" javaType="String" jdbcType="VARCHAR"/> <result property="studentName" column="STUDENT_NAME" javaType="String" jdbcType="VARCHAR"/> <result property="studentSex" column="STUDENT_SEX" javaType="int" jdbcType="INTEGER"/> <result property="studentBirthday" column="STUDENT_BIRTHDAY" javaType="Date" jdbcType="DATE"/> <result property="studentPhoto" column="STUDENT_PHOTO" javaType="byte[]" jdbcType="BLOB" typeHandler="orgapacheibatistypeBlobTypeHandler" /> <result property="placeId" column="PLACE_ID" javaType="String" jdbcType="VARCHAR"/> <discriminator column="CLASS_ID" javaType="String" jdbcType="VARCHAR"> <case value="20000001" resultType="bjpowernodestudentmanagerdatamodelStudentEntity" > <result property="classId" column="CLASS_ID" javaType="String" jdbcType="VARCHAR"/> </case> </discriminator> </resultMap>
以上がmybatis チュートリアルの resultmap の詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。