Mybatisは、マルチテーブルクエリ、カスケード、キャッシュを実装しています

一緒に書く習慣を身につけましょう!「ナゲッツデイリーニュープラン・4月アップデートチャレンジ」に参加して2日目です。クリックしてイベントの詳細をご覧ください

1対1のリレーショナルクエリ

  • シナリオ:従業員番号に基づいて従業員情報(Empテーブル)および部門(Deptテーブル)情報を照会します
  • EmpエンティティクラスにDept属性を作成する必要があります
<!--Emp findEmpJoinDeptByEmpno(int empno);-->
    <resultMap id="empJoinDept" type="emp">
        <!--设置emp本身的八个属性的映射关系-->
        <id property="empno" column="empno"></id>
        <result property="ename" column="ename"></result>
        <result property="job" column="job"></result>
        <result property="sal" column="sal"></result>
        <result property="hiredate" column="hiredate"></result>
        <result property="mgr" column="mgr"></result>
        <result property="comm" column="comm"></result>
        <result property="deptno" column="deptno"></result>
        <!--
        association 处理一对一
        封装一对一信息关系的标签
        property  emp类的属性名
        javaType  用哪个类的对象给属性赋值
        -->
        <association property="dept" javaType="dept">
            <id column="deptno" property="deptno"></id>
            <result column="dname" property="dname"></result>
            <result column="loc" property="loc"></result>
        </association>
    </resultMap>
    <select id="findEmpJoinDeptByEmpno" resultMap="empJoinDept" >
        select * from
        emp e
        left join dept  d
        on e.deptno =d.deptno
        where empno = #{empno}
    </select>
复制代码

1対多の関連付けクエリ

  • シナリオ:部門番号に従って部門情報(部門テーブル)と部門内のすべての従業員情報(Empテーブル)を照会します
  • 部門には複数の従業員がいるため、クエリされたEmpオブジェクトを格納するために、ListコレクションをDeptエンティティクラスにカプセル化する必要があります。
<mapper namespace="com.msb.mapper.DeptMapper">
    <!--Dept findDeptJoinEmpsByDeptno(int deptno);-->
    <resultMap id="deptJoinEmps" type="dept">
        <id column="deptno" property="deptno"></id>
        <result column="dname" property="dname"></result>
        <result column="loc" property="loc"></result>
        <!--处理一对多关系的标签-->
        <collection property="empList" ofType="emp" >
            <!--设置emp本身的八个属性的映射关系-->
            <id property="empno" column="empno"></id>
            <result property="ename" column="ename"></result>
            <result property="job" column="job"></result>
            <result property="sal" column="sal"></result>
            <result property="hiredate" column="hiredate"></result>
            <result property="mgr" column="mgr"></result>
            <result property="comm" column="comm"></result>
            <result property="deptno" column="deptno"></result>
        </collection>
    </resultMap>
    <select id="findDeptJoinEmpsByDeptno" resultMap="deptJoinEmps">
        select * from dept d left join emp e on d.deptno =e.deptno where d.deptno =#{deptno}
    </select>
复制代码

多対多の関連付けクエリ

  • シナリオ:プロジェクト番号、およびプロジェクトに関与するすべての従業員の情報に従ってプロジェクト情報を照会します

image.png

  • 上図の関係は、
  • したがって、ProjectRecordオブジェクトをカプセル化するために、ProjectテーブルにListコレクションを作成する必要があります。
  • 次に、ProjectRecordテーブルにEmpの属性値を作成して、empオブジェクトを格納します。
<mapper namespace="com.msb.mapper.ProjectMapper">
    <!--Project findProjectJoinEmpsByPid(int pid);-->
    <resultMap id="projectJoinEmps" type="project">
        <id column="pid" property="pid"></id>
        <result column="pname" property="pname"></result>
        <result column="money" property="money"></result>
        <!--一对多 集合属性 collection-->
        <collection property="projectRecords" ofType="projectRecord">
            <id column="empno" property="empno"></id>
            <id column="pid" property="pid"></id>
            <!--一对一 -->
            <association property="emp" javaType="emp">
                <id property="empno" column="empno"></id>
                <result property="ename" column="ename"></result>
                <result property="job" column="job"></result>
                <result property="sal" column="sal"></result>
                <result property="hiredate" column="hiredate"></result>
                <result property="mgr" column="mgr"></result>
                <result property="comm" column="comm"></result>
                <result property="deptno" column="deptno"></result>
            </association>
        </collection>
    </resultMap>
    <select id="findProjectJoinEmpsByPid"  resultMap="projectJoinEmps">
        select * from
        project p
        left join projectrecord pr
        on p.pid = pr.pid
        left join emp e
        on e.empno = pr.empno
        where p.pid= #{pid}
    </select>
