まえがき
MyBatis は、「データベース構造は制御できない」という考えに基づいています。つまり、データベースが第 3 正規形または BCNF に従うことを望んでいますが、実際にはそれは私たちの希望に反しています。結果セット マッピングは MyBatis が提供する理想と現実です。これは変換の手段であり、resultMap は結果セット マッピングの構成ラベルです。
ResultMap タグの詳細に入る前に、SQL クエリの結果セットから JavaBean または POJO エンティティまでのプロセスを理解する必要があります。
SQLクエリ結果からドメインモデルエンティティへ
JDBCクエリを通じてResultSetオブジェクトを取得します
フィールド名またはフィールドエイリアスを使用して、ResultSetオブジェクトをトラバースし、データの各行をHashMapインスタンスに一時的に保存します結果セットのキーとして、フィールド値を値として使用します
ResultMap タグの type 属性に従ってリフレクションを通じてドメイン モデルをインスタンス化します
に従って HashMap にキーと値のペアを入力します
ResultMap タグの type 属性と、id や result などのタグ情報。 ドメイン モデル インスタンスに移動して、
1. resultMap
- 1. 属性の説明
id 属性、resultMap の識別子を返します。鬼ごっこ。
type 属性、戻り値の完全修飾クラス名、または型の別名。
resultMap
でマッピング関係を明確に指定する必要があります。
2. 基本機能: SQL クエリ結果フィールドとエンティティ属性の間のマッピング関係を確立する
- 例 1: セッターを使用してドメイン モデルを構築する
-
public class EStudent{ private long id; private String name; private int age; // getter,setter方法 /** * 必须提供一个无参数的构造函数 */ public EStudent(){} }
<select> SELECT ID, Name, Age FROM TStudent </select> <resultmap> <id></id> <result></result> <result></result> </resultmap>
サブ要素の説明:
id 要素主キーフィールドを設定します ドメインモデル属性とのマッピング関係
result 要素、通常のフィールドとドメインモデル属性の間のマッピング関係を設定するために使用されます
🎜🎜🎜id、結果ステートメントの属性設定の詳細: 🎜プロパティ | 説明 |
---|---|
プロパティ | JavaBeanにマップする必要があるプロパティ名。 |
column | データテーブルの列名またはラベルの別名。 |
javaType | 完全なクラス名、または型の別名。 JavaBean に一致する場合、通常、MyBatis はそれを独自に検出します。次に、HashMap にマッピングする場合は、javaType の目的を指定する必要があります。 |
jdbcType | データテーブルでサポートされている型のリスト。この属性は、挿入、更新、または削除中に NULL を許可する列にのみ役立ちます。 JDBC ではこれが必要ですが、MyBatis では必要ありません。 JDBC に対して直接コーディングしていて、NULL を許可する列がある場合は、これを指定する必要があります。 |
typeHandler | この属性を使用して、タイプ ハンドラーをオーバーライドします。この値には、完全なクラス名または型の別名を指定できます。 |
示例2:通过构造函数构造领域模型
<select> SELECT ID, Name, Age FROM TStudent</select><resultmap> <constructor> <idarg></idarg> <arg></arg> <arg></arg> </constructor></resultmap>
子元素说明:
constructor元素 ,指定使用指定参数列表的构造函数来实例化领域模型。注意:其子元素顺序必须与参数列表顺序对应
idArg子元素 ,标记该入参为主键
arg子元素 ,标记该入参为普通字段(主键使用该子元素设置也是可以的)
3、一对一关系、一对多关系查询
注意:在采用嵌套结果的方式查询一对一、一对多关系时,必须要通过resultMap下的id或result标签来显式设置属性/字段映射关系,否则在查询多条记录时会仅仅返回最后一条记录的情况。
association联合
联合元素用来处理“一对一”的关系。需要指定映射的Java实体类的属性,属性的javaType(通常MyBatis 自己会识别)。对应的数据库表的列名称。如果想覆写的话返回结果的值,需要指定typeHandler。
不同情况需要告诉MyBatis 如何加载一个联合。MyBatis 可以用两种方式加载:
select: 执行一个其它映射的SQL 语句返回一个Java实体类型。较灵活;
resultsMap: 使用一个嵌套的结果映射来处理通过join查询结果集,映射成Java实体类型。
例如,一个班级对应一个班主任。
首先定义好班级中的班主任 private TeacherEntity teacherEntity;
使用select实现联合
例:班级实体类中有班主任的属性,通过联合在得到一个班级实体时,同时映射出班主任实体。
这样可以直接复用在TeacherMapper.xml文件中定义好的查询teacher根据其ID的select语句。而且不需要修改写好的SQL语句,只需要直接修改resultMap即可。
ClassMapper.xml文件部分内容:
<resultmap> <id></id> <result></result> <result></result> <association></association> </resultmap> <select> SELECT * FROM CLASS_TBL CT WHERE CT.CLASS_ID = #{classID}; </select>
TeacherMapper.xml文件部分内容:
<resultmap> <id></id> <result></result> <result></result> <result></result> <result></result> <result></result> </resultmap> <select> SELECT * FROM TEACHER_TBL TT WHERE TT.TEACHER_ID = #{teacherID} </select>
使用resultMap实现联合
与上面同样的功能,查询班级,同时查询器班主任。需在association中添加resultMap(在teacher的xml文件中定义好的),新写sql(查询班级表left join教师表),不需要teacher的select。
修改ClassMapper.xml文件部分内容:
<resultmap> <id></id> <result></result> <result></result> <association></association> </resultmap> <select> 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;</studententity>
使用select实现聚集
用法和联合很类似,区别在于,这是一对多,所以一般映射过来的都是列表。所以这里需要定义javaType为ArrayList,还需要定义列表中对象的类型ofType,以及必须设置的select的语句名称(需要注意的是,这里的查询student的select语句条件必须是外键classID)。
ClassMapper.xml文件部分内容:
<resultmap> <id></id> <result></result> <result></result> <association></association> <collection></collection> </resultmap> <select> SELECT * FROM CLASS_TBL CT WHERE CT.CLASS_ID = #{classID}; </select>
StudentMapper.xml文件部分内容:
<!-- java属性,数据库表字段之间的映射定义 --> <resultmap> <id></id> <result></result> <result></result> <result></result> </resultmap> <!-- 查询学生list,根据班级id --> <select> <include></include> WHERE ST.CLASS_ID = #{classID} </select>
使用resultMap实现聚集
使用resultMap,就需要重写一个sql,left join学生表。
<resultmap> <id></id> <result></result> <result></result> <association></association> <collection></collection> </resultmap> <select> 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文件部分内容中。
4. 动态映射关系
通过 discriminator子元素 (鉴别器)可以实现动态映射关系信息的设置。具体示例如下:
public class EStudent{ private long id; private String name; private String juniorHighSchool; private String seniorHighSchool; private int during; // 在本校就读时间 // getter,setter方法 /** * 必须提供一个无参数的构造函数 */ public EStudent(){} }
情景:查询学生信息的seniorHighSchool信息,若就读时间during字段值为4、5、6时,则以juniorHighSchool字段作所为seniorHighSchool信息。
<select> SELECT ID, Name, JuniorHighSchool, SeniorHighSchool, during FROM TStudent</select><resultmap> // 若不加这句,则当将juniorHighSchool赋予给seniorHighSchool属性时,juniorHighSchool属性将为null <result></result> <discriminator> // 形式1:通过resultType设置动态映射信息 <case> <result></result> </case> // 形式2: 通过resultMap设置动态映射信息 <case></case> <case></case> </discriminator></resultmap><resultmap> <result></result></resultmap>
注意:上面关于 discriminator子元素 的 case元素 的 resultType属性 和 resultMap元素 的 type属性 ,均不是直指返回的领域模型类型,而是指定根据判断条件后得到映射关系,可通过 id子元素 和 result子元素 重写映射关系。
5. id元素,result元素,idArg元素,arg元素,discriminator元素的共同属性
javaType属性 :Java类的全限定名,或别名
jdbcType属性 :JDBC类型, JDBC类型为CUD操作时列可能为空时进行处理
typeHandler属性 :指定类型处理器的全限定类名或类型别名
column属性 :指定SQL查询结果的字段名或字段别名。将用于JDBC的 resultSet.getString(columnName)
この記事では、mybatis 属性の詳細な説明を説明しています。さらに関連する内容については、PHP 中国語 Web サイトを参照してください。
関連する推奨事項:
以上がmybatisの属性の詳しい説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

MySQLは、非同期、半同期、およびグループ複製の3つのモードを介してデータの複製を処理します。 1)非同期の複製パフォーマンスは高くなりますが、データが失われる可能性があります。 2)半同期複製により、データセキュリティが向上しますが、遅延が増加します。 3)グループレプリケーションは、高可用性要件に適したマルチマスターレプリケーションとフェールオーバーをサポートします。

