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

 2023-10-18 阅读 28 评论 0

摘要:一、使用IDEA新建maven工程 二、引入mybatis以及相關的jar <!--版本僅供參考--><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency><d

一、使用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文件

sql語句一對多查詢、  ①:創建mybatis-config.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//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;}@Overridepublic 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;}@Overridepublic 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();}@Overridepublic String toString() {return "SysPrivilege{" +"id=" + id +", privilegeName='" + privilegeName + '\'' +", privilegeUrl='" + privilegeUrl + '\'' +'}';}
}
View Code

  ⑤:SysUserMapper

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

mybatis自關聯。  ⑥:SysUserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//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;@Beforepublic void init() throws IOException{//1:讀取mybatis的主配置文件String configFile = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(configFile);//2:通過sqlSessionFactoryBuilder創建一個sqlSessionFactorysqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);}@org.junit.Testpublic void testGetUserRolePrivilege(){SqlSession sqlSession=sqlSessionFactory.openSession();SysUserMapper sysUserMapper=sqlSession.getMapper(SysUserMapper.class);System.out.println(sysUserMapper.getUserRolePrivilege().size());    //4  查詢結果與數據庫查詢結果不匹配,發生數據覆蓋問題,解決辦法參考注意事項②
     
sqlSession.close();
} }

七、注意事項:

①: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在映射依賴的過程中,如果兩個表中的主鍵是一樣的會發生數據覆蓋問題。

解決辦法: ?

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

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

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

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

mybatis多表查詢。修改SysUserMapper.xml文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//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>

?

轉載于:https://www.cnblogs.com/crazylover/p/10568289.html

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/2/149429.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息