【原】无脑操作: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 ...
随机推荐
- Yii2框架RBAC(Role-Based Access Control)的使用
1.在项目的common/config/main.php文件的components中添加如下代码: 'authManager' => [ 'class' => 'yii\rbac ...
- 沉淀,再出发——安装windows10和ubuntu kylin15.04双系统心得体会
安装windows10和ubuntu kylin15.04双系统心得体会 一.安装次序 很简单,两种安装次序,"先安装windows后安装linux:先安装linux后安装wind ...
- 【剑指offer】04替换空格,C++实现
0.前言 # 替换空格为字符串部分的题目,剑指offer中字符串系列的文章地址,剑指offer全系列文章地址 1.题目 # 请实现一个函数,将一个字符串中的空格替换成"%20".例 ...
- ACdream 1031 Cut
题意:给定一棵树,删除一些边,让整棵树被分成多个节点数为偶数的联通块,且联通块尽量多. 思路:如果出现连通且节点数为偶数的立即删除这个点与它父节点之间的边,尽量删除即可,因为题目说了保证n为偶数,删了 ...
- java socket 模拟im 即时通讯
自己想了一下怎么实现,就写了,没有深究是否合理.更多处理没有写下去,例如收件人不在线,应该保存在数据库,等下一次连接的时候刷新map,再把数据发送过去,图片发送也没有做,也没有用json格式 sock ...
- yaf框架学习文件配置
文件配置: 在配置php支持yaf的时候,可以设置一个参数yaf.environ:把本地开发设置成develop.测试环境配置成test.生产环境配置成product. [yaf] extension ...
- datanode启动不起来的各种原因
一般在数据节点的log日志信息里能找到导致启动不起来的原因. 1.Namenode和Datanode的NamenodeID不一致 描述:一般在集群多次重新格式化HDFS之后,或者刚安装时会碰到.日志信 ...
- Linux CentOS安装配置MySQL数据库
没什么好说的,直接正面刚吧. 安装mysql数据库 a)下载mysql源安装包:wget http://dev.mysql.com/get/mysql57-community-release-el7- ...
- mysql分区之range分区
随着互联网的发展,各方面的数据越来越多,从最近两年大数据越来越强的呼声中就可见一斑. 我们所做的项目虽算不上什么大项目,但是由于业务量的问题,数据也是相当的多. 数据一多,就很容易出现性能问题,而为了 ...
- List转换成JSON对象报错(五)
List转换成JSON对象 1.具体错误如下 Exception in thread "main" java.lang.NoClassDefFoundError: org/apac ...