説明ステートメントは、SQLクエリのパフォーマンスを分析および改善するために使用できます。 1.説明ステートメントを実行して、クエリプランを表示します。 2。出力結果を分析し、アクセスの種類、インデックスの使用量に注意し、順序を結合します。 3.分析結果に基づいてインデックスを作成または調整し、結合操作を最適化し、フルテーブルスキャンを回避してクエリ効率を向上させます。

論理バックアップにMySQLDUMPとホットバックアップにMySQLenterPriseBackupを使用することは、MySQLデータベースをバックアップする効果的な方法です。 1. mysqldumpを使用してデータベースをバックアップします:mysqldump-uroot-pmydatabase> mydatabase_backup.sql。 2。ホットバックアップにmysqlenterprisebackupを使用:mysqlbackup - user = root-password = password - backup-dir =/path/to/backupbackup。回復するときは、対応する寿命を使用します

MySQLのクエリが遅い主な理由には、インデックスの欠落または不適切な使用、クエリの複雑さ、過剰なデータボリューム、および不十分なハードウェアリソースが含まれます。最適化の提案には以下が含まれます。1。適切なインデックスを作成します。 2。クエリステートメントを最適化します。 3.テーブルパーティションテクノロジーを使用します。 4.適切にハードウェアをアップグレードします。

