为了账号安全,请及时绑定邮箱和手机立即绑定
慕课专栏

目录

索引目录

Spring Boot企业级微服务环境搭建

原价 ¥ 68.00

立即订阅
19 附录1 数据库模型、建表SQL以及POJO
更新时间:2019-06-12 14:41:51
什么是路?就是从没路的地方践踏出来的,从只有荆棘的地方开辟出来的。 

—— 鲁迅

为了让大家能够快速理解,我这里选择了了用户、角色和他们的关系表作为数据库的建表模型,目前互联网企业大部分使用MySQL,所以这里我也是使用MySQL,表之间的关系如附录图1所示。

![](appendix/appendix1.png)

附录图1 用户、角色和关系表

 
紧跟着就是建表SQL,如下所示:

drop database if exists ssm;
create database ssm;
use ssm;
drop table if exists t_role;
drop table if exists t_user;
drop table if exists t_user_role;
create table t_role
(
   id                   int not null auto_increment comment '角色编号',
   role_name            varchar(60) not null comment '角色名称',
   note                 varchar(512) comment '备注',
   primary key (id)
);

create table t_user
(
   id                   int not null auto_increment comment '用户编号',
   user_name           varchar(60) not null comment '用户名称',
   sex                  tinyint(3) not null default 1 comment '性别,字典项(0-女, 1-男)',
   note                 varchar(512) comment '备注',
   primary key (id)
);

create table t_user_role
(
   user_id              int(12) not null comment '用户编号',
   role_id              int(12) not null comment '角色编号',
   /* 注意此处为复合主键,user_id和role_id的顺序不能颠倒*/
   primary key (user_id, role_id)
);
/* 角色表数据 */
insert into t_role(role_name, note) values('role_1', 'note_1');
insert into t_role(role_name, note) values('role_2', 'note_2');
......
insert into t_role(role_name, note) values('role_10', 'note_10');
/* 用户表数据 */
insert into t_user(user_name, sex, note) values('user_name_1', 1, 'user_note_1');
insert into t_user(user_name, sex, note) values('user_name_2', 0, 'user_note_2');
......
insert into t_user(user_name, sex, note) values('user_name_500', 0, 'user_note_500');
/* 用户角色表数据 */
insert into t_user_role values(1, 1);
insert into t_user_role values(1, 3);
insert into t_user_role values(2, 2);
insert into t_user_role values(2, 3);
insert into t_user_role values(3, 1);
insert into t_user_role values(3, 2);

 
注意到用户角色表(t_user_role)的主键是一个复合主键,在建表的时候不要将主键设置为(role_id, user_id)。这是因为在大部分的场景下是通过用户编号(user_id)去查找用户角色信息的,如果主键是(user_id, role_id),使用user_id查找,则会启用主键的索引,就可以快速找到数据;倘若主键是(role_id, user_id)时,使用user_id查找,则主键索引就会失效,就要进行全表检索了,显然性能就会大打折扣了,因此这里是不能将两者顺序颠倒的。
 
有了表,我们来建POJO,如下所示:
 

/******************** 角色POJO ********************/
package com.imooc.ssm.pojo;
import org.apache.ibatis.type.Alias;
import java.io.Serializable;
@Alias("role") // MyBatis别名
public class Role implements Serializable {
    private static final long serialVersionUID = 23219283918391L;
    private Long id;
    private String roleName;
    private String note;
    /** setter and getters **/
}

/******************** 用户POJO ********************/
package com.imooc.ssm.pojo;
import org.apache.ibatis.type.Alias;
import java.io.Serializable;
@Alias("user") // MyBatis别名
public class User implements Serializable {
    private static final long serialVersionUID = -2323297841948476564L;
    private Long id;
    private String userName;
    private SexEnum sex; // 枚举,将来需要MyBatis的typeHandler进行转换
    private String note;
    /** setter and getters **/
}

/******************** 用户角色POJO ********************/
package com.imooc.ssm.pojo;
import org.apache.ibatis.type.Alias;
import java.io.Serializable;
import java.util.List;
@Alias("user_role")// MyBatis别名
public class UserRole implements Serializable {
    private static final long serialVersionUID = 3876141358797784545L;
    private Long userId;
    private Long roleId;
    private String userName;
    private String roleName;
    private String note;
    /**** setter and getter **/
} 

 
这里可以看到都实现了Serializable接口,它是一个序列化而接口,意思为可以将Java对象通过某种序列化方案变为二进制的字符流,从而保存起来,比如保存到Redis中;在有必要的时候,也可以将这些二进制的字符流读取出来,然后通过反序列化,把它们还原为Java的对象。
 
而属性serialVersionUID则是一个长整型,它的作用是验证,当反序列化回来的时候,序列化机制就会验证二进制字符流中的serialVersionUID和POJO中的是否一致,如果不一致则抛出InvalidCalssException异常。因为我们将来会将这些对象通过序列化保存到Redis中,所以这里建POJO的时,就要实现序列化了。
 
 

}
立即订阅 ¥ 68.00

你正在阅读课程试读内容,订阅后解锁课程全部内容

千学不如一看,千看不如一练

手机
阅读

扫一扫 手机阅读

Spring Boot企业级微服务环境搭建
立即订阅 ¥ 68.00

举报

0/150
提交
取消
意见反馈 邀请有奖 帮助中心 APP下载
官方微信