注釈を使用した追加、削除、変更、および 1 対 1 の複数テーブルの結合クエリを備えた完全な動的 SQL

前提条件
この記事を要約するには、基本的な SQL ステートメント (私は MySQL を使用しています) と JDBC の基本的な実装を理解していることが前提となります。これに基づいて、いくつかのタグまたはアノテーションを使用して、1 対 1 および 1 対多の関係に基づいてデータベースに複数テーブルの結合クエリを実装できます。

2 番目のポイントは、データベースを作成するときに異なるテーブル間の関係を考慮する必要があるということです。この関係は、1 対 1 および 1 対多の関係を指します。たとえば、クラスに多くの生徒がいますが、生徒は別のクラスの授業に出席しないため、クラス -> 生徒は 1 対です。 -人間関係が多く、生徒 - >授業はマンツーマンです。

上記 2 点を理解した後、Mybatis を使用して複数テーブルの結合クエリを実装できます。

共同クエリを実装するためのアノテーションまず、 mybatisフレームワークを
ベースにしたプロジェクトを作成します具体的なディレクトリは図の通りです

 

プロジェクト全体を通じて、インターフェイスを保存するためにエンティティ クラス パッケージ、Dao レイヤー パッケージ、およびマッパー パッケージを完成させる必要があります。エンティティ クラス インターフェイスと Dao レイヤー インターフェイスを示しました。 

Dao層インターフェース

 Dao 層インターフェイスでは、追加、削除、変更、クエリなどのデータベース操作を実装するインターフェイスを記述する必要がありますが、mybatis はこれらのインターフェイスを呼び出すときに、実装クラスの作成と実装を自動的に支援します。コメントを使用して SQL ステートメントを送信します。知っておく必要があるキーワード: 挿入、削除、更新、選択。これらの 4 つのキーワードが最も重要であり、上記は単一テーブルのクエリで知っておく必要があるキーワードですが、複数テーブルの結合クエリの場合は、これらのキーワードに基づいて他のキーワードを理解する必要があります。


それからテストが来ます

複数テーブル結合クエリのマッピング関係

resultType はクエリ結果を pojo タイプにカプセル化できますが、pojo クラスの属性名はクエリされたデータベース テーブルのフィールド名と一致している必要があります。
SQL によってクエリされたフィールドが POJO のプロパティ名と一致しない場合は、resultMap を使用してフィールド名とプロパティ名を照合し、手動構成とカプセル化を実行して、結果を POJO にマップする必要があります。

resultMap
resultMap は、クエリ結果を複雑なタイプの pojo にマッピングできます。たとえば、クエリ結果マッピング オブジェクトには、1 対 1 クエリと 1 対多クエリを実装するための pojo とリストが含まれます。
まず、Mapper ファイルで基本的な SQL ステートメントを構成します。

<!-- すべての注文データをクエリします -->
    <!-- resultMap: 設定された resultMap タグの ID 値を入力します -->

<select id="selectAll" resultMap="studentMap">
 select * from student
 </select>

resultMap タグを構成して、さまざまなフィールドと属性名をマップする

<!-- resultMap最终还是要将结果映射到pojo上,type就是指定映射到哪一个pojo -->
    <!-- id:设置ResultMap的id -->
     <resultMap id="studentMap" type="com.ye.bean.Student">
        <!-- 定义主键 ,非常重要。如果是多个字段,则定义多个id -->
        <!-- property:主键在pojo中的属性名 -->
        <!-- column:主键在数据库中的列名 -->
        <id property="id" column="id" />
 
        <!-- 定义普通属性 -->
         <association property="classInfo" 
          select="com.ye.dao.ClassInfoDao.selectByCid" column="cid"/>
    </resultMap>

結果は pojo 型にカプセル化できます。

関連クエリと
1 対 1 クエリには resultMap を使用します