MySQLビューは、SQLクエリの結果に基づいた仮想テーブルであり、データを保存しません。 1)ビューは複雑なクエリを簡素化し、2)データセキュリティを強化し、3)データの一貫性を維持します。ビューは、テーブルのように使用できるデータベースにクエリを保存しますが、データは動的に生成されます。

MySQLdiffersfromotherSQLdialectsinsyntaxforLIMIT,auto-increment,stringcomparison,subqueries,andperformanceanalysis.1)MySQLusesLIMIT,whileSQLServerusesTOPandOracleusesROWNUM.2)MySQL'sAUTO_INCREMENTcontrastswithPostgreSQL'sSERIALandOracle'ssequenceandt

MySQLパーティション化により、パフォーマンスが向上し、メンテナンスが簡素化されます。 1)大きなテーブルを特定の基準(日付範囲など)、2)物理的に独立したファイルに物理的に分割する、3)MySQLはクエリするときに関連するパーティションに焦点を合わせることができます。

mysqlで許可を許可および取り消す方法は? 1。grantallprivilegesondatabase_name.to'username'@'host 'などの許可を付与するために付与ステートメントを使用してください。 2。Revokeallprivilegesondatabase_name.from'username'@'host 'など、Revoke Statementを使用して、許可のタイムリーな通信を確保します。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

MantisBT
Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

AtomエディタMac版ダウンロード
最も人気のあるオープンソースエディター

VSCode Windows 64 ビットのダウンロード
Microsoft によって発売された無料で強力な IDE エディター

メモ帳++7.3.1
使いやすく無料のコードエディター

EditPlus 中国語クラック版
サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

ホットトピック









