MyBatis マルチテーブル クエリを徹底的にマスター: データ処理効率を向上させるための実践ガイド
はじめに:
1. MyBatis 環境を構成する
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>1.3.2</version> </dependency>
<configuration> <environments default="development"> <environment id="development"> <transactionManager type="jdbc"/> <dataSource type="pooled"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> <mappers> <mapper resource="mapper/UserMapper.xml"/> </mappers> </configuration>
<mapper namespace="com.example.mapper.UserMapper"> <select id="getUserList" resultType="com.example.entity.User"> SELECT u.*, r.* FROM user u LEFT JOIN role r ON u.role_id = r.id </select> </mapper>
2. 複数テーブル クエリの一般的なシナリオ
1 対 1 のリレーションクエリ
1 対 1 のリレーションクエリが可能ネストされたクエリを使用することで実現します。 user と role という 2 つのテーブルがあり、各ユーザーが 1 つのロールだけを持っているとします。これは次のように実装できます:
<select id="getUserWithRole" resultMap="userWithRole"> SELECT u.*, r.* FROM user u LEFT JOIN role r ON u.role_id = r.id WHERE u.id = #{id} </select>次に、resultMap でマップします:
<resultMap id="userWithRole" type="com.example.entity.User"> <id property="id" column="id"/> <result property="username" column="username"/> ... <association property="role" column="role_id" select="com.example.mapper.RoleMapper.getRoleById"/> </resultMap>最後に、RoleMapper インターフェイスと roleMapper.xml を作成して、ロール クエリを実装します:
public interface RoleMapper { @Select("SELECT * FROM role WHERE id = #{id}") public Role getRoleById(@Param("id") int id); }このようにして、UserMapper.getUserWithRole を通じてユーザーとその対応するロール情報をクエリできます。
1 対多の関係クエリ
1 対多の関係クエリは、セットを使用して実装できます。 user と order という 2 つのテーブルがあるとします。ユーザーは複数の注文を持つことができ、次のように実装できます:
<select id="getUserWithOrders" resultMap="userWithOrders"> SELECT u.*, o.* FROM user u LEFT JOIN orders o ON u.id = o.user_id WHERE u.id = #{id} </select>次に、それを resultMap にマップします:
<resultMap id="userWithOrders" type="com.example.entity.User"> <id property="id" column="id"/> <result property="username" column="username"/> ... <collection property="orders" ofType="com.example.entity.Order"> <id property="id" column="order_id"/> <result property="orderName" column="order_name"/> ... </collection> </resultMap>最後に、OrderMapper インターフェイスと OrderMapper.xml を作成して、注文クエリを実装します。
public interface OrderMapper { @Select("SELECT * FROM orders WHERE user_id = #{id}") public List<Order> getOrderByUserId(@Param("id") int id); }このようにして、 UserMapper.getUserWithOrders を通じてユーザーとそれに対応する注文情報をクエリできます。
多対多のリレーションシップ クエリ
多対多のリレーションシップ クエリは、ネストされたクエリとコレクションを使用して実装できます。 user、role、user_role という 3 つのテーブルがあるとします。ユーザーは複数のロールを持つことができ、ロールは複数のユーザーを持つこともできます。これは次のように実装できます:
<select id="getUserWithRoles" resultMap="userWithRoles"> SELECT u.*, r.* FROM user u LEFT JOIN user_role ur ON u.id = ur.user_id LEFT JOIN role r ON ur.role_id = r.id WHERE u.id = #{id} </select>次に、resultMap にマップします:
<resultMap id="userWithRoles" type="com.example.entity.User"> <id property="id" column="id"/> <result property="username" column="username"/> ... <collection property="roles" ofType="com.example.entity.Role"> <id property="id" column="role_id"/> <result property="roleName" column="role_name"/> ... </collection> </resultMap>最後に、UserRoleMapper インターフェイスと UserRoleMapper.xml を作成して、ユーザー ロール関係をクエリします:
public interface UserRoleMapper { @Select("SELECT * FROM user_role WHERE user_id = #{id}") public List<UserRole> getUserRoleByUserId(@Param("id") int id); }このようにして、次のように渡すことができます。 UserMapper.getUserWithRoles は、ユーザーおよび対応するロール情報をクエリするために使用されます。
結論:
以上がMyBatis マルチテーブル クエリをマスターする: データ処理効率を最適化するための実践的なガイドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。