Mapper.xml 構成ファイルを構成する
OrderMapper.xml は、
まず id 属性と result 属性を使用して注文クラスの結果セットをマップし、次に関連付けを使用して関連オブジェクト User の結果セットをマップします。

    <resultMap id="studentMap" type="com.ye.bean.Student">
        <id property="sid" column="sid"/>
        <result property="sname" column="sname"/>
        <result property="sex" column="sex"/>
        <result property="phone" column="phone"/>
        <result property="address" column="address"/>
        <
    <!-- association :配置一对一属性 -->
    <!-- property:order里面的User属性名 -->
        <!-- javaType:属性类型 -->
   <association property="classInfo" select="com.ye.dao.ClassInfoDao.selectByCid" column="cid"/>
</resultMap>
 
<!-- 一对一关联,查询订单,订单内部包含用户属性 -->
 <select id="selectAll" resultMap="studentMap">
     select * from student
     </select>

テスト

 @Test
    public void selectAdd(){
        List<Student> students = student.selectAll();
        for (Student student1 : students) {
            System.out.println(student1);
        }
    }

動的 SQL は、
特定のパラメータ条件に基づいて SQL ステートメントを動的に結合できます。

たとえば、以前の開発では、クエリ パラメータが存在するかどうかが不明だったので、多くの人が接頭辞として where 1 = 1 のようなものを使用し、クエリするパラメータを AND で結合していました。クエリするパラメータが空の場合、クエリは正しく実行できます。1 = 1 が追加されていない場合、クエリ パラメータが空の場合、SQL ステートメントは SELECT * FROM Student where となり、SQL は不正です。

mybatis の主な動的タグは次のとおりです。 if テスト条件が満たされると、<if> タグ内の SQL ステートメントが結合されます。

where <where> タグは、少なくとも 1 つの子要素が SQL ステートメントを返す場合にのみ SQL ステートメントに WHERE を追加し、WHERE が AND または OR で始まる場合は自動的に削除されます。

//模糊查询
 
<select id="seach" parameterType="student" resultMap="studentMap">
        select * from student
        <where>
            <if test="sname!=null and sname!=''">
            or sname like concat('%',#{sname},'%')
            </if>
            <if test="sex!=null and sex!=''">
            or sex like concat('%',#{sex},'%')
            </if>
            <if test="phone!=null and phone!=''">
            or phone like concat('%',#{phone},'%')
            </if>
            <if test="address!=null and address!=''">
            or address like concat('%',#{address},'%')
            </if>
        </where>
    </select>

 </select>少なくとも 1 つの子要素が SQL ステートメントを返す場合、その子要素は SQL ステートメントに追加されSET、その後に SET が続く場合は,自動的に削除されます。

 //修改
 
<update id="update" parameterType="student">
        update student
        <set>
            <if test="sname!=null and sname!=''">
            sname=#{sname},
            </if>
            <if test="sex!=null and sex!=''">
            sex=#{sex},
            </if>
            <if test="phone!=null and phone!=''">
            phone=#{phone},
            </if>
            <if test="address!=null and address!=''">
            address=#{address},
            </if>
        </set>
        where sid=#{sid}
    </update>

ファジークエリをテストする

  @Test
    public void seach(){
        Student st=new Student();
        st.setSname("李");
        st.setAddress("郑");
        List<Student> seach = student.seach(st);
        System.out.println(seach);
    }

 結果

 1 対多のキー タグは: <association></association> です。このタグに記述されるのは、2 次テーブルのマッピングです。一般に、1 対多の場合、誰がメイン テーブル、つまり 1 対多の「1」です。」などのデータも明確になります。

要約する

Mybatis の複数テーブルの結合クエリは非常に重要です。顧客のニーズにより、ショッピング カート システムなど、2 つのテーブルを結合する必要があることがよくあります。そのため、最初にテーブル間の関係を明確にしてから、適切な方法を選択する必要があります。複数テーブルの結合クエリを実行します。 
 

おすすめ

転載: blog.csdn.net/WJY898989/article/details/129674271