注釈およびマルチテーブルのクエリを使用して、MyBatisのフレームワークのコアこのresultMap

数日前にも、我々が開発を簡素化するために注釈を使用できるようにXMLは、比較的トラブルインタフェースマッピングを使用して、伝統的なmapper.xml +インタフェースに比較してそのトラブル、突然実現し、ノートを指摘しています。
この記事を簡単に使い方を説明し、@の結果を、結果@、OneとこのresultMapコメントラベルとそのサブラベルの主な場所である@Many、@、Xueyibujingの利用を通じてCRUDいくつかの注意事項があるにも展示会を願っています

A、このr​​esultMapプロフィール

MyBatisのが基づいている「データベース構造が制御できない、」結果セットの設立のアイデアは、私たちのために、この理想と現実の変換の間手段のMyBatisのを提供するために、マッピングされ、そしてこのresultMapは、結果セットマッピングのラベルを設定することです。何も考えResultSetがありませんか?母とはMyBatisのは、ここで提示されていないものを、これらのステップの手書きを繰り返す必要はもはやありませんMyBatisの

1.resultMapプロフィール

ダイビングこのresultMapラベルの前に、我々はJavaBeanのか、POJOエンティティを処理するために、SQLクエリの結果からセットを理解する必要があります。

  1. 問い合わせによって得られたJDBC ResultSetオブジェクト

  2. ResultSetオブジェクト各行を横断し、一時的にHashMapのインスタンスにデータを格納するには、フィールド名またはフィールドエイリアス結果セットが結合であり、フィールドの値であります

  3. 反射ドメインモデルのインスタンスによってtype属性タグこのresultMap

  4. このresultMapタイプ属性とタグID、ドメイン・モデル・インスタンス戻るに充填キーと値のペアのHashMapのような結果タグ情報

2.シーンを使用してください

   在项目的实际开发中,有可能会遇到这样两种情况。
  1. 不整合ソリューションをパスワードとして、例えばPWD、エイリアスを使用することで属性名とフィールド名、その他の結果セットマッピングを使用することです

  2. マルチテーブルのクエリの戻り値が追加のオブジェクト、または配列(一から一と多くの1つ)を必要とするかもしれません

二.resultMap対応する注釈と使い方

まず、表の作成
エンティティのフィールドを

エンティティのフィールド 表の列名
シド stuid
脱げます stuname
ガイド ガイド
グレード グレード

結果注@ 1

代わりに、このresultMapにラベルを付けます

注釈は、注釈のコレクションは@Result使用できる単一@Resultを使用することができます

@Results({結果@()は、結果@()})或@Results(@Result())

:アノテーションを使用した場合は報告されているorg.apache.ibatis.binding.BindingException:無効バウンド声明(見つからない ):. インタフェースの完全なクラス名メソッド名

@Selectアノテーションは@Resultsを使用して注釈を付けることも使用することを忘れ

@Results({@Result(column="stuid",property="sid"),@Result(column="stuname",property="sname")})

@Select("select * from student where gid=#{0}")

public List<Student> queryStudentByGid();

2. @ノート結果

代わりに、IDタグやラベル、結果の

プロパティの説明に@Result:

データベースの列名列

プロパティは、アセンブリ属性名が必要です

あなたは(@Result(1 = @ワン)())を使用したい1 @Oneノート)

@Manyコメント(@Result(多くの= @多くの)()))の使用には多くの必要性

多くの使用状況や紹介1〜第2確かに見知らぬません。

@Oneノート(一から一)

代わりにassocationラベル、注釈クエリが返す単一のオブジェクトに子を指定するためのマルチテーブルクエリへの鍵です。

@One注釈プロパティの説明:

マルチテーブルクエリに指定されたsqlmapperを選択

グローバルコンフィギュレーションパラメータを上書きしfetchType lazyLoadingEnabled

LazyLoadingEnabledはあなたが必要とする場合にのみ、また、遅延ロードとして知られている、いわゆる遅延ロード、である、問い合わせフォーム

フォーマットを使用します:

@Result(列= "『プロパティ=』"、= @ワン1( "" =選択))

たとえば:すべての情報は、学生ながら、取得した情報のクラスに属する取得したいです

分野の学生のエンティティ

public class Student {

     private Integer sid;//学生id

     private String sname; //学生姓名

