天天看點

Mybatis學習_05mybatis多表操作實作多對多操作

mybatis的多表操作

  • 表之間的關系有幾種:一對多,多對一,一對一,多對多
  • 示例:使用者和訂單就是一對多,訂單和使用者就是多對一
    • 一個使用者可以下多個訂單
    • 多個訂單屬于同一個使用者
  • 示例:人和身份證号就是一對一
    • 一個人隻能有一個身份證号
    • 一個身份證号隻能屬于一個人
  • 示例:老師和學生之間就是多對多
    • 一個學生可以被多個老師教過
    • 一個老師可以教多個學生
  • 示例(特例):如果拿出每一個訂單,都隻能屬于一個使用者,是以mybatis中就把多對一看成了一對一

mybatis中的多表查詢

  • 示例:使用者和賬戶
    • 一個使用者可以有多個賬戶
    • 一個賬戶隻屬于一個使用者
  • 步驟:(一對多和多對一)
    1. 建立兩張表:
      • 使用者表
      • 賬戶表
    2. 建立兩個實體類:
      • 使用者實體類
      • 賬戶實體類

        3, 讓使用者表和賬戶表之間具備一對多的關系:需要外鍵在賬戶表中添加

    3. 讓使用者和賬戶的實體類能展現出一對多的關系
    4. 建立兩個配置檔案:
      • 使用者的配置檔案
      • 賬戶的配置檔案
    5. 實作配置:
      • 當查詢使用者時,可以同時得到使用者下所包含的賬戶資訊
      • 當查詢賬戶時, 可以同時得到賬戶下所屬使用者的資訊

一對一案例說明

  • 第一種方式:子類繼承(從表繼承主表)(不好)
    • 實體類(User,Account,UserAccount)
      public class User implements Serializable {
      
          private Integer id;
          private String username;
          private String address;
          private String sex;
          private Date birthday;
      }
      public class Account implements Serializable {
          private Integer id;
          private Integer uid;
          private Double money;
      }
      public class AccountUser extends Account {
          private String username;
          private String address;
      }
                 
    • 接口類
      //查詢所有賬戶,并且帶有使用者名稱和位址資訊---接口方法
      List<AccountUser> findAllAccount();
                 
    • 配置檔案xml
      <!--查詢所有賬戶同時包含使用者名和位址資訊-->
      <select id="findAllAccount" resultType="accountuser">
          select a.*,u.username,u.address from account a , user u where u.id = a.uid;
      </select>
                 
  • 第二種方式:配置xml檔案裡使用resultMap配置傳回類型(好)
    • 實體類(User,Account,UserAccount)
      public class Account implements Serializable {
          private Integer id;
          private Integer uid;
          private Double money;
          //從表實體應該包含一個主表實體的對象引用
          private User user;
      }
      public class User implements Serializable {
          private Integer id;
          private String username;
          private String address;
          private String sex;
          private Date birthday;
      }
      
                 
    • 接口類
      public interface IAccountDao {
          /**
          * 查詢所有賬戶,同時還要擷取到目前賬戶的所屬使用者資訊
          */
          List<Account> findAll();
          /**
          * 查詢所有賬戶,并且帶有使用者名稱和位址資訊
          * @return
          */
          List<AccountUser> findAllAccount();
      }
                 
    • 配置檔案xml
      <!-- 定義封裝account和user的resultMap -->
      <resultMap id="accountUserMap" type="account">
          <id property="id" column="aid"></id>
          <result property="uid" column="uid"></result>
          <result property="money" column="money"></result>
          <!-- 一對一的關系映射:配置封裝user的内容-->
          <association property="user" column="uid" javaType="user">
              <id property="id" column="id"></id>
              <result column="username" property="username"></result>
              <result column="address" property="address"></result>
              <result column="sex" property="sex"></result>
              <result column="birthday" property="birthday"></result>
          </association>
      </resultMap>
      
      <!-- 查詢所有 -->
      <select id="findAll" resultMap="accountUserMap">
          select u.*,a.id as aid,a.uid,a.money from account a , user u where u.id = a.uid;
      </select>
      
      <!--查詢所有賬戶同時包含使用者名和位址資訊-->
      <select id="findAllAccount" resultType="accountuser">
          select a.*,u.username,u.address from account a , user u where u.id = a.uid;
      </select>
                 

