MyBatis で複数の SQL クエリを実行し、複数の結果セットを返す

複数の SQL クエリを実行し、複数の結果セットを返す必要があるのはなぜですか
? ビジネス シナリオでは、複数のテーブルからデータを取得し、それらを 1 つの Java オブジェクトに結合する必要がある場合があります。たとえば、users テーブルとorders テーブルからデータをフェッチし、それらを結合してユーザー注文オブジェクトを作成する必要がある場合があります。現時点では、複数の SQL クエリを実行して複数の結果セットを返すことで、このビジネス要件を簡単に満たすことができます。

さらに、複数の SQL クエリを 1 つのメソッドに結合すると、関連するすべてのクエリ ロジックをコード内の複数の場所に散在させるのではなく 1 か所に配置できるため、コードの可読性と保守性も向上します。同時に、データベースの対話を削減し、パフォーマンスを向上させることができます。結局のところ、IO は通常、最も時間がかかる場所の 1 つです (現在、これはマルチスレッドで実現できます)

MyBatis が複数の SQL クエリを実行し、複数の結果セットを返す
仕組み MyBatis は、複数の SQL クエリを実行し、複数の結果セットを返すなど、多くの便利な機能を提供する優れた ORM フレームワークです。

MyBatis では、select 要素の resultSets 属性を使用して、複数の SQL クエリを実行し、複数の結果セットを返すことができます。resultSets 属性は、各結果セットのデータを参照するために使用できる各結果セットの名前を指定します。

以下に例を示します。

<select id="getUserAndOrders" resultSets="user,orders">
  select * from user where id = #{
    
    id};
  select * from orders where user_id = #{
    
    id};
</select>

この例では、getUserAndOrders という select 要素を定義し、resultSets 属性を使用して 2 つの結果セット (user と order) の名前を指定します。select 要素には、user テーブルとorders テーブルのデータをそれぞれクエリするための 2 つの SQL クエリ ステートメントが含まれています。

次に、これら 2 つの結果セットを Java コードでフェッチする必要があります。MyBatis の SqlSession オブジェクトの selectList メソッドを使用してすべての結果セットを取得するか、selectMap メソッドを使用して指定された名前の結果セットを取得できます。以下に例を示します。

SqlSession sqlSession = sqlSessionFactory.openSession();
try {
    
    
  List<Object> resultList = sqlSession.selectList("getUserAndOrders", 1);
  Map<String, Object> resultMap = sqlSession.selectMap("getUserAndOrders", 1, "user");
  User user = (User) resultMap.get("user");
  List<Order> orders = (List<Order>) resultMap.get("orders");
} finally {
    
    
  sqlSession.close();
}

この例では、最初に SqlSession オブジェクトを作成し、その selectList メソッドと selectMap メソッドを呼び出して結果セットを取得しました。このうち、selectList メソッドはすべての結果セットのリストを返し、selectMap メソッドは指定された名前の結果セットを返します。

最後に、結果セットを Java オブジェクトに変換し、ビジネス処理を実行できます。

結果セット内のオブジェクトに一貫性がない場合は、
次のように設定をカスタマイズすることもできます。

<select id="getMultipleResults" resultMap="resultMap1,resultMap2">
  SELECT id AS user_id, name AS user_name FROM table1;
  SELECT id AS order_id, amount AS order_amount FROM table2;
</select>

<resultMap id="resultMap1" type="com.example.User">
  <result column="user_id" property="id"/>
  <result column="user_name" property="name"/>
</resultMap>

<resultMap id="resultMap2" type="com.example.Order">
  <result column="order_id" property="id"/>
  <result column="order_amount" property="amount"/>
</resultMap>
 List<Map<String, Object>> getMultipleResults();
List<Map<String, Object>> results = myMapper.getMultipleResults();
Map<String, Object> userResult = results.get(0);
Map<String, Object> orderResult = results.get(1);

まとめ
一部のビジネス シナリオでは、複数の SQL クエリを実行し、複数の結果セットを返す必要があります。MyBatis は、この要件を満たす便利な機能を提供します。これにより、IO 操作の数が削減され、クエリのパフォーマンスが向上し、コードの可読性と保守性が向上します。

おすすめ

転載: blog.csdn.net/weixin_43866043/article/details/130813936