第七章:jpa+thymeleaf增删改查

配置文件

pom包配置

pom包里面添加jpa和thymeleaf的相关包引用

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

在application.properties中添加配置 

spring.datasource.url=jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=hzx
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
spring.thymeleaf.cache=false
server.servlet.context-path=/crm

 启动类

@SpringBootApplication
public class Ch07Application {

    public static void main(String[] args) {
        SpringApplication.run(Ch07Application.class, args);
    }

}

数据库层代码

package com.bdqn.ch07.pojo;

import jakarta.persistence.*;

import java.io.Serializable;

@Entity
@Table(name = "sys_user")
public class SysUser implements Serializable {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(name = "usr_id")
  private Long usrId;
  @Column(name = "usr_name")
  private String usrName;
  @Column(name = "usr_password")
  private String usrPassword;
  @ManyToOne(targetEntity = SysRole.class)
  @Column(name = "usr_role_id")
  private SysRole role;
  @Column(name = "usr_flag")
  private Long usrFlag;


  public Long getUsrId() {
    return usrId;
  }

  public void setUsrId(Long usrId) {
    this.usrId = usrId;
  }


  public String getUsrName() {
    return usrName;
  }

  public void setUsrName(String usrName) {
    this.usrName = usrName;
  }


  public String getUsrPassword() {
    return usrPassword;
  }

  public void setUsrPassword(String usrPassword) {
    this.usrPassword = usrPassword;
  }


  public Long getUsrFlag() {
    return usrFlag;
  }

  public void setUsrFlag(Long usrFlag) {
    this.usrFlag = usrFlag;
  }

}

业务层处理


public class SysUserServiceImpl implements SysUserService {
    @Override
    public SysUser login(String usrName, String usrPassword) {
        return null;
    }

    @Override
    public void saveUser(SysUser user) {

    }

    @Override
    public void deleteUser(Long usrId) {

    }

    @Override
    public SysUser getUser(Long usrId) {
        return null;
    }

    @Override
    public Page<SysUser> findUsers(String usrName, Long roleId, Pageable pageable) {
        Specification<SysUser> specification = new Specification<SysUser>(){
            @Override
            public jakarta.persistence.criteria.Predicate toPredicate(Root<SysUser> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
                List<Predicate>predicates = new ArrayList<>();
                if (usrName != null && !usrName.equals("")){
                    predicates.add((Predicate) criteriaBuilder.like(root.get("usrName"),"%"+usrName+"%"));
                }
                if (roleId != null && roleId.longValue()!=01){
                    SysRole role = new SysRole();
                    role.setRoleId(roleId);
                    predicates.add(criteriaBuilder.equal(root.get("role"), role));
                }
                return criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()]));
            }
        };
        return userRepository.findAll(specification,pageable);
    }

Controller负责接收请求,处理完后将页面内容返回给前端。

public class UserController {
    @Resource
    private UserService userService;

    @RequestMapping(value = "/dologin")
    public String dologin(String usrName, String usrPassword, HttpSession request) {
        User user = userService.login(usrName, usrPassword);
        if (user!= null) {
            request.setAttribute("loginUser", user);
            return "main";
        } else {
            request.setAttribute("message", "用户名或密码错误");
            return "login";
        }
    }
    @RequestMapping(value = "/logout")
    public String logout(HttpSession session) {
        session.removeAttribute("loginUser");
        return "login";
    }
    @GetMapping(value = "/user/list")
    public String findUsers(String usrName, Long roleId, Model model) {
        List<User> list=userService.findAllUsers();
        model.addAttribute("users",list);
        return "/user/list";
    }

