表之間的關係有: 1. 一對多 2. 多對一 3. 一對一 4. 多對多
1. 用戶和訂單就是一對多 { 一個用戶能夠下多個訂單 } 2. 訂單和用戶就是多對一 { 多個訂單屬於同一個用戶 } 3. 人和身份證號就是一對一 { 一我的對應一個身份證號 一個身份證號只能對應一我的 } 4. 老師和學生之間就是多對多的關係 { 一個老師能夠教多個學生 一個學生能夠被多個老師教過 }
如:多個帳戶對應一個用戶,那麼每一個帳戶都對應一個用戶。因此在mybatis中把多對一當作是一對一進行操做
多對一(mybatis中的一對一)java
以帳戶Account和用戶User爲例。完成:查詢全部帳戶的同時,查詢出該帳戶對應的User用戶
account表:sql
user表:數據庫
- 操做方式:【重點】
在多的一方(即account方)對應的實體類中加入一方(即user方)的對象引用
- 實體類代碼:
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; ... }
- IAccountDao接口
public interface IAccountDao { //查詢全部帳戶的同時,查詢出該帳戶對應的User用戶 public List<Account> 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.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>
- 一對多
- 也是以Account表和User表爲例。完成:查詢全部用戶的同時,展現出該用戶下全部帳戶信息
public class User implements Serializable { private Integer id; private String username; private Date birthday; private String sex; private String address; //一個用戶有多個帳戶 //那麼在一方須要加上一個多方的對象集合 private List<Account> accounts; ... }
- 操做方式
在一的一方的實體類中,加入多的一方的集合引用。即:在一的一方(User方)加入: private List<Account> accounts;
- IUserDao接口
public interface IUserDao { //查詢全部用戶,並查詢到該用戶下全部帳戶信息 public List<User> 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="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>
- 結果顯示:
----------------------- 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會自動幫咱們把用戶下面的多個帳戶進行封裝進集合。
- 多對多:在多對多的關係中,會有一張中間表的存在,而且存放的是兩個表的主鍵
- 以User和Role表爲例
Role表:mybatis
- 操做方式
在兩張表對應的實體類中分別加入對方的集合引用【重點】
- Role實體
public class Role implements Serializable { private Integer id; private String roleName; private String roleDesc; private List<User> users; ... }
- User實體
public class User implements Serializable { private Integer id; private String username; private Date birthday; private String sex; private String address; private List<Role> roles; ... }
- 實現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>
- 查詢結果:
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='管理整個學院'}] ...
- 實現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>
查詢結果:app
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='管理整個學校'} []
- 多對一:在多的一方加入一方的對象引用;private User user; 在resultMap中使用:association標籤對user進行配置
- 一對多:在一的一方加入多的一方的集合引用:private List<Account> accounts;在resultMap中使用:collection標籤對accounts進行配置
- 多對多:在每一方的實體類中加入另外一方的集合引用。在resultMap中使用:collection標籤對集合引用進行配置