     private Integer gid; //班级id

     private Grade grade; //所属班级的所有信息

}

Fieldクラスの実体

import java.util.List;
public class Grade {

    private Integer id;//班级id

    private String gname;//班级名称

       public Grade() {

       super();

       // TODO Auto-generated constructor stub

    }
}

学生のフィールドでは、グレードクラスの実体がテーブルにない列をクラス、生徒を得るためには、テーブルを照会する必要があります(それは一対一の関係、@Resultの一つの特性と@Oneコメントへのマルチテーブルクエリを使用する必要が)

@Results({

@Result(column="stuid",property="sid"),

@Result(column="stuname",property="sname"),

@Result(column="gid",property="grade",one=@One(select="cn.et.fuqiang.resultMap.annotation.GradeAnnotationInterface.gradeInStudent"))})

   @Select("select * from student")

   public List<Student> queryAllStudent();

解像度:

テーブルには、フィールド内の異なるエンティティがあるので、我々はこれら2つのノート、テーブルの列とエンティティを使用しているため

@Result(カラム=「stuid」、プロパティ=「SID」)、

@Result(カラム=「stuname」、プロパティ=「SNAME」)、

そこクラスエンティティがエンティティプロパティであるが、表には、そのフィールドが含まれていないので、マルチテーブルクエリを使用する必要があります

@Result(列=「GID」、プロパティ=「グレード」、1 = @ワン()=「cn.et.fuqiang.resultMap.annotation.GradeAnnotationInterface.gradeInStudent」を選択)

(ここではプロパティは、エンティティのフィールドであり、関連付けられた列は= GID等価条件

この方法は、)クエリおよび対応する関連する条件を選択することです

cn.et.fuqiang.resultMap.annotation.GradeAnnotationInterface下のメソッドの名前空間=」

@Results(@Result(property="id",column="gid"))

@Select("select * from grade where gid=#{0}")

public Grade gradeInStudent();

(多くの)@Manyノート

       代替了Collection标签,是是多表查询的关键,在注解中用来指定子查询返回对象集合。

注:「多」の関係を処理するための要素を収集します。JavaTypeのJavaのマッピングエンティティクラス属性を指定する必要がある、プロパティ(通常のArrayList)が、注釈を定義できません。

フォーマットを使用します:

@Result(プロパティ= ""、列は= ""、多くの=は() "" =多くの選択します@)

同様のコードのようにクラスと生徒の関係によって達成することができます。

3. CRUD

あなたがたは、直接、一般的に使用されるコードを理解します

     @Insert({" insert into category_ ( name ) values (#{name}) "})
    int add(Category var1);

    @Delete({" delete from category_ where id= #{id} "})
    void delete(int var1);

    @Select({"select * from category_ where id= #{id} "})
    Category get(int var1);

    @Update({"update category_ set name=#{name} where id=#{id} "})
    int update(Category var1);
    @Select("select count(*) from category_")
    public int count();
public class TestMybatis {
   
    public static void main(String[] args) throws IOException {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession session = sqlSessionFactory.openSession();
        CategoryMapper mapper = session.getMapper(CategoryMapper.class);
  
//        add(mapper);
//        delete(mapper);
//        get(mapper);
//        update(mapper);
        listAll(mapper);
              
        session.commit();
        session.close();
   
    }
  
    private static void update(CategoryMapper mapper) {
        Category c= mapper.get(8);
        c.setName("修改了的Category名稱");
        mapper.update(c);
        listAll(mapper);
    }
  
    private static void get(CategoryMapper mapper) {
        Category c= mapper.get(8);
        System.out.println(c.getName());
    }
  
    private static void delete(CategoryMapper mapper) {
        mapper.delete(2);
        listAll(mapper);
    }
  
    private static void add(CategoryMapper mapper) {
        Category c = new Category();
        c.setName("新增加的Category");
        mapper.add(c);
        listAll(mapper);
    }
   
    private static void listAll(CategoryMapper mapper) {
        List<Category> cs = mapper.list();
        for (Category c : cs) {
            System.out.println(c.getName());
        }
    }
}

ちょうどに書き込まれたSQL文の上からとXMLマッピング方法の異なります

公開された20元の記事 ウォンの賞賛0 ビュー286

おすすめ

転載: blog.csdn.net/Vince_Wang1/article/details/104067485