mybatis的多表操作
- 表之間的關系有幾種:一對多,多對一,一對一,多對多
- 示例:使用者和訂單就是一對多,訂單和使用者就是多對一
- 一個使用者可以下多個訂單
- 多個訂單屬于同一個使用者
- 示例:人和身份證号就是一對一
- 一個人隻能有一個身份證号
- 一個身份證号隻能屬于一個人
- 示例:老師和學生之間就是多對多
- 一個學生可以被多個老師教過
- 一個老師可以教多個學生
- 示例(特例):如果拿出每一個訂單,都隻能屬于一個使用者,是以mybatis中就把多對一看成了一對一
mybatis中的多表查詢
- 示例:使用者和賬戶
- 一個使用者可以有多個賬戶
- 一個賬戶隻屬于一個使用者
- 步驟:(一對多和多對一)
- 建立兩張表:
- 使用者表
- 賬戶表
- 建立兩個實體類:
- 使用者實體類
-
賬戶實體類
3, 讓使用者表和賬戶表之間具備一對多的關系:需要外鍵在賬戶表中添加
- 讓使用者和賬戶的實體類能展現出一對多的關系
- 建立兩個配置檔案:
- 使用者的配置檔案
- 賬戶的配置檔案
- 實作配置:
- 當查詢使用者時,可以同時得到使用者下所包含的賬戶資訊
- 當查詢賬戶時, 可以同時得到賬戶下所屬使用者的資訊
- 建立兩張表:
一對一案例說明
- 第一種方式:子類繼承(從表繼承主表)(不好)
- 實體類(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>
- 實體類(User,Account,UserAccount)
- 第二種方式:配置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)
一對多案例說明
- 實體類(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>
一對多案例說明
- 示例:使用者和角色
- 一個使用者可以有多個角色
- 一個角色可以賦予多個使用者
- 步驟:(多對多)
- 建立兩張表:
- 使用者表
- 角色表
- 建立兩個實體類:
- 使用者實體類
-
角色實體類
3, 讓使用者表和角色表之間具備多對多的關系:需要使用中間表,中間表中包含各自的主鍵,在中間表中是外鍵
- 讓使用者和角色的實體類能展現出多對多的關系:各自包含對方的一個集合引用
- 建立兩個配置檔案:
- 使用者的配置檔案
- 角色的配置檔案
- 實作配置:
- 當查詢使用者時,可以同時得到下所包含的角色資訊
- 當查詢角色時, 可以同時得到角色下所屬使用者的資訊
- 建立兩張表:
- 實作代碼一:多角色對多使用者
- 實體類
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>
- 實體類