springboot关联查询一对一

我们要实现的功能是让除了角色里面的信息,其他的全部显示出来,角色涉及到多对多了。
也就是我们最终要让这个东西最终一对一的展现在这个界面上
在这里插入图片描述
两个实体类也就是两张表,我们可以不用创建表,她一般会自动生成,关键是这个的表与表的映射关系

新建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">&#xe605;</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">&#xe605;</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">&#xe601;</i>
                </a>
                <a title="编辑"  onclick="x_admin_show('编辑','admin-edit.html')" href="javascript:;">
                    <i class="layui-icon">&#xe642;</i>
                </a>
                <a title="删除" onclick="member_del(this,'要删除的id')" href="javascript:;">
                    <i class="layui-icon">&#xe640;</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">&#xe601;</i>
                </a>
                <a title="编辑"  onclick="x_admin_show('编辑','admin-edit.html')" href="javascript:;">
                    <i class="layui-icon">&#xe642;</i>
                </a>
                <a title="删除" onclick="member_del(this,'要删除的id')" href="javascript:;">
                    <i class="layui-icon">&#xe640;</i>
                </a>
            </td>
        </tr>
        </tbody>
    </table>
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

轩成笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值