【原】无脑操作:IDEA + maven + SpringBoot + JPA + EasyUI实现CRUD及分页
背景:上一篇文章的界面太丑、没有条件查询功能。所以做一些改进,整合EasyUI做实现。(仅以此文纪念表格中出现的这些朋友工作六周年,祭奠一下逝去的青春^_^)
一、开发环境(参照上一篇文章)
补充:EasyUI直接从官网随便下载一个版本即可,本文用的版本是 1.3.3
二、程序结构:java目录下都是服务端代码,resources目录下templates目录存放页面文件,static目录下存放JavaScript文件、CSS文件、图片等资源文件

三、具体实现(Talk is cheap.Show your my code.该写的注释都在代码中^_^)
1、pom.xml(同上一篇)
2、resources目录下新建application.properties(当然喜欢用yaml的可以用yaml)(同上一篇)
3、创建SpringBoot程序启动类SpringbootApplication.java(同上一篇)
4、创建实体类Person.java
package cn.temptation.model; import javax.persistence.*; //建库建表
//DROP TABLE person;
//
//CREATE TABLE person
//(
//personid INT AUTO_INCREMENT PRIMARY KEY,
//personname VARCHAR(10) NOT NULL,
//personage INT NOT NULL
//);
//
//INSERT INTO person VALUES
//(NULL, '张洋', 21), (NULL, '张兄家', 20), (NULL, '王生杰', 22),
//(NULL, '洪自军', 21), (NULL, '吴庆庆', 21), (NULL, '武建昌', 22), (NULL, '叶宇', 18);
//
//SELECT * FROM person;
@Entity
@Table(name = "person")
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "personid")
private Integer personid;
@Column(name = "personname")
private String personname;
@Column(name = "personage")
private Integer personage; public Person() {
} public Person(String personname, Integer personage) {
this.personname = personname;
this.personage = personage;
} public Integer getPersonid() {
return personid;
} public void setPersonid(Integer personid) {
this.personid = personid;
} public String getPersonname() {
return personname;
} public void setPersonname(String personname) {
this.personname = personname;
} public Integer getPersonage() {
return personage;
} public void setPersonage(Integer personage) {
this.personage = personage;
}
}
5、创建DAO接口PersonDao.java
package cn.temptation.dao; import cn.temptation.model.Person;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor; /**
* 因为需要使用分页和条件查询,所以从JpaRepository接口 和 JpaSpecificationExecutor接口继承
*/
public interface PersonDao extends JpaRepository<Person, Integer>, JpaSpecificationExecutor<Person> { }
6、创建控制器类PersonController.java
package cn.temptation.web; import cn.temptation.dao.PersonDao;
import cn.temptation.model.Person;
import cn.temptation.util.TypeUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody; import javax.persistence.criteria.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map; @Controller
@RequestMapping("/person")
public class PersonController {
@Autowired
private PersonDao personDao; /**
* 跳转至列表页
*
* @return
*/
@RequestMapping("/view")
public String view() {
// 跳转至列表页
return "personlist";
} /**
* 查询列表信息
*
* @param searchcondition 查询条件
* @param searchcontent 查询内容
* @param page 页数
* @param rows 每页记录数
* @return
*/
@RequestMapping("/list")
@ResponseBody
public Map<String, Object> list(@RequestParam(value = "searchcondition", required = false) String searchcondition,
@RequestParam(value = "searchcontent", required = false) String searchcontent,
@RequestParam(value = "page", required = false) Integer page,
@RequestParam(value = "rows", required = false) Integer rows) {
// 创建查询规格对象
Specification<Person> specification = new Specification<Person>() {
@Override
public Predicate toPredicate(Root<Person> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
Predicate predicate = null;
Path path = null; if (searchcondition != null && !"".equals(searchcondition)
&& searchcontent != null && !"".equals(searchcontent)) {
switch (searchcondition) {
case "personname": // 人员名称
path = root.get("personname");
predicate = cb.like(path, "%" + searchcontent + "%");
break;
case "personage": // 人员年龄
path = root.get("personage");
if (TypeUtil.isNum(searchcontent)) {
predicate = cb.equal(path, Integer.parseInt(searchcontent));
}
break;
}
} return predicate;
}
}; Pageable pageable = new PageRequest(page - 1, rows, Sort.Direction.ASC, "personid");
Page<Person> pagePerson = personDao.findAll(specification, pageable); // 获取rows
List<Person> list = pagePerson.getContent();
// 获取count
Long count = pagePerson.getTotalElements(); Map<String, Object> resultMap = new HashMap();
resultMap.put("total", count);
resultMap.put("rows", list);
resultMap.put("success", true); return resultMap;
} /**
* 新增处理 和 修改处理
*
* @param person
* @return
*/
@RequestMapping("/save")
@ResponseBody
public Map<String, Object> personsave(Person person) {
Map<String, Object> resultMap = new HashMap<String, Object>();
personDao.save(person);
resultMap.put("success", true);
return resultMap;
} /**
* 删除处理
*
* @param personid
* @return
*/
@RequestMapping("/delete")
@ResponseBody
public Map<String, Object> persondelete(@RequestParam("id") String personid) {
Map<String, Object> resultMap = new HashMap<String, Object>();
personDao.deleteById(Integer.parseInt(personid));
resultMap.put("success", true);
return resultMap;
}
}
7、创建工具类TypeUtil.java
package cn.temptation.util;
import java.util.regex.Pattern;
public class TypeUtil {
/**
* 验证是否整数
*
* @param str
* @return
*/
public static boolean isNum(String str) {
Pattern pattern = Pattern.compile("^-?[0-9]+");
if (pattern.matcher(str).matches()) {
return true;
} else {
return false;
}
}
/**
* 验证是否小数
*
* @param str
* @return
*/
public static boolean isNumEx(String str) {
Pattern pattern = Pattern.compile("^[-+]?[0-9]+(\\.[0-9]+)?$");
if (pattern.matcher(str).matches()) {
return true;
} else {
return false;
}
}
}
8、resources目录下新建templates目录,创建表现层:人员列表页面(personlist.html)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>人员列表</title>
<link rel="stylesheet" type="text/css" href="../easyui/themes/default/easyui.css">
<link rel="stylesheet" type="text/css" href="../easyui/themes/icon.css">
<script type="text/javascript" src="../easyui/jquery.min.js"></script>
<script type="text/javascript" src="../easyui/jquery.easyui.min.js"></script>
<script type="text/javascript" src="../easyui/locale/easyui-lang-zh_CN.js"></script>
<script type="text/javascript" src="../biz/person.js"></script>
</head>
<body>
<!-- 表格 -->
<table id="dg">
</table>
<!-- 工具栏 -->
<div id="tb">
<table cellpadding="0" cellspacing="0">
<tr>
<td>
<a href="javascript:loadAll()" class="easyui-linkbutton" iconCls="Arrowrefresh" plain="true">加载全部</a>
</td>
<td>
<div class="datagrid-btn-separator"></div>
</td>
<td>
检索条件:
<select id="searchcondition" class="easyui-combobox" name="searchcondition" style="width:200px;">
<option value="personname">人员名称</option>
<option value="personage">人员年龄</option>
</select>
</td>
<td>
<input type="text" id="searchcontent" name="searchcontent" size="20" onkeydown="if(event.keyCode==13){ queryAction(); }"/>
</td>
<td><a href="javascript:queryAction()" class="easyui-linkbutton" iconCls="Magnifier" plain="true">搜索</a></td>
<td>
<div class="datagrid-btn-separator"></div>
</td>
<td><a href="javascript:openAddDialog()" class="easyui-linkbutton" iconCls="icon-add" plain="true">新增</a></td>
<td>
<div class="datagrid-btn-separator"></div>
</td>
<td><a href="javascript:openModifyDialog()" class="easyui-linkbutton" iconCls="icon-edit" plain="true">修改</a></td>
<td>
<div class="datagrid-btn-separator"></div>
</td>
<td><a href="javascript:deleteAction()" class="easyui-linkbutton" iconCls="icon-remove" plain="true">删除</a></td>
</tr>
</table>
</div>
<!-- 弹出新增修改对话框 -->
<div id="dlg" class="easyui-dialog" style="width:300px;height:200px;padding: 10px 10px" closed="true"
buttons="#dialog-buttons" modal="true">
<form id="fm" method="post">
<table>
<tr>
<td><label for="personname">人员名称</label></td>
<td><input type="text" id="personname" name="personname" class="easyui-validatebox" required="true"/>
</td>
</tr>
<tr>
<td><label for="personage">人员年龄</label></td>
<td><input type="text" id="personage" name="personage" class="easyui-validatebox" required="true"/>
</td>
</tr>
</table>
</form>
</div>
<!-- 对话框按钮 -->
<div id="dialog-buttons">
<a href="javascript:saveAction()" class="easyui-linkbutton" iconCls="icon-ok">保存</a>
<a href="javascript:closeDialog()" class="easyui-linkbutton" iconCls="icon-cancel">关闭</a>
</div>
</body>
</html>
9、resources目录下新建static目录,创建表现层:人员管理用脚本文件(person.js)
var url; // 页面加载
$(function () {
$("#dg").datagrid({
url: 'list',
queryParams: {},
title: "人员列表",
rownumbers: true,
fit: true,
toolbar: "#tb",
collapsible: true,
pagination: true,
pageSize: 5,
pageList: [5, 10],
columns: [[
{field: 'personid', title: '人员编号', width: 50, align: 'center', halign: 'center', hidden: 'true'},
{field: 'personname', title: '人员名称', width: 200, align: 'center', halign: 'center'},
{field: 'personage', title: '人员年龄', width: 200, align: 'right', halign: 'center'}
]]
});
}); // 【加载全部】按钮押下处理
var loadAll = function () {
// 查询条件还原为默认状态
$('#searchcondition').combobox('setValue', 'personname');
$('#searchcontent').val(""); // 表格重新加载
var param = {};
$("#dg").datagrid('load', param);
}; // 【搜索】按钮押下处理
var queryAction = function () {
var param = {
searchcondition: $('#searchcondition').combobox('getValue'),
searchcontent: $('#searchcontent').val()
}; $("#dg").datagrid('load', param);
}; // 重置表单内容
var resetValue = function () {
$('#fm')[0].reset();
}; // 打开添加对话框
var openAddDialog = function () {
resetValue();
$('#dlg').dialog({
modal: true,
title: '添加人员信息'
});
$('#dlg').dialog("open");
url = "save";
}; // 新增处理
var saveAction = function () {
$("#fm").form("submit", {
url: url,
onSubmit: function () {
return $(this).form("validate");
},
success: function (result) {
var result = eval('(' + result + ')');
if (result.success) {
$.messager.alert("系统提示", "保存成功!");
resetValue();
$("#dlg").dialog("close");
$("#dg").datagrid("reload");
} else {
$.messager.alert("系统提示", "保存失败!");
return;
}
}
});
}; // 关闭对话框
var closeDialog = function () {
$("#dlg").dialog("close");
resetValue();
}; // 打开编辑对话框
var openModifyDialog = function () {
var selectedRows = $("#dg").datagrid("getSelections"); if (selectedRows.length != 1) {
$.messager.alert("系统提示", "请选择一条要编辑的数据!");
return;
} var row = selectedRows[0];
$("#dlg").dialog("open").dialog("setTitle", "编辑人员信息");
$("#fm").form("load", row);
url = "save?personid=" + row.personid;
}; // 删除处理
var deleteAction = function () {
var selectedRows = $("#dg").datagrid("getSelections"); if (selectedRows.length == 0) {
$.messager.alert("系统提示", "请选择要删除的数据");
return;
} $.messager.confirm("系统提示", "您确定要删除这<font color=red>" + selectedRows.length + "</font>条数据吗?", function (r) {
if (r) {
$.post("delete", {
id: selectedRows[0].personid
}, function (result) {
if (result.success) {
$.messager.alert("系统提示", "数据已成功删除!");
$("#dg").datagrid("reload");
} else {
$.messager.alert("系统提示", "数据删除失败,请联系工作人员!");
}
}, "json");
}
});
};
四、启动项目,运行效果如下









