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();
}