5.2 Java EE - アノテーションベースの関連付けクエリ

1. 1対1のクエリ

        次に、セクション 4.2 で使用した tb_idcard および tb_person データ テーブルを例として、@One アノテーションに基づく実装を詳細に説明します。

tb_idcard データ テーブルと tb_person データ テーブル間の 1 対 1 の関連付けクエリの場合、具体的な手順は次のとおりです。

1. 永続クラスを作成します。この例では、セクション 4.2 の IdCard クラスと Person クラスを永続クラスとして使用します。

2. インターフェイス メソッドを作成します。

        (1) IdCardMapper インターフェースを作成し、このインターフェース内に selectIdCardById() メソッドを記述し、id を通じて個人に対応する ID カード情報を照会します。

package com.mac.dao;

import com.mac.pojo.IdCard;

import org.apache.ibatis.annotations.Select;

public interface IdCardMapper {

    @Select("select * from tb_idcard where id=#{id}")

    IdCard selectIdCardById(int id);

}

3. インターフェイス メソッドを作成します。

        (2) プロジェクトの com.mac.dao パッケージ配下に PersonMapper インターフェースを作成し、このインターフェース内に selectPersonById() を記述し、ID で人事情報をクエリします。

package com.mac.dao;

public interface PersonMapper {

    @Select("select * from tb_person where id=#{id}")

    @Results({@Result(column = "card_id",property = "card",

            one = @One(select =   "com.mac.dao.IdCardMapper.selectIdCardById"))})

    Person selectPersonById(int id);

}

@Result アノテーションの 3 つの属性と意味

        (1) property 属性は、関連する属性を指定するために使用されます。ここではカードです。

        (2) 列属性は、関連するデータベース テーブルのフィールドを指定するために使用されます。ここでは、card_id です。

        (3) one 属性はデータテーブル間の関係を指定するために使用され、@One アノテーションはデータテーブル tb_idcard と tb_person の間に 1 対 1 の関係があることを示します。

4. インポートインターフェイス:

        コア構成ファイル mybatis-config.xml の <mappers> 要素の下に IdCardMapper インターフェイスと PersonMapper インターフェイスを導入します。

<mapper class="com.mac.dao.IdCardMapper"/>

<mapper class="com.mac.dao.PersonMapper"/>

<mappers> 要素は XML ファイルの順序を導入します。

        mybatis-config.xml ファイルのスキャン方法は上から下にあるため、<mappers> 要素の下に IdCardMapper および PersonMapper インターフェイスが導入される位置は、IdCardMapper.xml および PersonMapper.xml ファイルがインポートされる位置より前である必要があります。そうでない場合、プログラムはインポートされた IdCardMapper.xml および PersonMapper.xml ファイルを最初に読み取り、プログラムはエラーを報告します。 

        テスト クラスを作成します。テスト クラス MyBatisTest に、テスト メソッド selectpersonByIdTest() を作成します。

public void selectPersonByIdTest() {

    // 1.通过工具类生成SqlSession对象

    SqlSession session = MyBatisUtils.getSession();

    PersonMapper mapper = session.getMapper(PersonMapper.class);

    // 2.查询id为1的人员的信息

    Person person = mapper.selectPersonById(2);

    System.out.println(person.toString());

    session.close(); // 3.关闭SqlSession 

}

2. 1対多のクエリ

        次に、セクション 4.3 の tb_user および tb_orders データ テーブルを例として、@Many アノテーションに基づく構成の実装を詳細に説明します。

tb_user データ テーブルと tb_orders データ テーブルの間の 1 対多の関連付けクエリの場合、具体的な手順は次のとおりです。

1. 永続クラスの作成:この例では、セクション 4.3 の Users クラスと Orders クラスを永続クラスとして使用します。

2. インターフェイス メソッドを作成します。

        (1) OrdersMapper インターフェースを作成し、このインターフェースに selectOrdersByUserId() メソッドを記述し、user_id を通じてユーザーに対応する注文情報をクエリします。

public interface OrdersMapper {

    @Select("select * from tb_orders where user_id=#{id} ")

    @Results({@Result(id = true,column = "id",property = "id"),

            @Result(column = "number",property = "number") })

    List<Orders> selectOrdersByUserId(int user_id);

}

3. インターフェイス メソッドを作成します。

        (2) UsersMapper インターフェイスを作成し、このインターフェイスに selectUserById() メソッドを記述し、ID でユーザー情報をクエリします。

public interface UsersMapper {

    @Select("select * from tb_user where id=#{id} ")

    @Results({@Result(id = true,column = "id",property = "id"),

            @Result(column = "username",property = "username"),

            @Result(column = "address",property = "address"),

            @Result(column = "id",property = "ordersList",

                     many = @Many(select =   "com.mac.dao.OrdersMapper.selectOrdersByUserId"))})