【原】无脑操作:IDEA + maven + SpringBoot + JPA + EasyUI实现CRUD及分页的更多相关文章
- 【原】无脑操作:IDEA + maven + SpringBoot + JPA + Thymeleaf实现CRUD及分页
一.开发环境: 1.windows 7 企业版 2.IDEA 14 3.JDK 1.8 4.Maven 3.5.2 5.MariaDB 6.SQLYog 二.Maven设置: Maven目录下的con ...
- 【原】无脑操作:EasyUI Tree实现左键只选择叶子节点、右键浮动菜单实现增删改
Easyui中的Tree组件使用频率颇高,经常遇到的需求如下: 1.在树形结构上,只有叶子节点才能被选中,其他节点不能被选中: 2.在叶子节点上右键出现浮动菜单实现新增.删除.修改操作: 3.在非叶子 ...
- 【原】无脑操作:IDEA + maven + Shiro + SpringBoot + JPA + Thymeleaf实现基础认证权限
开发环境搭建参见<[原]无脑操作:IDEA + maven + SpringBoot + JPA + Thymeleaf实现CRUD及分页> 需求: ① 除了登录页面,在地址栏直接访问其他 ...
- 【原】无脑操作:IDEA + maven + Shiro + SpringBoot + JPA + Thymeleaf实现基础授权权限
上一篇<[原]无脑操作:IDEA + maven + Shiro + SpringBoot + JPA + Thymeleaf实现基础认证权限>介绍了实现Shiro的基础认证.本篇谈谈实现 ...
- 【原】无脑操作:express + MySQL 实现CRUD
基于node.js的web开发框架express简单方便,很多项目中都在使用.这里结合MySQL数据库,实现最简单的CRUD操作. 开发环境: IDE:WebStorm DB:MySQL ------ ...
- 【原】无脑操作:eclipse + maven搭建SSM框架
网上看到一些Spring + Spring MVC + MyBatis框架的搭建教程,不是很详细或是时间久远了,自己动手整一个简单无脑的! 0.系统环境 1)Windows 10 企业版 2)JDK ...
- 【原】无脑操作:ElasticSearch学习笔记(01)
开篇来自于经典的“保安的哲学三问”(你是谁,在哪儿,要干嘛) 问题一.ElasticSearch是什么?有什么用处? 答:截至2018年12月28日,从ElasticSearch官网(https:// ...
- 【原】无脑操作:eclipse创建maven工程时,如何修改默认JDK版本?
问题描述:eclipse建立maven项目时,JDK版本默认是1.5,想创建时默认版本设置为1.8,如何修改? 解决方案: 找到本机maven仓库存放位置,比如:${user.home}/.m2/路径 ...
- 【原】无脑操作:Eclipse + Maven + jFinal + MariaDB 环境搭建
一.开发环境 1.windows 7 企业版 2.Eclipse IDE for Enterprise Java Developers Version: 2019-03 (4.11.0) 3.JDK ...
随机推荐
- myeclispe中向mysql中插入中文数据出现??问题解决办法
或许很多人会出现??这种令人头痛的mysql的中文乱码问题:解决如下: 1.先对于新建的数据库要设置默认的字符集为UTF-8 create database mydb default characte ...
- Python后端(一)——客户端/服务端
网址组成(四部分) 协议 http, https(https 是加密的http) 主机 g.cn zhihu.com之类的网址 ,因此一般不用填写 路径 下面的「/」和「 ...
- 算法训练 K好数 数位DP+同余定理
思路:d(i,j)表示以i开头,长度为j的K好数的个数,转移方程就是 for(int u = 0; u < k; ++u) { int x = abs(i - u); if(x == 1) co ...
- java网络编程(1)
太久没有用java做一些东西了,搞太多的协议框架,基本的东西好像快忘记了~每天抽出一点时间出来,来好好温习下基础,顺便记录下来,以后还忘记可以回来看看==.首先从网络编程开始吧==.这玩意太久没有用了 ...
- 中小研发团队架构实践之微服务MSA
一.MSA简介 1.1.MSA是什么 微服务架构MSA是Microservice Architecture的简称,它是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相通讯.互相配合, ...
- asp.net程序发布详解
本文转载自Alan_beijing的博客ASP.NET 程序发布详细过程.内容进行了部分更改. ASP.NET网站的发布,无论是初学者还是高手,在程序的发布过程中或多或少会存在一些问题,譬如VS发布A ...
- C#调用WebService时插入cookie
SOAPUI插入Cookie的方法 SOAP插入cookie的方法如下,点击Head,点击加号,然后直接设置就可以了. C#中调用webService时插入Cookie 由于调用的时候必须要带上coo ...
- 最短路径问题(Floyd-Warshall模板)
#include<bits/stdc++.h> using namespace std; int n; int x,y; ][]; ][]; int m,s,t; int main() { ...
- Navicat远程连接阿里云服务器的mysql
问题描述: 本机为win10,mysql安装在阿里云(Ubuntu系统)上,本机使用Navicat远程连接mysql,遇到一些坑,求助于阿里云,最终解决,特此记录一下! 安装mysql sudo ap ...
- 多文件工程的编译-Makefile的简便写法
通常我们在命令行使用GCC对程序进行编译,如果对于单个或者几个文件时比较方便的,但当工程中的文件逐渐增多甚至变得十分庞大的时候,使用GCC显然力不从心,不好管理.因此我们有必要编写一个Makefile ...