Mybatisのマルチテーブルクエリ

Mybatisのマルチテーブルクエリ

1.mybatisのテーブル間の関係の分析
表之间的关系有:
1. 一对多
2. 多对一
3. 一对一
4. 多对多
2.テーブルの関係の例
1. 用户和订单就是一对多
    {
        一个用户可以下多个订单
    }
2. 订单和用户就是多对一
    {
        多个订单属于同一个用户
    }
3. 人和身份证号就是一对一
    {
        一个人对应一个身份证号
        一个身份证号只能对应一个人
    }
4. 老师和学生之间就是多对多的关系
    {
        一个老师可以教多个学生
        一个学生可以被多个老师教过
    }
3.注:Mybatisでは、多対1の操作は1対1の操作と見なされます。
如:多个账户对应一个用户,那么每个账户都对应一个用户。所以在mybatis中把多对一看成是一对一进行操作
4. mybatisで操作するための多対1(mybatisでは1対1)、1対多、および多対多の3つの方法
  1. 多対1(mybatisでは1対1)

    1. 例としてアカウントとユーザーを取り上げます。完了:すべてのアカウントにクエリを実行しながら、アカウントに対応するユーザーにクエリを実行します

    アカウントテーブル:Mybatisのマルチテーブルクエリ

    ユーザーテーブル:Mybatisのマルチテーブルクエリ

    1. 操作方法:【要点】
    在多的一方(即account方)对应的实体类中加入一方(即user方)的对象引用
    1. エンティティクラスコード:
    public class Account implements Serializable {
        private Integer ID;
        private Integer UID;
        private Double MONEY;
        //从表实体应该包含一个主表实体的对象引用
        //多对一关系,要在多的一方添加上一方的主键,作为多的一方的外键,
        // 在Java中要在多的一方加上一个一方的对象引用
        private User user;
        ...
    }
    public class User implements Serializable {
            private Integer id;
            private String username;
            private Date birthday;
            private String sex;
            private String address;
        ...
    }
    1. IAccountDaoインターフェース
    public interface IAccountDao {
    
        //查询所有账户的同时,查询出该账户对应的User用户
        public List<Account> findAll();
    }
    1. インターフェイスマッピングファイルの構成
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper
         PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="itlearn.zhi.dao.IAccountDao">
     <!-- type:为当前进行配置的实体类名,在此使用了typeAliases标签,所以可以直接写类名,不区分大小写 -->
     <resultMap id="accountUserMap" type="account">
>    >         <!--注意:在sql语句中给a.id取了别名,所以在这里也要 用别名配置 【重点】 -->
>    >         <id property="ID" column="aid"></id>
>    >         <result property="UID" column="UID"></result>
>    >         <result property="MONEY" column="MONEY"></result>
>    >         <!-- 对User属性进行配置,在此只要不是集合就使用association标签
>    >          colum:指的是该属性的值是通过数据库中哪个字段来获取的
>    >      JavaType:要封装成的类型。
>    >      -->
>    >         <association property="user" column="UID" javaType="user">
>    >             <id property="id" column="id"></id>
>    >             <result property="username" column="username"></result>
>    >             <result property="birthday" column="birthday"></result>
>    >             <result property="sex" column="sex"></result>
>    >             <result property="address" column="address"></result>
>    >         </association>
>    >     </resultMap>
>    >     
>    >     <select id="findAll" resultMap="accountUserMap">
>    >         <!-- 注意:因为在account和user表中都有id字段,在sql中需要起别名,防止resultMap中发生映射错误,同时也需要在resultMap中给取了别名的字段配置Colum-->
>    >         SELECT u.*,a.ID AS aid,a.UID,a.MONEY FROM account a ,user u WHERE a.UID = u.id;
>    >     </select>
>    > </mapper>
  1. 1対多
  1. 例として、AccountテーブルとUserテーブルを取り上げます。完了:すべてのユーザーにクエリを実行しているときに、そのユーザーの下にあるすべてのアカウント情報を表示します
public class User implements Serializable {
        private Integer id;
        private String username;
        private Date birthday;
        private String sex;
        private String address;

        //一个用户有多个账户
        //那么在一方需要加上一个多方的对象集合
        private List&lt;Account&gt; accounts;
      ...
}
  1. 操作方法
