1. 程式人生 > >mybatis關聯查詢之一對多,多對一,以及多對多

mybatis關聯查詢之一對多,多對一,以及多對多

idt 兩個 讀取 arrays ebe bubuko print 過濾 權限表

一、使用IDEA新建maven工程

二、引入mybatis以及相關的jar

<!--版本僅供參考-->
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.5</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.44</version> </dependency> </dependencies>

三、建表

  權限管理需求的介紹,一個用戶擁有若幹角色,一個角色擁有若幹權限,權限就是對某個資源的增刪改查,這樣就構成了用戶-角色-權限之間的模型,在這種關系中,用戶與角色,角色與權限之間一般是多對多的關系

 建表sql:

create table sys_user(
    id int not null auto_increment comment ‘用戶ID‘,
    user_name varchar(32) comment ‘用戶名‘,
    password varchar(50) comment ‘用戶密碼‘,
    usr_info varchar(
50) comment ‘用戶簡介‘, head_img blob comment ‘頭像‘, create_time datetime comment ‘創建時間‘, primary key(id) ); alter table sys_user comment ‘用戶表‘; create table sys_role( id int not null auto_increment comment ‘角色ID‘, role_name varchar(50) comment ‘角色名稱‘, enabled int comment ‘有效標誌‘, create_by bigint comment
‘創建人‘, create_time datetime comment ‘創建時間‘, primary key(id) ); alter table sys_role comment ‘角色表‘; create table sys_privilege( id int not null auto_increment comment ‘權限ID‘, privilege_name varchar(50) comment ‘權限名稱‘, privilege_url varchar(50) comment ‘權限URL‘, primary key(id) ); alter table sys_privilege comment ‘權限表‘; create table sys_user_role( user_id bigint not null comment ‘用戶ID‘, role_id bigint not null comment ‘角色ID‘ ); alter table sys_user comment ‘用戶角色‘; create table sys_role_privilege( role_id bigint not null comment ‘角色ID‘, privilege_id bigint not null comment ‘權限ID‘ ); alter table sys_role_privilege comment ‘角色權限表‘;

給表添加外鍵

--   給用戶角色表的user_id添加外鍵 
alter table sys_user_role add constraint fk_uru foreign key(user_id) references sys_user(id);
--   給用戶角色表的role_id 添加外鍵 
alter table sys_user_role add constraint fk_sysrur foreign key(role_id) references sys_role(id);
--    給角色權限表的role_id添加外鍵 
alter table sys_role_privilege add constraint fk_sysrpp foreign key(privilege_id) references sys_privilege(id);
--    給角權限的privilege_id 添加外鍵 
alter table sys_role_privilege add constraint fk_sysrpr foreign key(role_id) references sys_role(role_id);

插入數據

insert into sys_user(user_name,password,user_info,head_img,create_time )values(‘Jordan‘,‘123‘,‘管理員‘,null,‘2018-1-22 12:02:01‘),
(‘Alice‘,‘456‘,‘測試人員‘,null,‘2018-1-22 12:02:01‘),
(‘Alex‘,‘789‘,‘開發人員‘,null,‘2018-1-22 12:02:01‘),
(‘James‘,‘012‘,‘運維人員‘,null,‘2018-1-22 12:02:01‘)
insert into sys_user_role(role_name,enabled,create_by,create_time) values(‘管理員‘,1,‘1‘,‘2018-01-02‘),values(‘普通用戶‘,1,‘1‘,‘2018-01-02‘);
insert into sys_privilege(privilege_name,privilege_url) values(‘用戶管理‘,‘/users‘),(‘角色管理‘,‘/roles‘),(‘系統維護‘,‘/system‘),(‘日誌管理‘,‘/logs‘);
insert into sys_user_role values(1,1),(2,2),(3,2),(4,2);
insert into sys_role_privilege values(1,1),(2,3),(2,4);

四、使用逆向工程生成entity以及mapper接口和mapper文件

  ①:創建mybatis-config.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
    <typeAliases>
        <package name="com.jordan.mybatis.entity"></package>
        </typeAliases>
    <environments default="defaultEnv">
        <environment id="defaultEnv">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="username" value="root"></property>
                <property name="password" value="123456"></property>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis"></property>
                <property name="driver" value="com.mysql.jdbc.Driver"></property>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <package name="com.jordan.mybatis.mapper"></package>
    </mappers>
</configuration>

  ②:SysUser.java

技術分享圖片
package com.jordan.mybatis.entity;

import java.util.Arrays;
import java.util.Date;
import java.util.List;

public class SysUser {
    private Long id;

