SpringBoot整合MyBatis-plus layui框架异步crud

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

配置资源配置文件:
在这里插入图片描述
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也可以使页面的加载效率变的更加优化和完善,推荐大家多多使用前台框架和异步对以后项目的处理.

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值