クエリに一致するMyBatisのは、インターフェイスXMLを結合し、フィールド属性関連テーブル

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、#{説明})
 </インサート>

 

おすすめ

転載: www.cnblogs.com/BoxMonster/p/11443062.html