在一的一方的实体类中,加入多的一方的集合引用。即:在一的一方(User方)加入:
private List&lt;Account&gt; accounts;
  1. IUserDaoインターフェース
public interface IUserDao {
    //查询所有用户,并查询到该用户下所有账户信息
    public List&lt;User&gt; findAll();
}
  1. インターフェイスマッピング設定ファイルでの設定
> > > <?xml version="1.0" encoding="UTF-8"?>
> > > <!DOCTYPE mapper
> > >         PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
> > >         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
> > > <mapper namespace="itlearn.zhi.dao.IUserDao">
> > >     <resultMap id="userAccountMap" type="user">
> > >         <id property="id" column="id"/>
> > >         <result property="username" column="username"></result>
> > >         <result property="birthday" column="birthday"></result>
> > >         <result property="sex" column="sex"></result>
> > >         <result property="address" column="address"></result>
> > >         <!-- 因为使集合引用,所以要用collection标签,如果不是集合就用association标签
> > >       ofType:指定当前要封装的类型
> > >       -->
> > >         <collection property="accounts" ofType="account">
> > >             <!-- 因为在sql语句中为a.id起了别名,所以在这里也要用别名配置 -->
> > >             <id property="ID" column="aid"></id>
> > >             <result property="UID" column="UID"></result>
> > >             <result property="MONEY" column="MONEY"></result>
> > >         </collection>
> > >     </resultMap>
> > > 
> > >     <select id="findAll" resultMap="userAccountMap">
> > >         SELECT u.*,a.id as aid,a.UID,a.MONEY FROM USER u LEFT OUTER JOIN account a ON u.`id` = a.`UID`;
> > >     </select>
> > > </mapper>
  1. 結果は次のことを示しています。
-----------------------
User{id=41, username='老王', birthday=Tue Feb 27 17:47:08 CST 2018, sex='男', address='北京'}
[Account{ID=1, UID=41, MONEY=1000.0}, Account{ID=3, UID=41, MONEY=2000.0}]
-----------------------
User{id=42, username='小二王', birthday=Fri Mar 02 15:09:37 CST 2018, sex='女', address='北京金燕龙'}
[]
-----------------------
User{id=45, username='传智播客', birthday=Sun Mar 04 12:04:06 CST 2018, sex='男', address='北京金燕龙'}
[Account{ID=2, UID=45, MONEY=1000.0}]
...
表示:[Account {ID = 1、UID = 41、MONEY = 1000.0}、Account {ID = 3、UID = 41、MONEY = 2000.0}] mybatisは、ユーザーの下にある複数のアカウントをコレクションにカプセル化するのに自動的に役立ちます。
  1. 多対多:多対多の関係では、中間テーブルがあり、2つのテーブルの主キーを格納します
  1. 例としてユーザーテーブルとロールテーブルを取り上げます

Role表:Mybatisのマルチテーブルクエリ

  1. 操作方法
在两张表对应的实体类中分别加入对方的集合引用【重点】
  1. 役割エンティティ
public class Role implements Serializable {
    private Integer id;
    private String roleName;
    private String roleDesc;

    private List&lt;User&gt; users;
    ...
}
  1. ユーザーエンティティ
public class User implements Serializable {
        private Integer id;
        private String username;
        private Date birthday;
        private String sex;
        private String address;

        private List&lt;Role&gt; roles;
    ...
}
  1. 実装1:すべてのユーザーにクエリを実行しながら、ユーザーのロール情報をクエリします。インターフェイスメソッド:findAll
> > > <?xml version="1.0" encoding="UTF-8"?>
> > > <!DOCTYPE mapper
> > >         PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
> > >         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
> > > <mapper namespace="itlearn.zhi.dao.IUserDao">
> > > 
> > >     <resultMap id="userRole" type="user">
> > >         <id property="id" column="id"/>
> > >         <result property="username" column="username"></result>
> > >         <result property="birthday" column="birthday"></result>
> > >         <result property="sex" column="sex"></result>
> > >         <result property="address" column="address"></result>
> > >         <collection property="roles" ofType="role">
> > >             <id property="id" column="rid"></id>
> > >             <result property="roleName" column="ROLE_NAME"></result>
> > >             <result property="roleDesc" column="ROLE_DESC"></result>
> > >         </collection>
> > >     </resultMap>
> > > 
> > >     <select id="findAll" resultMap="userRole">
> > >         SELECT u.*,r.`ID` AS rid,r.`ROLE_NAME`,r.`ROLE_DESC` FROM USER u LEFT JOIN user_role ur
> > >         ON u.`id` = ur.`UID`
> > >         LEFT JOIN role r
> > >         ON ur.`RID` = r.`ID`;
> > >     </select>
> > > </mapper>
  1. 検索結果:
User{id=41, username='老王', birthday=Tue Feb 27 17:47:08 CST 2018, sex='男', address='北京'}
[Role{id=1, roleName='院长', roleDesc='管理整个学院'}, Role{id=2, roleName='总裁', roleDesc='管理整个公司'}]
-----------------------
User{id=42, username='小二王', birthday=Fri Mar 02 15:09:37 CST 2018, sex='女', address='北京金燕龙'}
[]
-----------------------
User{id=43, username='小二王', birthday=Sun Mar 04 11:34:34 CST 2018, sex='女', address='北京金燕龙'}
[]
-----------------------
User{id=45, username='传智播客', birthday=Sun Mar 04 12:04:06 CST 2018, sex='男', address='北京金燕龙'}
[Role{id=1, roleName='院长', roleDesc='管理整个学院'}]
...
  1. 実装2:すべてのロールをクエリしながら、ロールの下のユーザー情報をクエリします。インターフェイスメソッド:findAll
> > > <?xml version="1.0" encoding="UTF-8"?>
> > > <!DOCTYPE mapper
> > >         PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
> > >         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
> > > <mapper namespace="itlearn.zhi.dao.IRoleDao">
> > >     <resultMap id="roleUser" type="role">
> > >         <id property="id" column="rid"></id>
> > >         <result property="roleName" column="ROLE_NAME"></result>
> > >         <result property="roleDesc" column="ROLE_DESC"></result>
> > >         <collection property="users" ofType="user">
> > >             <id property="id" column="id"/>
> > >             <result property="username" column="username"></result>
> > >             <result property="birthday" column="birthday"></result>
> > >             <result property="sex" column="sex"></result>
> > >             <result property="address" column="address"></result>
> > >         </collection>
> > >     </resultMap>
> > > 
> > >     <select id="findAll" resultMap="roleUser">
> > >         SELECT r.`ID` AS rid,r.`ROLE_NAME`,r.`ROLE_DESC`,u.* FROM role r LEFT JOIN user_role ur
> > >         ON r.`ID` = ur.`RID`
> > >         LEFT JOIN USER u
> > >         ON ur.`UID` = u.`id`;
> > >     </select>
> > > </mapper>

検索結果:

Role{id=1, roleName='院长', roleDesc='管理整个学院'}
[User{id=41, username='老王', birthday=Tue Feb 27 17:47:08 CST 2018, sex='男', address='北京'}, User{id=45, username='传智播客', birthday=Sun Mar 04 12:04:06 CST 2018, sex='男', address='北京金燕龙'}]
-----------------------
Role{id=2, roleName='总裁', roleDesc='管理整个公司'}
[User{id=41, username='老王', birthday=Tue Feb 27 17:47:08 CST 2018, sex='男', address='北京'}]
-----------------------
Role{id=3, roleName='校长', roleDesc='管理整个学校'}
[]
5.マルチテーブル操作の概要
  1. 多対1:複数政党に政党のオブジェクト参照を追加します;プライベートユーザーユーザー; resultMapで使用します:ユーザーを構成するための関連付けタグ
  2. 1対多:1つのパーティがマルチパーティコレクション参照に参加します:private List <Account>アカウント; resultMap:コレクションタグで使用してアカウントを構成します
  3. 多対多:他のパーティのコレクション参照を各パーティのエンティティクラスに追加します。resultMapで使用:コレクションタグを使用してコレクション参照を構成します
6.注:
1. resultMapを構成するときに、2つのテーブルのidフィールドが同じである場合は、それらの1つにエイリアスを作成し、そのエイリアスを使用してresultMapで構成する必要があります。
2.多対多のSQLステートメントの記述。

おすすめ

転載: blog.51cto.com/14982816/2609702