    Users selectUserById(int id);

}

4. インポートインターフェイス:

        コア構成ファイル mybatis-config.xml の <mappers> 要素の下に UsersMapper インターフェイスと OrdersMapper インターフェイスを導入します。 

<mapper class="com.mac.dao.UsersMapper"/>

<mapper class="com.mac.dao.OrdersMapper"/>

<mappers> 要素は XML ファイルの順序を導入します。

        mybatis-config.xml ファイルのスキャン方法は上から下にあるため、<mappers> 要素の下に UsersMapper および OrdersMapper インターフェイスを導入する位置は、UsersMapper.xml および OrdersMapper.xml ファイルの場所より前である必要があります。そうでない場合、プログラムはインポートされた UsersMapper.xml および OrdersMapper.xml ファイルを最初に読み取り、プログラムはエラーを報告します。 

        テスト クラスを作成します。テスト クラス MyBatisTest に、テスト メソッド selectUserByIdTest() を作成します。

public void selectUserByIdTest() {

    // 1.通过工具类生成SqlSession对象

    SqlSession session = MyBatisUtils.getSession();

    UsersMapper mapper = session.getMapper(UsersMapper.class);

    // 2.查询id为1的人的信息

    Users users = mapper.selectUserById(1);

    System.out.println(users.toString());

   session.close();

}

3. 多対多のクエリ

多対多の関連付けでは中間テーブルを使用します

        データベースでは、テーブル間の多対多の関係は、通常、中間テーブルによって維持されます。セクション 4.4 で使用した注文テーブル tb_orders と製品テーブル tb_product を例にとります。これら 2 つのテーブル間の関係は、中間テーブル tb_ordersitem によって維持されます。ers と製品テーブル tb_product は、2 つの 1 対多の関係に分割されます。

次に、4.4 節で使用した注文テーブル tb_orders、積テーブル tb_product、中間テーブル tb_ordersitem を例に、多対多関連クエリについて詳しく説明します。

1.製品コレクションの属性と、対応する getter/setter メソッドを注文永続クラス (Orders.java) に追加し、Orders クラスと Product クラスの toString() メソッドを変更します。

@Override

public String toString() {return "Orders{" +

      "id=" + id + ", number=" + number + ", productList=" + productList + '}’;}

@Override

public String toString() {return "Product{" +

      "id=" + id + ", name=" + name +", price=" + price + '}';

}

2. (1) ProductMapper インターフェイスを作成し、このインターフェイスに selectProductByOrdersId() メソッドを記述し、user_id を通じてユーザーに対応する注文情報をクエリします。

public interface ProductMapper {

    @Select("select * from tb_product where id in

 (select product_id from tb_ordersitem where orders_id = #{id} )")

    List<Product> selectProductByOrdersId(int orders_id);

}

(2) selectOrdersById() メソッドを OrdersMapper インターフェイスに追加します。このメソッドは、ID による注文情報のクエリに使用されます。

@Select("select * from tb_orders where id=#{id} ")

    @Results({@Result(id = true,column = "id",property = "id"),

            @Result(column = "number",property = "number"),

            @Result(column = "id",property = "productList",many = @Many(select = "com.mac.dao.ProductMapper.selectProductByOrdersId"))})

    Orders selectOrdersById(int id);

3. コア構成ファイル mybatis-config.xml の <mappers> 要素の下に ProductMapper インターフェイスと OrdersMapper インターフェイスを導入し、これら 2 つのインターフェイスをコア構成ファイルにロードします。

<mapper class="com.mac.dao.ProductMapper"/>   

<mapper class="com.mac.dao.OrdersMapper "/>

<mappers> 要素が XML ファイルに導入される順序

        注: mybatis-config.xml ファイルのスキャン方法は上から下にあるため、<mappers> 要素の下に ProductMapper および OrdersMapper インターフェイスを導入する位置は、ProductMapper.xml および OrdersMapper.xml ファイルの位置より前である必要があります。そうでない場合、プログラムはインポートされた ProductMapper.xml および OrdersMapper.xml ファイルを最初に読み取り、プログラムはエラーを報告します。

テスト クラス MyBatisTest に、ID が 3 の注文の情報をクエリするテスト メソッド selectOrdersByIdTest() を記述します。

public void selectOrdersByIdTest() {

    // 1.通过工具类生成SqlSession对象

    SqlSession session = MyBatisUtils.getSession();

    OrdersMapper mapper = session.getMapper(OrdersMapper.class);

    // 2.查询id为3的订单的信息

    Orders orders = mapper.selectOrdersById(3);

    System.out.println(orders.toString());

    session.close();

}

おすすめ

転載: blog.csdn.net/W_Fe5/article/details/131631666