一對多案例說明

  • 實體類(User,Account,UserAccount)
    public class User implements Serializable {
        private Integer id;
        private String username;
        private String address;
        private String sex;
        private Date birthday;
        //一對多關系映射:主表實體應該包含從表實體的集合引用
        private List<Account> accounts;
    }
    public class Account implements Serializable {
        private Integer id;
        private Integer uid;
        private Double money;
    }
               
  • 接口類
    /**
     * 查詢所有使用者,同時擷取到使用者下所有賬戶的資訊
     * @return
     */
    List<User> findAll();
    
               
  • 配置檔案xml
    <!-- 定義User的resultMap-->
    <resultMap id="userAccountMap" type="user">
        <id property="id" column="id"></id>
        <result property="username" column="username"></result>
        <result property="address" column="address"></result>
        <result property="sex" column="sex"></result>
        <result property="birthday" column="birthday"></result>
        <!-- 配置user對象中accounts集合的映射 -->
        <collection property="accounts" ofType="account">
            <id column="aid" property="id"></id>
            <result column="uid" property="uid"></result>
            <result column="money" property="money"></result>
        </collection>
    </resultMap>
    
    <!-- 查詢所有 -->
    <select id="findAll" resultMap="userAccountMap">
        select * from user u left outer join account a on u.id = a.uid
    </select>
    
    <!-- 根據id查詢使用者 -->
    <select id="findById" parameterType="INT" resultType="user">
        select * from user where id = #{uid}
    </select>
               

一對多案例說明

  • 示例:使用者和角色
    • 一個使用者可以有多個角色
    • 一個角色可以賦予多個使用者
  • 步驟:(多對多)
    1. 建立兩張表:
      • 使用者表
      • 角色表
    2. 建立兩個實體類:
      • 使用者實體類
      • 角色實體類

        3, 讓使用者表和角色表之間具備多對多的關系:需要使用中間表,中間表中包含各自的主鍵,在中間表中是外鍵

    3. 讓使用者和角色的實體類能展現出多對多的關系:各自包含對方的一個集合引用
    4. 建立兩個配置檔案:
      • 使用者的配置檔案
      • 角色的配置檔案
    5. 實作配置:
      • 當查詢使用者時,可以同時得到下所包含的角色資訊
      • 當查詢角色時, 可以同時得到角色下所屬使用者的資訊
  • 實作代碼一:多角色對多使用者
    • 實體類
      public class Role implements Serializable {
          private Integer roleId;
          private String roleName;
          private String roleDesc;
      
          //多對多的關系映射:一個角色可以賦予多個使用者
          private List<User> users;
      }
      public class User implements Serializable {
          private Integer id;
          private String username;
          private String address;
          private String sex;
          private Date birthday;
      }
                 
    • 接口
      public interface IRoleDao {
          /**
          * 查詢所有角色
          * @return
          */
          List<Role> findAll();
      }
                 
    • 配置檔案xml
      <mapper namespace="com.itheima.dao.IRoleDao">
      
          <!--定義role表的ResultMap-->
          <resultMap id="roleMap" type="role">
              <id property="roleId" column="rid"></id>
              <result property="roleName" column="role_name"></result>
              <result property="roleDesc" column="role_desc"></result>
              <collection property="users" ofType="user">
                  <id column="id" property="id"></id>
                  <result column="username" property="username"></result>
                  <result column="address" property="address"></result>
                  <result column="sex" property="sex"></result>
                  <result column="birthday" property="birthday"></result>
              </collection>
          </resultMap>
      
          <!--查詢所有-->
          <select id="findAll" resultMap="roleMap">
              select u.*,r.id as rid,r.role_name,r.role_desc from role r
              left outer join user_role ur  on r.id = ur.rid
              left outer join user u on u.id = ur.uid
          </select>
      </mapper>
                 
  • 實作代碼二:多使用者對多角色
    • 實體類
      public class Role implements Serializable {
          private Integer roleId;
          private String roleName;
          private String roleDesc;
      }
      public class User implements Serializable {
          private Integer id;
          private String username;
          private String address;
          private String sex;
          private Date birthday;
          //多對多的關系映射:一個使用者可以具備多個角色
          private List<Role> roles;
      }
                 
    • 接口
      public interface IUserDao {
      
          /**
          * 查詢所有使用者,同時擷取到使用者下所有賬戶的資訊
          * @return
          */
          List<User> findAll();
      }
                 
    • 配置檔案xml
      <mapper namespace="com.itheima.dao.IUserDao">
      
          <!-- 定義User的resultMap-->
          <resultMap id="userMap" type="user">
              <id property="id" column="id"></id>
              <result property="username" column="username"></result>
              <result property="address" column="address"></result>
              <result property="sex" column="sex"></result>
              <result property="birthday" column="birthday"></result>
              <!-- 配置角色集合的映射 -->
              <collection property="roles" ofType="role">
                  <id property="roleId" column="rid"></id>
                  <result property="roleName" column="role_name"></result>
                  <result property="roleDesc" column="role_desc"></result>
              </collection>
          </resultMap>
      
          <!-- 查詢所有 -->
          <select id="findAll" resultMap="userMap">
              select u.*,r.id as rid,r.role_name,r.role_desc from user u
              left outer join user_role ur  on u.id = ur.uid
              left outer join role r on r.id = ur.rid
          </select>
      
          <!-- 根據id查詢使用者 -->
          <select id="findById" parameterType="INT" resultType="user">
              select * from user where id = #{uid}
          </select>
      
      </mapper>
                 

繼續閱讀