复制代码

カスケードクエリ(即時読み込みと遅延読み込み)

  • カスケードクエリは、2つのインターフェイスと2つのxml構成ファイルを作成し、同じ条件で2つのテーブルをクエリすることです。

  • カスケードクエリにより、データを手動でクエリしてアセンブルする必要がなくなります

  • EmpMapper.xmlファイルで構成されたコード:

前缀 略
<mapper namespace="com.msb.mapper.EmpMapper">
    <!--List<Emp> findEmpsByDeptno(int deptno);-->
    <select id="findEmpsByDeptno" resultType="emp">
        select * from emp where deptno =#{deptno}
    </select>
复制代码
  • DeptMapper.xmlファイルで構成されたコード
<mapper namespace="com.msb.mapper.DeptMapper">
    <!--Dept findDeptByDeptno(int deptno);
    select="com.msb.mapper.EmpMapper.findEmpsByDeptno" 调用的另一个SQL语句
    javaType="list"  实体类的属性数据类型
    column="deptno"  给另一个SQL语句传入的参数列
    jdbcType="INTEGER" 参数对应JDBC的数据类型
    fetchType="eager"  加载方式 eager 积极加载  lazy延迟加载-->
    <resultMap id="deptJoinEmps" type="dept">
        <id property="deptno" column="deptno"></id>
        <result property="dname" column="dname"></result>
        <result property="loc" column="loc"></result>
        <collection property="empList"
                    select="com.msb.mapper.EmpMapper.findEmpsByDeptno"
                    javaType="list"
                    column="deptno"
                    jdbcType="INTEGER"
                    fetchType="eager"
        >
        </collection>
    </resultMap>
    <select id="findDeptByDeptno" resultMap="deptJoinEmps">
        select * from dept where deptno =#{deptno}
    </select>
复制代码

L1キャッシュ

image.png

  • mybatisの第1レベルのキャッシュはデフォルトで有効になっており、データはSQLSessionに保存されます。
//如果之间执行了增删改查,sqlSession调用了commit方法,它会自动清空一级缓存
sqlSession.commit();    
复制代码

L2キャッシュ

image.png

  • 第2レベルのキャッシュは、名前空間でマークされたキャッシュであり、手動で開く必要があります。
  • エンティティクラスをインスタンス化する必要があります
  • グローバルスイッチ:sqlMapConfig.xmlファイルのタグ構成で第2レベルのキャッシュをオンにします
	<settings>

    	<setting name="cacheEnabled" value="true"/>

	</settings>
复制代码
  • サブスイッチ:第2レベルのキャッシュを有効にするマッパーファイルのキャッシュを有効にします
<mapper namespace="com.msb.mapper.EmployeeMapper">
	<cache/>
</mapper>
复制代码

アノテーション開発

  • アノテーションの開発は、インターフェースの抽象メソッドの上に記述されます。これは、いくつかの基本的なクエリステートメント、および頻繁に変更されないステートメントの記述に適しています。
	//查询语句
    @Select("select * from dept where deptno =#{deptno}")
    Dept findByDeptno(int deptno);
    //修改语句
    @Update("update dept set dname =#{dname}, loc =#{loc} where deptno =#{deptno}")
    int updateDept(Dept dept);
    //增加语句
    @Insert("insert into dept values(DEFAULT,#{dname},#{loc})")
    int addDept(Dept dept);
    //删除语句
    @Delete("delete from dept where deptno =#{deptno}")
    int removeDept(int deptno)
复制代码

理想と現実の間には108,000マイルのギャップがあります。

おすすめ

転載: juejin.im/post/7088315120668901413