SpringBoot整合MyBatis-plus layui框架异步crud
首先创建springboot空项目
1.引入所需的pom依赖:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.dayu</groupId>
<artifactId>test</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>test</name>
<description>连接数据库</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.21</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.opensymphony.quartz</groupId>
<artifactId>quartz</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.13</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.1</version>
</dependency>
</dependencies>
</project>
2.创建相对应的java目录包,并在rescource包中static包里引入layui框架并配置资源配置文件:
配置资源配置文件:
3.根据数据库表书写实体类:
数据库表:
实体类:
User实体代码:
package com.sb.demo.entry;
import com.baomidou.mybatisplus.annotation.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
@Data
//lombok注入无参构造注解
@NoArgsConstructor
//lombok注入所有有参构造注解
@AllArgsConstructor
public class User {
// @TableId(type = IdType.AUTO)
private Long id;
private String name;
private Long age;
private String email;
@TableLogic
private Integer deleted=0;
public User(Long id, String name, Long age, String email) {
this.id = id;
this.name = name;
this.age = age;
this.email = email;
}
//添加注解,只有在插入时会自动填充
// @TableField(fill= FieldFill.INSERT)
private Date inserttime;
//添加注解,修改数据时在插入和修改时都会自动填充
// @TableField(fill=FieldFill.INSERT_UPDATE)
private Date updatetime;
}
引用layui框架需要返回对应的Layui实体,ReturnData实体和分页实体:
layuiEntry实体代码:
package com.sb.demo.entry;
public class LayUIEntry {
private int code;
private String msg;
private long count;
private Object data;
public LayUIEntry() {
}
public LayUIEntry(int code, String msg, long count, Object data) {
this.code = code;
this.msg = msg;
this.count = count;
this.data = data;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public long getCount() {
return count;
}
public void setCount(long count) {
this.count = count;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
}
ReturnData实体代码:`
package com.sb.demo.entry;
public class ReturnData {
private boolean state;
private String message;
private Object data;
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public ReturnData(boolean state, String message) {
this.state = state;
this.message = message;
}
public ReturnData(boolean state, String message, Object data) {
this.state = state;
this.message = message;
this.data=data;
}
public boolean isState() {
return state;
}
public void setState(boolean state) {
this.state = state;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
Page实体代码:
package com.sb.demo.entry;
public class Page {
private int page=1;
private int limit=10;
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
public int getLimit() {
return limit;
}
public void setLimit(int limit) {
this.limit = limit;
}
}
4.书写mapper层:
mapper层创建书写好后,需要在主启动类中书写mapper层的包扫描映射:
5.书写service层:
书写service接口:
service接口代码如下:
package com.sb.demo.service;
import com.github.pagehelper.PageInfo;
import com.sb.demo.entry.LayUIEntry;
import com.sb.demo.entry.ReturnData;
import com.sb.demo.entry.User;
import java.util.List;
public interface UserService {
//查询方法,
public LayUIEntry select();
//根据id返回对应id的实体对象,最为前台修改的回显
public User selectById(Integer id);
//删除方法
public ReturnData delete(Integer id);
//插入方法
public ReturnData insert(User user);
//修改方法
public ReturnData update(User user);
}
service实现类代码如下:
package com.sb.demo.service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.sb.demo.entry.LayUIEntry;
import com.sb.demo.entry.ReturnData;
import com.sb.demo.entry.User;
import com.sb.demo.mapper.UsreMapper;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
@Service
public class UserServiceImpl implements UserService{
@Resource
UsreMapper u;
//查询方法
@Override
public LayUIEntry select() {
//返回list列表存储实体
List<User> list = u.selectList(null);
PageInfo<User> pageInfo = new PageInfo<>(list);
return new LayUIEntry(0,"查询成功", pageInfo.getTotal(), pageInfo.getList());
}
//修改回显方法,返回一个实体
@Override
public User selectById(Integer id) {
User user = u.selectById(id);
return user;
}
//删除方法
@Override
public ReturnData delete(Integer id) {
int i = u.deleteById(id);
if(i>0)
{
return new ReturnData(true, "删除成功");
}
return new ReturnData(false, "删除失败");
}
//插入方法
@Override
public ReturnData insert(User user) {
int i = u.insert(user);
if(i>0)
{
return new ReturnData(true, "插入成功");
}
return new ReturnData(false, "插入失败");
}
//修改方法
@Override
public ReturnData update(User user) {
System.out.println("打印的实体是"+user);
int i = u.updateById(user);
if(i>0)
{
return new ReturnData(true, "修改成功");
}
return new ReturnData(false, "修改失败");
}
}
6.书写controller层:
代码如下:
package com.sb.demo.controller;
import com.github.pagehelper.PageInfo;
import com.sb.demo.entry.LayUIEntry;
import com.sb.demo.entry.ReturnData;
import com.sb.demo.entry.User;
import com.sb.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import java.util.List;
import java.util.Map;
@Controller
public class UserController {
@Autowired
UserService u;
//浏览器地址栏输入该路径到首页面
@RequestMapping("/user")
public String index() {
return "user.html";
}
//查询方法
@ResponseBody
@RequestMapping("/list")
LayUIEntry select()
{
return u.select();
}
//根据id返回实体最为回显
@RequestMapping("getbyid")
String selectId(@RequestParam Integer id, Model model)
{
System.out.println(id);
User user = u.selectById(id);
//将查询到的数据实体传到前台作为回显
model.addAttribute("user",user);
return "update.html";
}
@ResponseBody
@RequestMapping("/delete")
ReturnData delecte(Integer id)
{
return u.delete(id);
}
@ResponseBody
@RequestMapping("/insert")
ReturnData insert(@RequestBody User user){
return u.insert(user);
}
@ResponseBody
@RequestMapping("/update")
ReturnData update(@RequestBody User user){
System.out.println("打印的实体是"+user);
return u.update(user);
}
}
7.书写前台html代码:
在对应目录中创建两个html文件:
书写user.html代码:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<title></title>
<script type="text/javascript" th:src="@{/static/layui/layui.js}"></script>
<link rel="stylesheet" type="text/css" th:href="@{/static/layui/css/layui.css}"/>
</head>
<body>
<table class="layui-hide" id="TestTable" lay-filter="test"></table>
<script type="text/html" id="barDemo">
<a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="edit">修改</a>
<a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="delete">删除</a>
</script>
<script type="text/html" id="toolbarDemo">
<div class="layui-btn-container">
<button class="layui-btn layui-btn-sm" lay-event="add">添加</button>
</div>
</script>
<div id="testDiv" style="display: none">
<form class="layui-form" action="" id="TestForm" lay-filter="example">
<div class="layui-form-item">
<label class="layui-form-label"></label>
<div class="layui-input-block">
<input name="role_id" type="hidden" id="id" placeholder="id" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">姓名</label>
<div class="layui-input-block">
<input type="text" name="name" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">年龄</label>
<div class="layui-input-block">
<input type="text" name="age" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">邮箱</label>
<div class="layui-input-block">
<input type="text" name="email" class="layui-input">
</div>
</div>
<!-- <div class="layui-form-item">-->
<!-- <label class="layui-form-label">状态</label>-->
<!-- <div class="layui-input-block">-->
<!-- <select name="role_state" id="dept_id" lay-filter="dept_id">-->
<!-- <option value="1">启用</option>-->
<!-- <option value="0">禁用</option>-->
<!-- </select>-->
<!-- </div>-->
<!-- </div>-->
<div class="layui-form-item">
<div class="layui-input-block">
<button type="button" class="layui-btn" lay-submit="" lay-filter="saveBtn">保存</button>
<button type="reset" id="re" class="layui-btn" lay-filter="saveBtn">重置</button>
</div>
</div>
</form>
</div>
<script th:inline="none">
//加载模块(从layui 2.6 开始,第一个参数不传即代表加载所有内置模块)
layui.use(['layer', 'table','form'], function() {
var table = layui.table;
var form = layui.form;
var $ = layui.jquery;
function loadPage(){
//执行一个 table 实例
table.render({
elem: '#TestTable'
,height: 620
,url: 'list' //数据接口
,title: '员工管理'
,page: true //开启分页
,toolbar: "#toolbarDemo" //开启工具栏,此处显示默认图标,可以自定义模板,详见文档
,cols: [[
{field: 'id', title: '编号', align:'center',hide:true }
,{field: 'name', title: '姓名' , align:'center'}
,{field: 'age', title: '年龄' , sort: true, align:'center'}
,{field: 'email', title: '邮箱' , align:'center'}
,{field: 'operator_time', title: '操作时间' , sort: true , align:'center',hide: true}
,{fixed: 'right', width: 350, align:'center', title:"操作",with:200, toolbar: '#barDemo'}
]]
,id:"loadMoney"
});
}
loadPage()
//监听头
table.on('toolbar(test)', function(obj){
if(obj.event=='add'){
layer.open({
type: 1,
skin: 'layui-layer-demo', //样式类名
closeBtn: 1, //不显示关闭按钮
anim: 2,
area: ['620px', '440px'], //宽高
shadeClose: true, //开启遮罩关闭
content: $("#testDiv")
});
}
})
//监听行工具事件
table.on('tool(test)', function(obj){
console.log(obj)
if(obj.event=='edit'){
top.layer.open({
type: 2, //layer的5种层类型 0(信息框,默认)1(页面层)2(iframe层)3(加载层)4(tips层)
title: ['修改角色信息', 'font-size:18px;'], //弹出框标题
shade: [0.5, '#393D49'], //遮罩层
shadeClose:true, //点击遮罩层外区域关闭遮罩层
area: ['580px', '500px'], //弹出框大小
anim: 1, //弹出动画
content:'getbyid?id='+obj.data.id
});
}else if(obj.event=='delete'){
$.ajax({
url:"/delete?id="+obj.data.id,
data:{},
dataType:"json",
type:"delete",
success:function (reData){
layer.msg("删除成功")
loadPage();//加载查询列表
}
})
}
})
//监听提交
form.on('submit(saveBtn)', function(data){
var id=$("#id").val();
$.ajax({
url:"/insert",
data:JSON.stringify(data.field),
dataType:"json",
contentType:"application/json",
type:"post",
success:function (redata){
if(redata.state){
layer.msg(redata.message)
loadPage();//加载查询列表
layer.closeAll();//关闭弹出框
$("#TestForm")[0].reset();//表单重置
}else{
layer.msg(redata.message)
location.reload()
}
}
});
});
});
</script>
</body>
</html>
书写update.html代码:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<title></title>
<script type="text/javascript" th:src="@{/static/layui/layui.js}"></script>
<link rel="stylesheet" type="text/css" th:href="@{/static/layui/css/layui.css}"/>
</head>
<body>
<form class="layui-form" action="" id="TestForm" lay-filter="example">
<div class="layui-form-item">
<label class="layui-form-label"></label>
<div class="layui-input-block">
<input name="id" th:value="${user.id}" id="id" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">姓名</label>
<div class="layui-input-block">
<input name="name" th:value="${user.name}" lay-verify="money" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">年龄</label>
<div class="layui-input-block">
<input name="age" th:value="${user.age}" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">邮箱</label>
<div class="layui-input-block">
<input name="email" th:value="${user.email}" class="layui-input">
</div>
</div>
<!-- <div class="layui-form-item">-->
<!-- <label class="layui-form-label">状态</label>-->
<!-- <div class="layui-input-block">-->
<!-- <select name="role_state" id="dept_id" lay-filter="dept_id">-->
<!-- <option th:value="${role.role_state}">启用</option>-->
<!-- <option th:value="${role.role_state}">禁用</option>-->
<!-- </select>-->
<!-- </div>-->
<!-- </div>-->
<div class="layui-form-item">
<div class="layui-input-block">
<button type="button" class="layui-btn" lay-submit="" lay-filter="saveBtn">保存</button>
<button type="reset" id="re" class="layui-btn" lay-filter="saveBtn">重置</button>
</div>
</div>
</form>
<script th:inline="none">
//加载模块(从layui 2.6 开始,第一个参数不传即代表加载所有内置模块)
layui.use(['layer', 'table','form'], function() {
var table = layui.table;
var form = layui.form;
var $ = layui.jquery;
form.on('submit(saveBtn)', function(data){
$.ajax({
url:"/update",
data:JSON.stringify(data.field),
dataType:"json",
contentType:"application/json",
type:"post",
success:function (redata){
if(redata.state){
layer.closeAll();//关闭弹出框
console.log(data.field)
layer.msg(redata.message)
window.parent.location.reload();
$("#TestForm")[0].reset();//表单重置
}else{
layer.closeAll();//关闭弹出框
layer.msg(redata.message)
}
}
});
});
})
</script>
</body>
</html>
8.启动测试:
启动项目,在浏览器中输入路径:http://localhost:8080/user
点击添加按钮,弹出模态框输入数据进行数据的新增:
输入数据,点击保存:
点击删除进行数据的删除,这里删除第一条数据:
点击修改,弹出模态框,回显出对应实体的数据,然后进行数据修改,这里修改最后一条数据:
9.项目总结:
SpringBoot整合Mybatis-plus,Layui框架进行异步crud,MyBatis-plus非常方便的将单表的增删改查方法封装,极大的节省了mapper层书写代码的成本,Layui框架可以为前台页面搭载美观舒适的页面供我们使用,layui异步ajax也可以使页面的加载效率变的更加优化和完善,推荐大家多多使用前台框架和异步对以后项目的处理.