1. 1対1の関連付け
1.1。要件を提案します
クラスIDに基づくクラス情報をクエリします(教師との情報)
1.2。テーブルとデータを作成します
教師テーブルとクラステーブルを作成します。ここでは、教師は1つのクラスのみを教える責任があると仮定しているため、教師とクラスの関係は1対1の関係です。
Table Teacher(T_ID INT Primary Key Auto_increment、T_Name varchar());テーブルクラスを作成する(c_id intプライマリキーAuto_increment、c_name varchar()、teacher_id int); TABLEクラスを変更する制約fk_teacher_id外部キー(teacher_id)参照教師(t_id); Teacher(T_NAME)Values( 'Teacher')に挿入します。 Teacher(T_NAME)Values( 'Teacher')に挿入します。 class(c_name、teacher_id)values( 'class_a'、)に挿入します。 class(c_name、teacher_id)values( 'class_b'、2)に挿入します。
テーブル間の関係は次のとおりです。
1.3。エンティティクラスを定義します
1。教師のクラス、教師クラスは、教師のテーブルに対応するエンティティクラスです。
me.gacl.domainをパッケージ化します。 /*** @author gacl*教師テーブルに対応するエンティティクラスを定義します*/パブリッククラスの教師{//エンティティクラスの属性を定義します。 // id ===> t_idプライベート文字列名; // name ===> t_name public int getid(){return id; } public void setid(int id){this.id = id; } public string getname(){return name; } public void setName(string name){this.name = name; } @Override public String toString(){return "tapery [id =" + id + "、name =" + name + "]"; }}2。クラスクラス、クラスクラスは、クラステーブルに対応するエンティティクラスです
me.gacl.domainをパッケージ化します。 /*** @author gacl*クラステーブルに対応するエンティティクラスを定義します*/publicクラスクラス{//エンティティクラスの属性を定義します。 // id ===> c_idプライベート文字列名; // name ===> c_name /** *クラステーブルには教師_IDフィールドがあります。したがって、クラスクラスで教師の属性が定義されます *は、教師とクラスの1対1の関係を維持するために使用されます。この教師の属性を通じて、このクラス*/私的な教師の教師にどの教師が責任を負うかを知ることができます。 public int getid(){return id; } public void setid(int id){this.id = id; } public string getname(){return name; } public void setName(string name){this.name = name; }公開教師getTeacher(){return teacher; } public void seteacher(教師教師){this.teacher = teacher; } @Override public String toString(){return "classes [id =" + id + "、name =" + name + "、taper =" + teacher + "]"; }} 1.4。 SQLマッピングファイルclassmapper.xmlを定義します
<?xmlバージョン= "。" encoding = "Utf-"?名前空間の値は、従来、パッケージ名 + SQLマッピングファイル名に設定されているため、名前空間の値が一意であることが保証されます。たとえば、namespace = "me.gacl.mapping.classmapper"はme.gacl.mapping(パッケージ名) + classmapper(classmapper.xmlファイルremoval suffix) - > <mapper namespace = "me.gacl.mapping.classmapper"> <!ジョイントテーブルクエリselect * from class c、from teacher t where c.teacher_id = t.t_idおよびc.c_id =; ##。 2つのクエリを実行しますselect * from class where c_id =; // Teacher_id = select * from teacher where t_id =; //上記で取得したTeacher_idを使用 - > <! - メソッド1:ネストされた結果:ネストされた結果マップを使用して重複した共同結果のサブセットを処理して、共同テーブルクエリのデータをカプセル化します(重複したデータを削除)select * select * select *、c.teacher_id = t.t_id = t.c_id = < parametertype = "int" resultmap = "classResultMap"> select * from class c、from teacher t where c.teacher_id = t.t_id =#{id} </selectmap </selectmapを使用して、エンティティクラスとフィールド間の1対1の対応をマッピングします - プロパティ= "id" column = "c_id"/> <result property = "name" column = "c_name"/> <associateプロパティ= "教師" javatype = "me.gacl.domain.teacher"> <idプロパティ= "id" column "column"/> <result property = "name" column = "t_name"別のSQLマッピングステートメントを実行することにより、c_id =; select * from teacher = //は前のクエリから取得されたtheerの値です。 type = "me.gacl.domain.classes" id = "classResultmap"> <id property = "id" column = "c_id"/> <result property = "name" column = "c_name"/> <associationプロパティ= "column" column = "feature_id" select = "getteacher"/>> </resultmap> resultType = "me.gacl.domain.teacher"> t_id =#{id} </select> </mapper>からt_id id、t_name名を選択しますconf.xmlファイルにclassmapper.xmlを登録します
<mappers> <! - classmapper.xmlファイルを登録します。 classmapper.xmlはパッケージMe.gacl.mappingにあるため、リソースはme/gacl/mapping/classmapper.xmlとして書かれています。
1.5。ユニットテストコードを記述します
me.gacl.testをパッケージ化します。 me.gacl.domain.classesをインポートします。 me.gacl.util.mybatisutilをインポートします。 Import org.apache.ibatis.session.sqlsession; Import org.junit.test; public class test {@test public void testgetclass(){sqlsession sqlsession = mybatisutil.getsqlsession(); /** *マップSQL識別文字列、 * me.gacl.mapping.classmapperは、classmapper.xmlファイルのマッパータグの名前空間属性の値です。実行されるSQLは、SelectタグのID属性値を介して見つけることができます */stringステートメント= "me.gacl.classmapper.getClass"; // SQLの識別文字列//クエリ操作をマッピングし、クエリ結果を自動的に実行し、クラスオブジェクトに自動的にカプセルし、クラスクラス= SQLSESTONE.SESSENTONE.SESSENTONE(STLSESTONE)を自動的にカップします。 sqlsession sqlsession.close()を使用してsqlを実行します。 System.out.println(clazz); // print result:classes [id =、name = class_a、teacher = teacher [id =、name = teacher]]} @test public void testgetclass(){sqlsession sqlsession = mybatisutil.getsqlsession(); /** *マップSQL識別文字列、 * me.gacl.mapping.classmapperは、classmapper.xmlファイルのマッパータグの名前空間属性の値です。実行されるSQLは、SelectタグのID属性値を介して見つけることができます */stringステートメント= "me.gacl.classmapper.getClass"; // SQLの識別文字列//クエリ操作を実行し、クエリ結果をクラスオブジェクトクラスに自動的にカプセル化し、クラスクラスclazz.sessions.sesessions.Selectoneを使用します(声明); sqlsession sqlを実行するには、sqlsession sqlsession.close()を閉じる必要があります。 System.out.println(clazz); // print result:classes [id =、name = class_a、teacher = teacher [id =、name = teacher]}}} 1.6。 MyBatisの概要One-One Associationクエリ
MyBatisは、Associationタグを使用して、1対1の関連付けクエリを解決します。協会のタグが利用できるプロパティは次のとおりです。
•プロパティ:オブジェクトプロパティの名前
•Javatype:オブジェクト属性のタイプ
•列:対応する外部キーフィールド名
•選択:別のクエリを使用して、結果をカプセル化します
2。1対多い協会
2.1。要件を提案します
学生や教師を含むClassIDによると、対応するクラス情報を照会する
2.2。テーブルとデータを作成します
上記の1対1の相関クエリデモンストレーションでは、クラステーブルと教師テーブルを作成しました。
テーブル学生(S_ID INTプライマリキーAuto_Increment、S_Name Varchar(20)、class_id int); inserting into intout student(student_a '、1); inserting into student(s_name、class_id)values(' student_b '、1); inserting intern sepuden VALUES( 'sudent_d'、2); inserting into Student(s_name、class_id)values( 'desutent_e'、2); inserting into interuste(s_name、class_id)values( 'sustent_f'、2);
2.3。エンティティクラスを定義します
1。学生クラス
me.gacl.domainをパッケージ化します。 /*** @author gacl*学生テーブルに対応するエンティティクラスを定義*/パブリッククラスの学生{//属性を定義します。 // id ===> s_idプライベート文字列名; // name ===> s_name public int getid(){return id; } public void setid(int id){this.id = id; } public string getname(){return name; } public void setName(string name){this.name = name; } @Override public String toString(){return "sudent [id =" + id + "、name =" + name + "]"; }} 2。クラスクラスを変更し、リスト<Student> Student属性を追加し、リスト<Student> Collection属性を使用して、次のようにクラスが所有する生徒を表現します。
me.gacl.domainをパッケージ化します。 java.util.listをインポートします。 /*** @author gacl*クラステーブルに対応するエンティティクラスを定義します*/publicクラスクラス{//エンティティクラスの属性を定義します。 // id ===> c_idプライベート文字列名; // name ===> c_name /** *クラステーブルには教師_IDフィールドがあります。したがって、クラスクラスで教師の属性が定義されます *は、教師とクラスの1対1の関係を維持するために使用されます。この教師の属性を通じて、このクラス*/私的な教師の教師にどの教師が責任を負うかを知ることができます。 //リスト<Student> Collection属性を使用して、クラスのプライベートリスト<Student>学生が所有する学生を表します。 public int getid(){return id; } public void setid(int id){this.id = id; } public string getname(){return name; } public void setName(string name){this.name = name; }公開教師getTeacher(){return teacher; } public void seteacher(教師教師){this.teacher = teacher; } public void seteacher(教師教師){this.teacher = teacher; } public list <Student> getStudents(){return Student; } public void setStudents(List <Student> Student){this.Students = sustent; } @Override public String toString(){return "classes [id =" + id + "、name =" + name + "、taper =" + teacher + "、生徒=" +生徒 + "]"; }} 2.4。 SQLマッピングファイルclassmapper.xmlを変更します
次のSQLマッピング情報を追加します
< resultMap = "classResultMap"> select * from class c、from teacher t、fort fort where where c.teacher_id = t.t_id and c.c_id = s.class_id and c.c_id =#{id} </selectmap type = "me.gacl.domain.classes" id = "colum =" columm列= "c_id"/> <resultプロパティ= "name" column = "c_name"/> <associationプロパティ= "column" column "column" column "choover_id" javatype = "me.gacl.domain.teacher"> <id property = "id" column = "t_id"/> <result property = "name" colummen <collection property = "desustor" oftype = "me.gacl.domain.student"> <id property = "id" column = "s_id"/> <result property = "name" column = "s_name"/> </collection> </resultmap> < select * from teacher = //前のクエリで取得されたTeacher_idの値select * from class_id = //は最初のクエリによって取得されたc_idフィールドの値です - > <select id = "getClass" parameterType = "int" int "resultmap =" classResultmap "> class = select * type = "me.gacl.domain.classes" id = "classResultmap"> <id property = "id" column = "c_id"/> <result property = "name" column = "c_name"/> <associationプロパティ= "column" column "column" column "column" oftype = "me.gacl.domain.student" column = "c_id" select = "getstudent"> </collectionmap> </resultmap> <select id = "getTeacher" parametertype = "int" resultType = "me.gacl.domain.teacher"> t_id id、t_id = </exect < id = "getStudent" parameterType = "int" resultType = "me.gacl.domain.student"> select s_id id、s_name name from student where class_id =#{id} </select> 2.5。ユニットテストコードを記述します
me.gacl.testをパッケージ化します。 me.gacl.domain.classesをインポートします。 me.gacl.util.mybatisutilをインポートします。 Import org.apache.ibatis.session.sqlsession; Import org.junit.test; public class test {@test public void testgetclass(){sqlsession sqlsession = mybatisutil.getsqlsession(); /** *マップSQL識別文字列、 * me.gacl.mapping.classmapperは、classmapper.xmlファイルのマッパータグの名前空間属性の値です。実行されるSQLは、SelectタグのID属性値を介して見つけることができます */stringステートメント= "me.gacl.classmapper.getClass"; // SQLの識別文字列//クエリ操作をマッピングし、クエリ結果を自動的に実行し、クラスオブジェクトに自動的にカプセルし、クラスクラス= SQLSESTONE.SESSENTONE.SESSENTONE(STLSESTONE)を自動的にカップします。 sqlsession sqlsession.close()を使用してsqlを実行します。 //結果を印刷:クラス[id =、name = class_a、teacher = teacher [id =、name = teacher]、生徒= [学生[id =、name = student_a]、sustent = student = student_b]、sustent [id =、name = student_c]]] system.out.println(clazz); } @test public void testgetclass(){sqlsession sqlsession = mybatisutil.getsqlsession(); /** *マップSQL識別文字列、 * me.gacl.mapping.classmapperは、classmapper.xmlファイルのマッパータグの名前空間属性の値です。実行されるSQLは、SelectタグのID属性値を介して見つけることができます */stringステートメント= "me.gacl.classmapper.getClass"; // SQLの識別文字列//クエリ操作をマッピングし、クエリ結果を自動的に実行し、クラスオブジェクトに自動的にカプセルし、クラスクラス= SQLSESTONE.SESSENTONE.SESSENTONE(STLSESTONE)を自動的にカップします。 sqlsession sqlsession.close()を使用してsqlを実行します。 //結果を印刷:クラス[id =、name = class_a、teacher = teacher [id =、name = teacher]、生徒= [学生[id =、name = student_a]、sustent = student = student_b]、sustent [id =、name = student_c]]] system.out.println(clazz); }} 2.6。 MyBatisの概要1対Many Associationクエリ
MyBatisはコレクションタグを使用して1対多アソシエーションクエリを解決し、OFTYPE属性はコレクション内のオブジェクトタイプの要素を指定します。
MyBatis Learningチュートリアル(V)について - Association Tableクエリの実装について多くのことを紹介します。それがあなたに役立つことを願っています!