一、问题背景
先数据库有用户表user、角色表role、菜单表menu、功能表funs和角色菜单关系表role_menu。
各表的字段及数据如下
用户user表
角色role表
角色菜单关系表role_menu
菜单menu表
功能funs表
二、实际问题
- 表与表之间的关系
- 类与类之间的关系
- 四表连查 user、role、menu、funs、role_menu,通过username来进行查询用户信息、对应的角色信息、角色对应的菜单信息及菜单底下的功能。
三、问题解决
一、数据库的表之间的关系
1.一个user对应一个role 一个role 对应多个user
user对role 是多对一关系
role对user是一对多关系
2.一个role对应多个menu,一个menu对应多个role
memu和role是多对多关系
3.一个menu对应多个fun 一个fun对应一个menu
menue对fun 是一对多关系
fun对menu 是多对一关系
二、pojo实体类的关系
1.user和role两个实体类的关系
user类:因为一个user对应一个role,所以user中除了本表的字段,还应该包含role对象的引用
role类:因为一个role对应多个user,所以role类中应该存放user的一个集合。
2.role和menu两个实体类关系
因为role和menu是多对多的关系,所以两个类中均应该含有对方的集合属性
3.menu和funs俩个实体类关系
menu:因为一个munu对应多个fun所以menu中应该含有fun的集合
funs:因为funs对应一个menu,所以funs中含有一个menu引用
各实体类的属性及互相持有的引用如下
用户User类
public class User {
private String id;
private String username;
private String password;
private Integer roleId;
private String iconURL;
//role对象
private Role role;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getRoleId() {
return roleId;
}
public void setRoleId(Integer roleId) {
this.roleId = roleId;
}
public String getIconURL() {
return iconURL;
}
public void setIconURL(String iconURL) {
this.iconURL = iconURL;
}
public Role getRole() {
return role;
}
public void setRole(Role role) {
this.role = role;
}
}
角色Role类
public class Role {
private Integer roleId;
private String roleName;
private List<User> users;
private List<Menu> menus;
public List<Menu> getMenus() {
return menus;
}
public void setMenus(List<Menu> menus) {
this.menus = menus;
}
public Integer getRoleId() {
return roleId;
}
public void setRoleId(Integer roleId) {
this.roleId = roleId;
}
public String getRoleName() {
return roleName;
}
public void setRoleName(String roleName) {
this.roleName = roleName;
}
public List<User> getUsers() {
return users;
}
public void setUsers(List<User> users) {
this.users = users;
}
}
菜单Menu类
public class Menu {
private Integer menuId;
private String menuName;
private String menuURL;
private Integer fatherId;
private List<Role> roles;
private List<Funs> funs;
public Integer getMenuId() {
return menuId;
}
public void setMenuId(Integer menuId) {
this.menuId = menuId;
}
public String getMenuName() {
return menuName;
}
public void setMenuName(String menuName) {
this.menuName = menuName;
}
public String getMenuURL() {
return menuURL;
}
public void setMenuURL(String menuURL) {
this.menuURL = menuURL;
}
public Integer getFatherId() {
return fatherId;
}
public void setFatherId(Integer fatherId) {
this.fatherId = fatherId;
}
public List<Role> getRoles() {
return roles;
}
public void setRoles(List<Role> roles) {
this.roles = roles;
}
public List<Funs> getFuns() {
return funs;
}
public void setFuns(List<Funs> funs) {
this.funs = funs;
}
}
功能Funs类
public class Funs {
private Integer funId;
private String funName;
private String funURL;
private Integer menuId;
private Menu menu;
public Integer getFunId() {
return funId;
}
public void setFunId(Integer funId) {
this.funId = funId;
}
public String getFunName() {
return funName;
}
public void setFunName(String funName) {
this.funName = funName;
}
public String getFunURL() {
return funURL;
}
public void setFunURL(String funURL) {
this.funURL = funURL;
}
public Integer getMenuId() {
return menuId;
}
public void setMenuId(Integer menuId) {
this.menuId = menuId;
}
public Menu getMenu() {
return menu;
}
public void setMenu(Menu menu) {
this.menu = menu;
}
}
四、sql语句与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.openlab.mapper.UserMapper">
<!--SQL语句进行四表联查-->
<select id="queryByUserName" resultMap="userMapping">
SELECT
u.id,u.username,u.password,
r.roleId,r.roleName,
m.menuId,m.menuName,m.menuURL,
f.funId,f.funName,f.funURL
FROM
user u
LEFT JOIN role r
ON u.roleId=r.roleId
LEFT JOIN role_menu rm
ON r.roleId = rm.roleId
LEFT JOIN menu m
ON rm.menuId=m.menuId
LEFT JOIN funs f
ON m.menuId=f.menuId
WHERE u.username LIKE concat('%',#{username},'%')
</select>
<!--定义user的映射-->
<resultMap id="userMapping" type="User">
<id column="id" property="id"></id>
<result column="username" property="username"></result>
<result column="password" property="password"></result>
<association property="role" javaType="Role" resultMap="roleMapping"></association>
</resultMap>
<!--定义role的映射-->
<resultMap id="roleMapping" type="Role">
<id column="roleId" property="roleId"></id>
<result column="roleName" property="roleName"></result>
<collection property="menus" ofType="Menu" resultMap="menuMapping"></collection>
</resultMap>
<!--定义menu的映射-->
<resultMap id="menuMapping" type="Menu">
<id column="menuId" property="menuId"></id>
<result column="menuName" property="menuName"></result>
<result column="menuURL" property="menuURL"></result>
<collection property="funs" ofType="Funs" resultMap="funsMapping"></collection>
</resultMap>
<!--定义funs的映射-->
<resultMap id="funsMapping" type="Funs">
<id column="funId" property="funId"></id>
<result column="funName" property="funName"></result>
<result column="funURL" property="funURL"></result>
</resultMap>
</mapper>
五、测试
Junit测试
public class Test {
@org.junit.Test
public void testUserMapper() throws IOException {
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSession sqlSession = new SqlSessionFactoryBuilder().build(is).openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.queryByUserName("zhangsan");
System.out.println("----用户表信息----");
System.out.println(user.getId()+"\t"+user.getUsername()+"\t"+user.getPassword());
System.out.println();
System.out.println("----角色信息----");
Role role =user.getRole();
System.out.println(role.getRoleId()+"\t"+role.getRoleName());
List<Menu> menus = role.getMenus();
System.out.println();
System.out.println("----角色对应的总菜单----");
System.out.println();
for (Menu menu : menus) {
System.out.println("菜单:"+menu.getMenuId()+"\t"+menu.getMenuName()+"\t"+menu.getMenuURL());
System.out.println("----"+menu.getMenuName()+"菜单对应的功能表信息----");
List<Funs> funs = menu.getFuns();
for (Funs fun : funs) {
System.out.println(fun.getFunId()+"\t"+fun.getFunName()+"\t"+fun.getFunURL());
}
System.out.println();
}
}
}
测试结果如下图
"C:\Program Files\Java\jdk1.8.0_77\bin\java" -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:D:\IDEA\IntelliJ IDEA 2017.3.4\lib\idea_rt.jar=54629:D:\IDEA\IntelliJ IDEA 2017.3.4\bin" -Dfile.encoding=UTF-8 -classpath "D:\IDEA\IntelliJ IDEA 2017.3.4\lib\idea_rt.jar;D:\IDEA\IntelliJ IDEA 2017.3.4\plugins\junit\lib\junit-rt.jar;D:\IDEA\IntelliJ IDEA 2017.3.4\plugins\junit\lib\junit5-rt.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\rt.jar;C:\Users\上杉\IdeaProjects\JavaBaseTest\MavenDemo\target\classes;D:\IDEA\IntelliJ IDEA 2017.3.4\lib\hamcrest-core-1.3.jar;D:\IDEA\IntelliJ IDEA 2017.3.4\lib\junit-4.12.jar;E:\Maven\apache-maven-3.5.2\mavenworkspace\junit\junit\4.11\junit-4.11.jar;E:\Maven\apache-maven-3.5.2\mavenworkspace\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;E:\Maven\apache-maven-3.5.2\mavenworkspace\mysql\mysql-connector-java\5.1.6\mysql-connector-java-5.1.6.jar;E:\Maven\apache-maven-3.5.2\mavenworkspace\org\mybatis\mybatis\3.4.1\mybatis-3.4.1.jar;E:\Maven\apache-maven-3.5.2\mavenworkspace\org\mybatis\generator\mybatis-generator-maven-plugin\1.3.5\mybatis-generator-maven-plugin-1.3.5.jar;E:\Maven\apache-maven-3.5.2\mavenworkspace\org\apache\maven\maven-plugin-api\3.3.9\maven-plugin-api-3.3.9.jar;E:\Maven\apache-maven-3.5.2\mavenworkspace\org\apache\maven\maven-model\3.3.9\maven-model-3.3.9.jar;E:\Maven\apache-maven-3.5.2\mavenworkspace\org\codehaus\plexus\plexus-utils\3.0.22\plexus-utils-3.0.22.jar;E:\Maven\apache-maven-3.5.2\mavenworkspace\org\apache\commons\commons-lang3\3.4\commons-lang3-3.4.jar;E:\Maven\apache-maven-3.5.2\mavenworkspace\org\apache\maven\maven-artifact\3.3.9\maven-artifact-3.3.9.jar;E:\Maven\apache-maven-3.5.2\mavenworkspace\org\eclipse\sisu\org.eclipse.sisu.plexus\0.3.2\org.eclipse.sisu.plexus-0.3.2.jar;E:\Maven\apache-maven-3.5.2\mavenworkspace\javax\enterprise\cdi-api\1.0\cdi-api-1.0.jar;E:\Maven\apache-maven-3.5.2\mavenworkspace\javax\annotation\jsr250-api\1.0\jsr250-api-1.0.jar;E:\Maven\apache-maven-3.5.2\mavenworkspace\javax\inject\javax.inject\1\javax.inject-1.jar;E:\Maven\apache-maven-3.5.2\mavenworkspace\org\eclipse\sisu\org.eclipse.sisu.inject\0.3.2\org.eclipse.sisu.inject-0.3.2.jar;E:\Maven\apache-maven-3.5.2\mavenworkspace\org\codehaus\plexus\plexus-component-annotations\1.5.5\plexus-component-annotations-1.5.5.jar;E:\Maven\apache-maven-3.5.2\mavenworkspace\org\codehaus\plexus\plexus-classworlds\2.5.2\plexus-classworlds-2.5.2.jar;E:\Maven\apache-maven-3.5.2\mavenworkspace\org\mybatis\generator\mybatis-generator-core\1.3.5\mybatis-generator-core-1.3.5.jar" com.intellij.rt.execution.junit.JUnitStarter -ideVersion5 -junit4 com.openlab.test.Test,testUserMapper
----用户表信息----
00001 zhangsan 1231230
----角色信息----
1 管理员
----角色对应的总菜单----
菜单:1 系统菜单 null
----系统菜单菜单对应的功能表信息----
1 主页 index.jsp
2 头页面 header.jsp
3 菜单页面 menu.jsp
4 操作页面 body.jsp
5 底页面 footer.jsp
6 成功页面 ok.jsp
7 错误页面 error.jsp
8 角色错误页面 norole.jsp
菜单:2 用户管理 null
----用户管理菜单对应的功能表信息----
菜单:3 添加用户 register.jsp
----添加用户菜单对应的功能表信息----
50 添加用户页面 register.jsp
51 添加用户的动作 registerServlet.do
菜单:4 查询用户 body.jsp
----查询用户菜单对应的功能表信息----
60 查询用户页面 body.jsp
61 查询用户动作 registerServlet.do
62 显示用户页面 body.jsp
63 预更新用户查询动作 preUpdata.do
64 更新用户页面 updataUser.jsp
65 更新用户动作 updataUser.do
66 删除用户动作 deleteUser.do
菜单:5 商品管理 null
----商品管理菜单对应的功能表信息----
菜单:6 添加商品 addGoods.jsp
----添加商品菜单对应的功能表信息----
70 添加商品页面 addProduct.jsp
71 添加商品动作 addProduct.do
菜单:7 查询商品 findGoods.jsp
----查询商品菜单对应的功能表信息----
80 查询商品页面 findProduct.jsp
81 查询商品动作 findProduct.do
82 预更新商品动作 preUpdataProduct.do
83 显示更新商品页面 updataProduct.jsp
84 更新商品动作 updataProduct.do
85 删除商品动作 deleteProduct.do
菜单:8 查看购物车 null
----查看购物车菜单对应的功能表信息----
菜单:9 购物车 shopping.jsp
----购物车菜单对应的功能表信息----
90 查看购物车页面 findcar.jsp
Process finished with exit code 0