我们要实现的功能是让除了角色里面的信息,其他的全部显示出来,角色涉及到多对多了。
也就是我们最终要让这个东西最终一对一的展现在这个界面上
两个实体类也就是两张表,我们可以不用创建表,她一般会自动生成,关键是这个的表与表的映射关系
新建UserDetail
/**
* 登录用户详细信息实体类
*/
@Table
@Entity
public class UserDetail {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer udId;
@Column
private String tel;
@Column
private String email;
//头像路径
@Column
private String url;
@Column
private Date joinTime;
//是否启用
@Column
private Integer status;
//mappedBy 值是主表的附表对象属性
@OneToOne(mappedBy = "userDetail")
private UserInfo userInfo;
userInfo的实体类
@Table
@Entity
public class UserInfo implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer uId;
@Column(length = 33, unique = true)
private String userName;
@Column
private String userPwd;
//一对一关系配置
//CascadeType.REMOVE 级联删除
//CascadeType.MERGE 级联修改和添加
//CascadeType.PERSIST 级联查询
//CascadeType.ALL 所有权限
@OneToOne(cascade = {CascadeType.REMOVE,CascadeType.MERGE,CascadeType.PERSIST})
//JoinColumn 配置一对一表关系的外键
// name="主表关联副表的的外键" referencedColumnName="附表的主键id属性"
@JoinColumn(name="ud_id",referencedColumnName = "udId")
private UserDetail userDetail;
一些解释
@Entity ---- 必选的注解,声明这个类对应了一个数据库表;
@Table(name = “user_info”) ---- 可选的注解,声明了实体对应的表信息,包括表名称、索引等,如果没有指定,则表名是单词+下划线+单词组合;
@Id ---- 声明实体唯一标识对应的属性;
@GeneratedValue(strategy = GenerationType.IDENTITY) ---- Jpa 通用策略生成器;
TABLE:使用一个特定的数据库表格来保存主键;
SEQUENCE:在某些数据库中不支持主键自增长,比如 Oracle,其提供了一种叫做“序列(sequence)”的机制生成主键;
IDENTITY:主键由数据库以自增的方式自动生成 ;
AUTO:主键由程序控制
@Column(length = 33, unique = true) ---- 声明实体属性的表字段的定义,默认的实体每个属性都对应了表的一个字段,字段的名称默认驼峰转下划线,在全局配置中配置策略,字段的类型根据实体属性类型自动推断,这里主要是声明了字符字段的长度,如果不这么声明,则系统会采用 255 作为该字段的长度;unique = true 唯一约束
@Transient ---- 声明该属性不参与和数据库的映射;
service层
List<UserInfo> selectAll();
serviceImpl具体
@Override
public List<UserInfo> selectAll() {
return userInfoDao.findAll();
}
控制层
@RequestMapping("/list")
public String list(Model model){
List<UserInfo> userInfoList = userInfoService.selectAll();
model.addAttribute("list",userInfoList);
return "/userInfo/list";
}
我们控制层传是通过Model传的,model.addAttribute(“list”,userInfoList);
我们也可以用,效果是一样的
@RequestMapping("/list")
public HashMap<String, Object> list(){
List<UserInfo> userInfoList = userInfoService.selectAll();
HashMap<String, Object> map = new HashMap<>();
map.put("list",userInfoList )
return "/userInfo/list";
}
前端
<table class="layui-table">
<thead>
<tr>
<th>
<div class="layui-unselect header layui-form-checkbox" lay-skin="primary"><i class="layui-icon"></i></div>
</th>
<th>ID</th>
<th>登录名</th>
<th>手机</th>
<th>邮箱</th>
<th>角色</th>
<th>加入时间</th>
<th>状态</th>
<th>操作</th>
</thead>
<tbody>
<tr th:each="x:${list}">
<td>
<div class="layui-unselect layui-form-checkbox" lay-skin="primary" data-id='2'><i class="layui-icon"></i></div>
</td>
<td th:text="${x.uId}"></td>
<td th:text="${x.userName}"></td>
<td th:text="${x.userDetail.tel}"></td>
<td th:text="${x.userDetail.email}"></td>
<td>
<ul th:each="y:${x.roleInfoList}">
<li th:text="${y.rName}" style="float: left;margin: 5px"> </li>
</ul>
</td>
<td th:text="${x.userDetail.joinTime}"></td>
<td class="td-status" th:if="${x.userDetail.status==1}">
<span class="layui-btn layui-btn-normal layui-btn-mini">启用</span>
</td>
<td class="td-status" th:if="${x.userDetail.status==0}">
<span class="layui-btn layui-btn-normal layui-btn-mini layui-btn-disabled">停用</span>
</td>
<td class="td-manage" th:if="${x.userDetail.status==1}">
<a onclick="member_stop(this)" href="javascript:;" title="启用">
<i class="layui-icon"></i>
</a>
<a title="编辑" onclick="x_admin_show('编辑','admin-edit.html')" href="javascript:;">
<i class="layui-icon"></i>
</a>
<a title="删除" onclick="member_del(this,'要删除的id')" href="javascript:;">
<i class="layui-icon"></i>
</a>
</td>
<td class="td-manage" th:if="${x.userDetail.status==0}">
<a onclick="member_stop(this)" href="javascript:;" title="停用">
<i class="layui-icon"></i>
</a>
<a title="编辑" onclick="x_admin_show('编辑','admin-edit.html')" href="javascript:;">
<i class="layui-icon"></i>
</a>
<a title="删除" onclick="member_del(this,'要删除的id')" href="javascript:;">
<i class="layui-icon"></i>
</a>
</td>
</tr>
</tbody>
</table>