xmlファイルを結合1.インタフェース(表関連注釈に対しても便利な方法)
2.エンティティクラスのフィールド属性は、プロセスと一致しません
3.連合テーブルのクエリ
まず、インタフェースバインディングxmlファイル
config.xmlに、マッピングmappperパッケージ、プロパティファイルを格納するためのリソースフォルダの名前1.右エンジニアリング勧告ソースフォルダファイル
(ファイルの内容は、フォルダのbinファイルにコンパイルされます後)
内蔵インターフェース2. DAOパッケージ
マッピング・ファイル<マッパー>下1. タグの名前空間が一致する属性とパケットインタフェース ==>インターフェイスに対応する同じメソッド名2.操作IDタグインタフェースの実装クラスとして パブリック インターフェースRoleDao { 公共 ボイドaddRole(ロールロール); 公共の一覧<役割> selectById(@Param( "分")のint分、のParam @( "最大")int型の最大値); } // @paramアノテーションの名前付きパラメータ、デフォルトは[0、1、PARAM1、PARAM2 ] 補足5参照 <xmlのバージョン= "1.0"エンコード= "UTF-8"?> <DOCTYPEマッパーPUBLICを! " - // mybatis.org//DTDマッパー3.0 // EN" 「http://mybatis.org /dtd/mybatis-3-mapper.dtd "> <マッパー名前空間=" com.zhiyou100.yj.dao.OrderDao「> <ID = "addRole"のParameterType = "com.zhiyou100.yj.bean.Role"を挿入> 役割(のuname、説明)の値(#{}のuname、#{説明})に挿入 </挿入> <SELECT ID = "selectById" resultTypeと= "com.zhiyou100.yj.bean.Role"> セレクト *役割ここからID>#{分}とID&LT; = #{最大}。 </ select>の </マッパー>
3.テスト
クラスRoleMapperTest { 静的 SQLSESSIONセッション= NULL ; 静的 RoleDao roleDao = nullを。 @BeforeAll 静的 ボイド setUpBeforeClass()スロー例外{ リーダーリーダー = Resources.getResourceAsReader( "のconfig.xml" ); SqlSessionFactoryのSessionFactory = 新しいSqlSessionFactoryBuilder()(リーダー)を構築。 セッション = SessionFactory.openSession()。 roleDao = session.getMapper(RoleDao。クラス)。 } @Test ボイドtestAddRole(){ 役割役割 = 新しい役割( "李大炳"、 "助理" )。 roleDao.addRole(役割)。 } @Test ボイドtestSelectById(){ リストの<role>役割= roleDao.selectById(3、4 )。 System.out.println(ロール); } @AfterAll 静的 ボイド tearDownAfterClass()スロー例外{ session.commitを(); } }
補足:どのようにパラメータを渡すためのインタフェースXMLバインディング
直接転送の参加者は、次の例外を報告しました: エラーがデータベースを照会。 原因:org.apache.ibatis.binding.BindingException:パラメータを。「は、uname」使用可能なパラメータである見つかりません[0 ,. 1 PARAM1、PARAM2] これがデフォルトパラメータのmabatisためでありますマップへのパッケージは、それが二つの形式で重要である[ 0、1 、PARAM1、PARAM2] 3つの方法がこの問題を解決することがあります: 1 、デフォルトのパラメータMyBatisの[arg0は、argX、PARAM1、paramXにパラメータ ](X ;パラメータの数)に対応する 2 カプセル化パラメータとしてのJavaBeanとのJavaBeanへのインタフェースパラメータ; 3 、方法マップパラメータ渡し、 4、@Param注釈インタフェースパラメータ(推奨)
第二に、エンティティクラスのフィールド名と属性が一致していません
パブリック クラス役割{ プライベート int型のID、 プライベート文字列のuname; プライベート文字列説明; } <更新ID = "updateRole"> 更新ロールSETのrole_uname =#{のuname}、role_description =#{説明} WHERE ROLE_ID = #{ID} </更新は> 心の性質と一致しないエラー:(結果はヌル)クエリとして表示され org.apache.ibatis.binding.BindingException: タイプのインタフェースをcom.zhiyou100.yj.dao.RoleDaoがする既知のMapperRegistryではありません。 1:フィールドのためのエンティティクラスの属性と一致するエイリアス <選択のid = "selectById"のParameterType = "int型" resultTypeと= "com.zhiyou100.yj.bean.Role">を ROLE_ID WHEREロールからrole_uname名、role_description説明、ROLE_ID IDを選択 = #{ID} </ SELECT> このresultMap属性置換resultTypeと特性、およびライトフィールド属性制御関係このresultMap:方法IIが <SELECT ID = "selectById"のParameterType "=をINT "このresultMap ="ロールマップ"> SELECT役割から* ROLE_ID = #{ID} </> SELECT <このresultMapタイプは=" com.zhiyou100.yj.bean.Role "ID ="ロールマップ「> < -タイプ!:示しエンティティクラス、類似の戻り型の対応表- > <ID =列「ROLE_ID」=プロパティ「ID」/> <結果列=「role_description」プロパティ=「説明」/> <結果列=「role_uname "プロパティ="名前「/> </このresultMap>
第三に、米国・テーブルのクエリ
(他の当事者の財産として、クエリの結果、カプセル化オブジェクト)つのクエリ;多対クエリ1、 // 各クラスに対応するクラスとして 2として設定多くのクエリ(複数の構成の一つクエリ結果セットをパッケージ化する性質) // 学生の複数備え、各クラスとして 1 多対クエリを、クエリ1つの パブリック クラスClazz { プライベート int型のCID; プライベート文字列CNAME、 プライベート INT teacheId、 プライベート教師教師。 // 関連するターゲット教師 プライベートリスト<学生>学生; // 学生オブジェクトセットに関連付けられている } 公共の クラスの先生{ プライベート int型ID; プライベート文字列TNAME。 } パブリック クラスの学生{ プライベート int型 のSID。 プライベート文字列SNAME。 プライベート int型CLASSID。 } <! -一对一联表- > <ID = "selectClazzById"このresultMap = "ClazzMap"を選択> 選択 *からクラス C、教師T c.teacher_id = t.t_idとC_ID = #{ID} <選択/> <このresultMapタイプ= "com.zhiyou100.yj.bean.Clazz" ID = "ClazzMap"> <id列= "C_ID"プロパティ= "CID" /> <結果カラム= "c_name"プロパティ= "CNAME" /> <結果カラム= "teacher_id" <協会プロパティ= "先生"のJavaType = "com.zhiyou100.yj.bean.Teacher"> <ID =列"t_id" =プロパティ"ID" /> <結果列= "t_name"プロパティ= "TNAME" /> < /協会> </このresultMap> <! -ネストされた1 - > <SELECT ID = "selectClazzById2は"このresultMap = "ClazzMap2"> SELECT *からクラス C_IDのCID =#{} <! -クエリのクラスIDクエリ結果のクラスIDに基づいて、更なるクエリが得られる- > </ SELECT> <このresultMapタイプ= "com.zhiyou100.yj.bean.Clazz" ID = "ClazzMap2"> <id列= "C_ID"プロパティ=「CID "/> <結果列=" c_name "=プロパティ"CNAME "/> <結果列=" teacher_id "プロパティ=" teacheId「/> <! - を選択:さらにクエリIDに対応する(別の照会表) プロパティ:教師对象属性 JavaType:教師オブジェクトタイプ コラム:さらにクエリに対応する条件フィールド(外部キーフィールド) 選択/> <このresultMapタイプ= "com.zhiyou100.yj.bean.Teacher" ID = "TeacherMap"> - > <協会プロパティ=「先生」のJavaType =「com.zhiyou100.yj.bean.Teacher」SELECT =「selectTeacher」欄=「teacher_id」> </協会> </このresultMap> < - :!属性フィールドが一致しない、別名書く- > <SELECT ID = "selectTeacher" resultTypeと= "com.zhiyou100.yj.bean.Teacherを"> SELECT IDのt_id、TNAMEからt_name t_id教師 = #{} teacher_id </ SELECT> < -書き込みII :!属性フィールドが一致しない、このresultMap - > <SELECT ID = "selectTeacher"このresultMap = "TeacherMap"> SELECT * WHERE教師t_idから= #{ } teacher_id </ SELECT>id列= "t_id"プロパティ= "ID" /> <結果カラム= "t_name"プロパティ= "TNAME" /> <ID列= "t_id"プロパティ= "ID" /> </このresultMap> <! -一对多联表- > <ID = "selectClazzById3"このresultMap = "ClazzMap3"を選択> 選択 *からクラス C、学生S、c.c_id = s.class_idとt.t_id = c.teacher_id教師tおよびc.c_id = #{ID}。 </選択> <このresultMapタイプ= "com.zhiyou100.yj.bean.Clazz" ID = "ClazzMap3"> <id列= "C_ID"プロパティ= "CID" /> <結果カラム= "c_name"プロパティ= "CNAME "/> <結果カラム=" teacher_id "プロパティ= "teacheId"/> <関連プロパティ= "教師"のJavaType =" COM。 <結果列= "t_name"プロパティ= "TNAME" /> <結果カラム= "c_name"プロパティ= "CNAME" /> <コレクションプロパティ= "学生" ofType = "com.zhiyou100.yj.bean.Student"> <! -集合类型:学生; ofType:集合泛型的数据类型- > <id列は= "S_ID"プロパティ= "SID" /> <結果列= "s_name"プロパティ= "SNAME" /> <結果列= "CLASS_ID"プロパティ= "CLASSID" /> </コレクション> </このresultMap> <! -一对多嵌套- > <選択ID = "selectClazz4"このresultMap = "ClazzMap4"> セレクト *からクラス C_ID = #{CID} </選択> <このresultMapタイプ= "com.zhiyou100.yj.bean.Clazz" ID = "ClazzMap4 「> <id列= "C_ID"プロパティ= "CID" /> <結果カラム= "teacher_id"プロパティ= "teacheId" /> <関連付けプロパティ= "先生"のJavaType = "com.zhiyou100.yj.bean.Teacher"を選択= "selectTeacher"欄= "teacher_id"> </関連> <コレクションプロパティ= "学生" ofType = "com.zhiyou100.yj .bean.Student selectStudent "欄= "C_ID">」=選択" </コレクション> </このresultMap> <SELECT ID = "selectTeacher" resultTypeと= "com.zhiyou100.yj.bean.Teacher"> t_id IDを選択し、t_nameをt_id教師からTNAME = #{teacher_id} </選択> <SELECT ID = "selectStudent" resultTypeと= "com.zhiyou100.yj.bean.Student"> 選択S_ID SID、s_name SNAME、CLASS_ID学生からCLASS_ID CLASSID = #{C_ID} </選択>
補足2:$と#の間の差でMyBatisの
$:「」コンテンツの解析に追加しませんスプライシングされたSQLステートメント、SQLインジェクションの危険が存在します 渡されたが、列名やテーブル名で、あなたは$を使用することができ EGを:値が何かの値である場合は「OR」X - '=何「または」X「=」X '「名前が= SELECT X、その後、SQL文は、ユーザからであろう*」 追加されたコンテンツを解析します。#プレースホルダを使用して、 『』、渡さ#{XXX} 「?」コンテンツがエスケープされ、その後、置き換えの内容 :SELECT EG WHERE名=「何か\」または\「X- \」= \「X-」から*学生を
3補足:生成する方法を返すには、オブジェクトIDを追加します
<ID = "addRole" useGeneratedKeys = "true"をkeyProperty = "ID"を挿入>
役割に挿入(のuname、説明)の値(#{}のuname、#{説明})
</インサート>