一對多查詢
阿新 • • 發佈:2020-08-01
比如一個使用者和角色的關係,一個使用者可以具備多個角色,準備表
SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for role -- ---------------------------- DROP TABLE IF EXISTS `role`; CREATE TABLE `role` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(32) DEFAULT NULL, `nameZh` varchar(32) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of role -- ---------------------------- INSERT INTO `role` VALUES ('1', 'dba', '資料庫管理員'); INSERT INTO `role` VALUES ('2', 'admin', '系統管理員'); INSERT INTO `role` VALUES ('3', 'user', '使用者'); -- ---------------------------- -- Table structure for user -- ---------------------------- DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(32) DEFAULT NULL, `password` varchar(255) DEFAULT NULL, `enabled` tinyint(1) DEFAULT NULL, `locked` tinyint(1) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of user -- ---------------------------- INSERT INTO `user` VALUES ('1', 'root', '$2a$10$RMuFXGQ5AtH4wOvkUqyvuecpqUSeoxZYqilXzbz50dceRsga.WYiq', '1', '0'); INSERT INTO `user` VALUES ('2', 'admin', '$2a$10$RMuFXGQ5AtH4wOvkUqyvuecpqUSeoxZYqilXzbz50dceRsga.WYiq', '1', '0'); INSERT INTO `user` VALUES ('3', 'sang', '$2a$10$RMuFXGQ5AtH4wOvkUqyvuecpqUSeoxZYqilXzbz50dceRsga.WYiq', '1', '0'); -- ---------------------------- -- Table structure for user_role -- ---------------------------- DROP TABLE IF EXISTS `user_role`; CREATE TABLE `user_role` ( `id` int(11) NOT NULL AUTO_INCREMENT, `uid` int(11) DEFAULT NULL, `rid` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of user_role -- ---------------------------- INSERT INTO `user_role` VALUES ('1', '1', '1'); INSERT INTO `user_role` VALUES ('2', '1', '2'); INSERT INTO `user_role` VALUES ('3', '2', '2'); INSERT INTO `user_role` VALUES ('4', '3', '3'); SET FOREIGN_KEY_CHECKS=1;
這三個表中,有使用者表,角色表以及使用者角色關聯表,其中使用者角色關聯表用來描述使用者和角色之間的關係,他們是一對多的關係。
然後,根據這三個表,建立兩個實體類:
public class User { private Integer id; private String username; private String password; private List<Role> roles; //get set toString } public class Role { private Integer id; private String name; private String nameZh; //get set toString }
接下來定義一個根據id查詢使用者的方法
User getUserById(Integer id);
定義該方法的實現
<resultMap id="UserWithRole" type="org.javaboy.mybatis.model.User"> <id column="id" property="id"/> <result column="username" property="username"/> <result column="password" property="password"/> <collection property="roles" ofType="org.javaboy.mybatis.model.Role"> <id property="id" column="rid"/> <result property="name" column="rname"/> <result property="nameZh" column="rnameZH"/> </collection> </resultMap> <select id="getUserById" resultMap="UserWithRole"> SELECT u.*,r.`id` AS rid,r.`name` AS rname,r.`nameZh` AS rnameZh FROM USER u,role r,user_role ur WHERE u.`id`=ur.`uid` AND ur.`rid`=r.`id` AND u.`id`=#{id} </select>
在 resultMap 中,通過 collection 節點來描述集合的對映關係。在對映時,會自動將一的一方資料集合並,然後將多的一方放到集合中,能實現這一點,靠的就是 id 屬性。
當然,這個一對多,也可以做成懶載入的形式,那我們首先提供一個角色查詢的方法:
List
然後,在 XML 檔案中,處理懶載入:
<resultMap id="UserWithRole" type="org.javaboy.mybatis.model.User">
<id column="id" property="id"/>
<result column="username" property="username"/>
<result column="password" property="password"/>
<collection property="roles" select="org.javaboy.mybatis.mapper.UserMapper.getRolesByUid" column="id" fetchType="lazy">
</collection>
</resultMap>
<select id="getUserById" resultMap="UserWithRole">
select * from user where id=#{id};
</select>
<select id="getRolesByUid" resultType="org.javaboy.mybatis.model.Role">
SELECT r.* FROM role r,user_role ur WHERE r.id=ur.rid AND ur.uid=#{id}
</select>
定義完成之後,我們的查詢操作就實現了懶載入功能。