    private String userName;

    private String password;

    private Date createTime;

    private String userInfo;

    private byte[] headImg;

    private SysRole sysRole;

    private List<SysRole> sysRoleList;

    public List<SysRole> getSysRoleList() {
        return sysRoleList;
    }

    public void setSysRoleList(List<SysRole> sysRoleList) {
        this.sysRoleList = sysRoleList;
    }

    public SysRole getSysRole() {
        return sysRole;
    }

    public void setSysRole(SysRole sysRole) {
        this.sysRole = sysRole;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName == null ? null : userName.trim();
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password == null ? null : password.trim();
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }


    public String getUserInfo() {
        return userInfo;
    }

    public void setUserInfo(String userInfo) {
        this.userInfo = userInfo == null ? null : userInfo.trim();
    }

    public byte[] getHeadImg() {
        return headImg;
    }

    public void setHeadImg(byte[] headImg) {
        this.headImg = headImg;
    }

    @Override
    public String toString() {
        return "SysUser{" +
                "id=" + id +
                ", userName=‘" + userName + ‘\‘‘ +
                ", password=‘" + password + ‘\‘‘ +
                ", createTime=" + createTime +
                ", userInfo=‘" + userInfo + ‘\‘‘ +
                ", headImg=" + Arrays.toString(headImg) +
                ", sysRole=" + sysRole +
                ", sysRoleList=" + sysRoleList +
                ‘}‘;
    }
}
View Code

  ③:SysRole.java

技術分享圖片
package com.jordan.mybatis.entity;

import java.util.Arrays;
import java.util.Date;
import java.util.List;

public class SysUser {
    private Long id;

    private String userName;

    private String password;

    private Date createTime;

    private String userInfo;

    private byte[] headImg;

    private SysRole sysRole;

    private List<SysRole> sysRoleList;

    public List<SysRole> getSysRoleList() {
        return sysRoleList;
    }

    public void setSysRoleList(List<SysRole> sysRoleList) {
        this.sysRoleList = sysRoleList;
    }

    public SysRole getSysRole() {
        return sysRole;
    }

    public void setSysRole(SysRole sysRole) {
        this.sysRole = sysRole;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName == null ? null : userName.trim();
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password == null ? null : password.trim();
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }


    public String getUserInfo() {
        return userInfo;
    }

    public void setUserInfo(String userInfo) {
        this.userInfo = userInfo == null ? null : userInfo.trim();
    }

    public byte[] getHeadImg() {
        return headImg;
    }

    public void setHeadImg(byte[] headImg) {
        this.headImg = headImg;
    }

    @Override
    public String toString() {
        return "SysUser{" +
                "id=" + id +
                ", userName=‘" + userName + ‘\‘‘ +
                ", password=‘" + password + ‘\‘‘ +
                ", createTime=" + createTime +
                ", userInfo=‘" + userInfo + ‘\‘‘ +
                ", headImg=" + Arrays.toString(headImg) +
                ", sysRole=" + sysRole +
                ", sysRoleList=" + sysRoleList +
                ‘}‘;
    }
}
View Code

  ④:SysPrivilege.java

技術分享圖片
package com.jordan.mybatis.entity;

public class SysPrivilege {
    private Long id;

    private String privilegeName;

    private String privilegeUrl;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getPrivilegeName() {
        return privilegeName;
    }

    public void setPrivilegeName(String privilegeName) {
        this.privilegeName = privilegeName == null ? null : privilegeName.trim();
    }

    public String getPrivilegeUrl() {
        return privilegeUrl;
    }

    public void setPrivilegeUrl(String privilegeUrl) {
        this.privilegeUrl = privilegeUrl == null ? null : privilegeUrl.trim();
    }

    @Override
    public String toString() {
        return "SysPrivilege{" +
                "id=" + id +
                ", privilegeName=‘" + privilegeName + ‘\‘‘ +
                ", privilegeUrl=‘" + privilegeUrl + ‘\‘‘ +
                ‘}‘;
    }
}
View Code

  ⑤:SysUserMapper