 页面内容

add.html<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.w3.org/1999/xhtml" layout:decorate="~{main}"
      xmlns:layout="http://www.ultraq.net.nz/web/thymeleaf/layout"
>
<head>
    <title>用户管理</title>
    <link th:href="@{/localcss/crmlist.css}" href="../../static/localcss/crmlist.css" rel="stylesheet">
</head>
<body>
<div layout:fragment="content">
    <div class="">
        <div class="clearfix"></div>
        <div class="row">
            <div class="col-md-12">
                <div class="x_panel">
                    <div class="x_title">
                        <h2>
                            用户管理 <i class="fa fa-user"></i>
                            <small>
                                - 您可以通过搜索或者其他的筛选项对用户的信息进行编辑、删除等管理操作。^_^
                            </small>
                        </h2>
                        <div class="clearfix"></div>
                    </div>
                    <div class="x_content">
                        <form method="post" action="/user/list" th:action="@{/user/list}">
                            <input type="hidden" name="pageIndex" value="1" />
                            <ul>
                                <li>
                                    <div class="form-group">
                                        <label class="control-label col-md-3 col-sm-3 col-xs-12">用户名称</label>
                                        <div class="col-md-6 col-sm-6 col-xs-12">
                                            <input name="usrName" type="text" th:value="${usrName}"
                                                   class="form-control col-md-6 col-xs-12" value="">
                                        </div>
                                    </div>
                                </li>
                                <li>
                                    <div class="form-group">
                                        <label class="control-label col-md-3 col-sm-3 col-xs-12">角色</label>
                                        <div class="col-md-6 col-sm-6 col-xs-12">
                                            <select name="roleId" id="roleId" class="form-control">
                                                <option value="0">--请选择--</option>
                                                <option th:selected="${role.roleId eq roleId}" th:each="role : ${roles}"
                                                        th:value="${role.roleId}" th:text="${role.roleName}" value="">
                                                    角色1
                                                </option>
                                            </select>
                                        </div>
                                    </div>
                                </li>
                                <li>
                                    <button type="submit" class="btn btn-primary"> 查&nbsp;&nbsp;&nbsp;&nbsp;询
                                    </button>
                                </li>
                            </ul>
                        </form>
                    </div>
                </div>
            </div>
            <div class="col-md-12 col-sm-12 col-xs-12">
                <div class="x_panel">
                    <div class="x_content">
                        <p class="text-muted font-13 m-b-30"></p>
                        <div id="datatable-responsive_wrapper"
                             class="dataTables_wrapper form-inline dt-bootstrap no-footer">
                            <div class="row">
                                <div class="col-sm-12">
                                    <a href="/user/add" th:href="@{/user/add}" class="btn btn-success btn-sm">新增用户信息</a>
                                    <table id="datatable-responsive"
                                           class="table table-striped table-bordered dt-responsive nowrap dataTable no-footer dtr-inline collapsed"
                                           cellspacing="0" width="100%" role="grid"
                                           aria-describedby="datatable-responsive_info" style="width: 100%;">
                                        <thead>
                                        <tr role="row">
                                            <th class="sorting_asc" tabindex="0"
                                                aria-controls="datatable-responsive" rowspan="1" colspan="1"
                                                aria-label="First name: activate to sort column descending"
                                                aria-sort="ascending">编号
                                            </th>
                                            <th class="sorting" tabindex="0"
                                                aria-controls="datatable-responsive" rowspan="1" colspan="1"
                                                aria-label="Last name: activate to sort column ascending">
                                                用户名
                                            </th>
                                            <th class="sorting" tabindex="0"
                                                aria-controls="datatable-responsive" rowspan="1" colspan="1"
                                                aria-label="Last name: activate to sort column ascending">
                                                角色
                                            </th>
                                            <th class="sorting" tabindex="0"
                                                aria-controls="datatable-responsive" rowspan="1" colspan="1"
                                                aria-label="Last name: activate to sort column ascending">
                                                操作
                                            </th>
                                        </tr>
                                        </thead>
                                        <tbody>
                                        <tr role="row" class="odd" th:each="user : ${userPager.records}">
                                            <td tabindex="0" class="sorting_1" th:text="${user.usrId}">usrId</td>
                                            <td th:text="${user.usrName}">usrName</td>
                                            <td th:text="${user.role.roleName}">roleName</td>
                                            <td>
                                                <div class="btn-group">
                                                    <button type="button" class="btn btn-danger">点击操作</button>
                                                    <button type="button" class="btn btn-danger dropdown-toggle"
                                                            data-toggle="dropdown" aria-expanded="false">
                                                        <span class="caret"></span>
                                                        <span class="sr-only">Toggle Dropdown</span>
                                                    </button>
                                                    <ul class="dropdown-menu" role="menu">
                                                        <li><a class="editInfo"
                                                               href="/user/edit?usrId=1"
                                                               th:href="@{/user/edit(usrId=${user.usrId})}"
                                                               data-toggle="tooltip"
                                                               data-placement="top" title=""
                                                               data-original-title="编辑">编辑</a>
                                                        </li>
                                                        <li><a class="delInfo" id="del" href="#"
                                                               th:onclick="|doDel(this,${user.usrId})|"
                                                               data-toggle="tooltip" data-placement="top" title=""
                                                               data-original-title="删除">删除</a></li>
                                                    </ul>
                                                </div>
                                            </td>
                                        </tr>
                                        </tbody>
                                    </table>
                                </div>
                            </div>
                            <div class="row">
                                <div class="col-sm-5">
                                    <div class="dataTables_info" id="datatable-responsive_info"
                                         role="status" aria-live="polite">共<span th:text="${userPager.total }">1</span>条记录
                                        <span th:text="${userPager.current }">1</span>/<span
                                                th:text="${userPager.pages }">1</span>页
                                    </div>
                                </div>
                                <div class="col-sm-7">
                                    <div class="dataTables_paginate paging_simple_numbers"
                                         id="datatable-responsive_paginate">
                                        <ul class="pagination">
                                            <li class="paginate_button previous" th:if="${userPager.current gt 0}"><a
                                                    href="javascript:page_nav(document.forms[0],1);"
                                                    aria-controls="datatable-responsive" data-dt-idx="0"
                                                    tabindex="0">首页</a>
                                            </li>
                                            <li class="paginate_button" th:if="${userPager.current gt 1}"><a href="#" th:onclick="'javascript:page_nav(document.forms[0],'+${userPager.current - 1 }+');'"
                                                                                                             aria-controls="datatable-responsive"
                                                                                                             data-dt-idx="1"
                                                                                                             tabindex="0">上一页</a>
                                            </li>
                                            <li class="paginate_button "
                                                th:if="${(userPager.current) lt userPager.pages}"><a
                                                    href="#"
                                                    th:onclick="'javascript:page_nav(document.forms[0],'+${userPager.current + 1 }+');'"
                                                    aria-controls="datatable-responsive" data-dt-idx="1"
                                                    tabindex="0">下一页</a>
                                            </li>
                                            <li class="paginate_button next"
                                                th:if="${(userPager.current) lt userPager.total}"><a
                                                    href="#"
                                                    th:onclick="'javascript:page_nav(document.forms[0],'+${userPager.pages }+');'"
                                                    aria-controls="datatable-responsive" data-dt-idx="7"
                                                    tabindex="0">最后一页</a>
                                            </li>
                                        </ul>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>
</body>
<script layout:fragment="js" th:inline="javascript">
    function doDel(obj, usrId) {
        if (confirm("你确定需要删除该用户信息吗?")) {
            $.ajax({
                type: "POST",
                url: ctxPath + "user/del/" + usrId,
                dataType: "text",
                success: function (data) {
                    if (data === "true") { // 删除成功:移除删除行
                        alert("删除成功!");
                        $(obj).parents("tr").remove();
                    }
                },
                error: function (data) {
                    alert("对不起,删除失败!");
                }
            });
        }
    }
</script>
</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值