MyBatis多對多關係映射

1、使用的數據腳本爲:

DROP DATABASE IF EXISTS mybatisdb ;
CREATE DATABASE mybatisdb CHARACTER SET UTF8 ;
USE mybatisdb ;
-- 創建數據表
CREATE TABLE role (
    rid         INT AUTO_INCREMENT ,
    title       VARCHAR(50) ,
    CONSTRAINT pk_rid PRIMARY KEY(rid)
) ;
CREATE TABLE groups (
    gid     INT AUTO_INCREMENT ,
    title       VARCHAR(50) ,
    CONSTRAINT pk_gid PRIMARY KEY(gid)      
) ;
CREATE TABLE role_groups(
    rid         INT ,
    gid         INT ,
    CONSTRAINT fk_rid FOREIGN KEY(rid) REFERENCES role(rid) ON DELETE CASCADE ,
    CONSTRAINT fk_gid FOREIGN KEY(gid) REFERENCES groups(gid) ON DELETE CASCADE 
) ;
INSERT INTO role(title) VALUES ('超級管理員') ;
INSERT INTO groups(title) VALUES ('人事管理') ;
INSERT INTO groups(title) VALUES ('任務管理') ;
INSERT INTO groups(title) VALUES ('商品採購') ;
INSERT INTO groups(title) VALUES ('商品檢修') ;
INSERT INTO groups(title) VALUES ('後勤保障') ;
INSERT INTO groups(title) VALUES ('財務管理') ;
INSERT INTO role_groups(rid,gid) VALUES (1,1) ;
INSERT INTO role_groups(rid,gid) VALUES (1,2) ;

2、準備好對應的vo類

public class Role implements Serializable { 
    private Integer rid ; 
    private String title ; 
    private List<Groups> allGroups ; 
}
public class Groups implements Serializable { 
    private Integer gid ; 
    private String title ; 
    private List<Role> allRoles ; 
}
public class RoleGroupsLink implements Serializable { 
    private Role role ; 
    private Groups groups ; 
}
//省略set和get方法

3、準備MyBatis需要的配置文件;
①創建Type.xml 文件:

<?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="vo.mapping.RoleNS">
    <resultMap type="Type" id="TypeMap"> 
        <id property="tid" column="tild"/> 
        <result property="title" column="title"/> 
    </resultMap>
</mapper>

②創建MemberDetails.xml 文件:

<?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="vo.mapping.GroupsNS">
    <resultMap type="Subtype" id="SubtypeMap"> 
    <id property="stid" column="stid"/> 
    <result property="title" column="title"/> 
    </resultMap>
</mapper>

③定義操作別名和映射路徑

<typeAliases> 
    <typeAlias type="cn.mldn.vo.Role" alias="Role"/> 
    <typeAlias type="cn.mldn.vo.Groups" alias="Groups"/> 
    <typeAlias type="cn.mldn.vo.RoleGroupsLink" alias="RoleGroupsLink"/>
</typeAliases>
<mapper namespace="vo/mapping/Role"/>
<mapper resource="vo/mapping/Groups.xml" />

4、在Mybatis裏面針對於這些數據的級聯操作查詢控制,一定要通過resultMap完成。
· 在Role.xml文件裏面定義resultMap:

<resultMap type="Role" id="RoleMap"> <id property="rid" column="rid"/> 
    <result property="title" column="title"/> 
    <collection property="allGroups" javaType="java.util.List" ofType="Groups" select="vo.mapping.GroupsNS.findAllByRole" column="rid"/>
</resultMap> 
<select id="findById" parameterType="Integer" resultMap="RoleMap"> 
    SELECT rid,title FROM role WHERE rid=#{rid} 
</select>
在Groups.xml文件裏面定義resultMap:
<resultMap type="Groups" id="GroupsMap"> 
    <id property="gid" column="gid"/> 
    <result property="title" column="title"/> 
</resultMap> 
<select id="findAllByRole" parameterType="integer" resultMap="GroupsMap"> 
    SELECT gid,title FROM groups WHERE gid IN ( SELECT gid FROM role_groups WHERE rid=#{rid}) 
</select>
那麼此時就實現了多對多的配置關係。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章