public interface SysUserMapper {
    public List<SysUser> getUserRolePrivilege();
}

  ⑥:SysUserMapper.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="com.jordan.mybatis.mapper.SysUserMapper">
    <resultMap id="getUserRolePrivilege" type="SysUser">
        <id property="id" column="id"></id>
        <result property="userName" column="user_name"></result>
        <result property="password" column="password"></result>
        <result property="userInfo" column="user_info"></result>
        <result property="createTime" column="create_time"></result>
        <collection property="sysRoleList" ofType="SysRole">
            <id property="id" column="id"></id>
            <result property="roleName" column="role_name"></result>
            <result property="createTime" column="create_time"></result>
            <collection property="sysPrivilegeList" ofType="SysPrivilege">
                <id property="id" column="id"></id>
                <result property="privilegeName" column="privilege_name"></result>
                <result  property="privilegeUrl" column="privilege_url"></result>
            </collection>
        </collection>
    </resultMap>
    <select id="getUserRolePrivilege"  resultMap="getUserRolePrivilege">
       select a.id,a.user_name,a.password,a.user_info,b.role_name,b.create_time,c.privilege_name,c.privilege_url from sys_user a,sys_role b,
    sys_privilege c,sys_user_role d,sys_role_privilege e  where a.id = d.user_id and b.id = d.role_id and e.role_id=b.id and e.privilege_id=c.id
    </select>
</mapper>

五、在mybatis-config.xml中添加mapper接口以及mapper文件

<mappers>
        <package name="com.jordan.mybatis.mapper"></package>
</mappers>

六、創建測試類Test.java

import com.jordan.mybatis.mapper.SysUserMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;

import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;

/**
 * @author Jordan
 * @create 
 * @DESCRIPTION
 */
public class Test {
    private  SqlSessionFactory sqlSessionFactory;
    @Before
    public void init() throws IOException{
        //1:讀取mybatis的主配置文件
        String configFile = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(configFile);
        //2:通過sqlSessionFactoryBuilder創建一個sqlSessionFactory
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    }
    @org.junit.Test
    public void testGetUserRolePrivilege(){
        SqlSession sqlSession=sqlSessionFactory.openSession();
        SysUserMapper sysUserMapper=sqlSession.getMapper(SysUserMapper.class);
        System.out.println(sysUserMapper.getUserRolePrivilege().size());    //4  查詢結果與數據庫查詢結果不匹配,發生數據覆蓋問題,解決辦法參考註意事項②
} }

七、註意事項:

①:idea找不到mapper文件的原因:IDEA不會編譯src的java目錄下的xml文件。所以添加如下代碼

      <resources>
          <!-- resources文件 -->
          <resource>
              <directory>src/main/resources</directory>
              <!-- 是否被過濾,如果被過濾則無法使用 -->
              <filtering>false</filtering>
          </resource>
          <!-- java文件夾 -->
          <resource>
              <directory>src/main/java</directory>
              <!-- 引入映射文件等 -->
              <includes>
                  <include>**/*.xml</include>
                  <include>**/*.properties</include>
              </includes>
          </resource>
          <resource>
              <directory>src/main/webapp</directory>
              <includes>
                  <include>**/*.*</include>
              </includes>
          </resource>
      </resources>

②:mybatis在映射依賴的過程中,如果兩個表中的主鍵是一樣的會發生數據覆蓋問題。

解決辦法: 

  解決方式一:修改數據庫表中的主鍵(這種方法比較麻煩);

  解決方式二:在查詢語句中修改一個表的主鍵使其不一致即可;

上述代碼測試結果中與數據庫中的查詢記錄不匹配

數據庫查詢結果為8條記錄,但是mybatis查詢只有4條數據,發生數據覆蓋的問題;

技術分享圖片

修改SysUserMapper.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="com.jordan.mybatis.mapper.SysUserMapper">
    <resultMap id="getUserRolePrivilege" type="SysUser">
        <id property="id" column="aid"></id>
        <result property="userName" column="user_name"></result>
        <result property="password" column="password"></result>
        <result property="userInfo" column="user_info"></result>
        <result property="createTime" column="create_time"></result>
        <collection property="sysRoleList" ofType="SysRole">
            <id property="id" column="bid"></id>
            <result property="roleName" column="role_name"></result>
            <result property="createTime" column="create_time"></result>
            <collection property="sysPrivilegeList" ofType="SysPrivilege">
                <id property="id" column="cid"></id>
                <result property="privilegeName" column="privilege_name"></result>
                <result property="privilegeUrl" column="privilege_url"></result>
            </collection>
        </collection>
    </resultMap>
    <select id="getUserRolePrivilege" resultMap="getUserRolePrivilege">
    select a.id,a.user_name,a.password,a.user_info,b.role_name,b.create_time,c.privilege_name,c.privilege_url from sys_user a,sys_role b,
    sys_privilege c,sys_user_role d,sys_role_privilege e  where a.id = d.user_id and b.id = d.role_id and e.role_id=b.id and e.privilege_id=c.id
    </select>
</mapper>

mybatis關聯查詢之一對多,多對一,以及多對多