layui+SpringBoot实现表格增删改查,java基础知识面试题库及答案

    result.put("count", pageInfo.getTotal());

} catch (Exception e) {

    result.put("code", "500");

    result.put("msg", "查询异常!");

}

return result;

}




`goodsMapper.getGoodsList()`呢,就是与数据库交互的方法了:



@Select(“SELECT * FROM mutest.goods”)

List getGoodsList();




经过`PageHelper`的分页处理,将前端传来的`pageNum`和`pageSize` 织入sql语句中:



SELECT * FROM mutest.goods LIMIT 0,5




至此,渲染数据的前后端已经完成,那么刷新数据是怎么实现的呢?



首先,要页面放置头部工具按钮,包括新增和刷新:






然后,监听头部按钮点击事件:



// 监听头部工具栏

table.on(‘toolbar(goods_bar)’, function (obj) {

switch (obj.event) {

    case 'refresh':

    // 执行一个表格重载即实现刷新功能

         table.reload('goodsReload', {

             where: '',

             contentType: 'application/x-www-form-urlencoded',

             page: {

                 curr: 1 //重新从第 1 页开始

             },

             url: '/goods/goodsList',

             method: 'get'

         });

         break;

}

});





有这么几点需要强调一下:



*   `toolbar`是头部工具事件,与之对应的还有`tool`(行工具),后面括号中的`goods_bar`是与`table`元素的`lay-filter`的值对应起来的

*   `table.reload('goodsReload'`中的`goodsReload`是与`table.render`的id对应起来的,通过再次向特定`url`请求数据实现了表格的重载。



[]( )2 新增和编辑

=================================================================



新增和编辑在本文中,是使用弹层来实现的。思路是这样的:



1.  首先,准备一个`div`元素,其`display`设置为`none`

2.  通过新增和编辑按钮的点击事件触发弹出`form`,在`form`内填写好内容

3.  通过点击弹层中的【提交】按钮,将`form`提交到后端对应的接口,从而实现后端数据的更新

4.  提交完成后,ajax请求的success回调中添加表格重载,完成前端数据更新



[]( )2.1 弹层

----------------------------------------------------------------



弹层的div元素是这样的:



<form id="add_form" class="layui-form" action="" style="margin-top: 20px;align:center;">

    <!--隐藏字段action,用来区分增加和编辑行为-->

    <input type="hidden" name="action" id="action">

    <!--隐藏字段id,用于提供编辑需要的主键-->

    <input type="hidden" name="id" id="id">

    <!--隐藏字段request_type,用于提供请求方式:get,post,put-->

    <input type="hidden" name="request_type" id="request_type">



    <div class="layui-form-item" style="display: table;width: 96%">

        <div class="layui-form-item" style="display: table-cell;width: 50%">

            <label class="layui-form-label">类&emsp;&emsp;型</label>

            <div class="layui-input-block">

                <select id="" name="type" lay-filter="type" lay-verify="required">

                    <option value="">请选择</option>

                    <option value="国产">国产</option>

                    <option value="进口">进口</option>

                </select>

            </div>

        </div>

        <div class="layui-form-item" style="display: table-cell;width: 50%">

            <label class="layui-form-label">产品名称</label>

            <div class="layui-input-block">

                <input type="text" name="name" placeholder="请输入产品名称"

                       autocomplete="off" class="layui-input" lay-verify="required">

            </div>

        </div>

    </div>



    <div class="layui-form-item" style="display: table;width: 96%">

        <div class="layui-form-item" style="display: table-cell;width: 50%">

            <label class="layui-form-label">价&emsp;&emsp;格</label>

            <div class="layui-input-block">

                <input type="text" name="price" placeholder="请输入价格"

                       autocomplete="off" class="layui-input" lay-verify="required">

            </div>

        </div>

        <div class="layui-form-item" style="display: table-cell;width: 50%">

            <label class="layui-form-label">数&emsp;&emsp;量</label>

            <div class="layui-input-block">

                <input type="text" name="size" placeholder="请输入数量"

                       autocomplete="off" class="layui-input" lay-verify="required">

            </div>

        </div>

    </div>



    <div class="layui-form-item" style="width: 96%">

        <label class="layui-form-label">说&emsp;&emsp;明</label>

        <div class="layui-input-block">

            <input type="text" name="description" placeholder="请输入产品说明"

                   autocomplete="off" class="layui-input" lay-verify="required">

        </div>

    </div>



    <div class="layui-form-item" style="margin-left: 40%">

        <div class="layui-btn-group">

            <button class="layui-btn" lay-submit="" lay-filter="update_submit">提&ensp;交</button>

            <button type="reset" class="layui-btn layui-btn-primary">重&ensp;置</button>

        </div>

    </div>

</form>



**接下来,我们看打开弹层时,做了什么?首先是【新增】事件:**



// 监听头部工具栏

table.on(‘toolbar(goods_bar)’, function (obj) {

switch (obj.event) {

    // 根据增加行为给form隐藏项赋值

    case 'add':

        var data = {};

        data.action = 'addGood';

        data.request_type = 'post';

        // 调用打开弹层的工具方法

        open_form("#open_div", data, '添加商品', '620px', '282px');

        break;

}

});




【编辑】事件:



table.on(‘tool(goods_bar)’, function (obj) {

var data = obj.data;

var layEvent = obj.event;

var id = data.id;



switch (layEvent) {

    case 'edit':

        // 根据编辑行为为form隐藏项赋值

        data.action = 'updateGood';

        data.request_type = 'post';

        open_form("#open_div", data, '编辑用例', '620px', '282px');

        break; 

}

});




仔细观察,div中有很多隐藏元素,之所以隐藏起来,是因为这些值必须要传递给后端,且不能被用户篡改,而是由程序赋值



*   id:就是你所操作的数据的主键,通过该值来告知后端,我要修改的是哪条数据。【新增】没有对id赋值,因为id设为自增字段,插库时无需传入id

*   action:区分新增和编辑的重要字段,【新增】赋值`addGood`,【编辑】赋值`updateGood`

*   request\_type:区分`get`请求和`post`请求的字段,新增和编辑都赋值`post`



\*\*`open_form`和`setForm`是两个工具方法,前者是打开弹层,后者是为`form`初始化(也是编辑弹窗会代入数据的实现方法),源码见 3.2 工具方法部分。



[]( )2.2 form submit

-------------------------------------------------------------------------



当打开弹层并填入内容后,当然是要提交了。通过监听form的提交按钮点击事件来实现表单提交:



form.on(‘submit(update_submit)’, function (data) {

var uri = data.field.action;

var type = data.field.request_type;



$.ajax({

     type: type,

     url: '/goods/' + uri,

     contentType: "application/json; charset=utf-8",

     data: JSON.stringify(data.field),

     dataType: "json",

     success: function (result) {

        if (result.code == "0") {

            table.reload('goodsReload', {

                contentType: 'application/x-www-form-urlencoded',

                page: {

                    curr: 1 //重新从第 1 页开始

                },

                url: '/goods/goodsList',

                method: 'get'

            });

            layer.msg('修改成功', {icon: 1, time: 1000});

        } else {  //失败

            layer.alert(result.msg, {icon: 2}, function () {

                layer.close(index);

            });

        }

    }

});

layer.close(index);//关闭弹出层

return false;

});




【新增】和【编辑】使用的是同一套提交逻辑,而后端接口肯定不是同一个,所以`action`在打开弹层时被赋值,而提交时引用该值,从而指向了各自的后端接口。



后端接口:



// 新增接口

@RequestMapping(value = “/addGood”, method = RequestMethod.POST)

public JSONObject addGood(@RequestBody JSONObject request) {

JSONObject result = new JSONObject();

try {

    goodsMapper.addGood(request);

    result.put("code", "0");

    result.put("msg", "操作成功!");

} catch (Exception e) {

    result.put("code", "500");

    result.put("msg", "新增商品异常!");

}

return result;

}

// 编辑接口

@RequestMapping(value = “/updateGood”, method = RequestMethod.POST)

public JSONObject updateGood(@RequestBody JSONObject request) {

JSONObject result = new JSONObject();

try {

    goodsMapper.updateGood(request);

    result.put("code", "0");

    result.put("msg", "操作成功!");

} catch (Exception e) {

    result.put("code", "500");

    result.put("msg", "修改商品异常!");

    System.out.println(e.getMessage());

}

return result;

}

// 新增sql

@Insert(“INSERT INTO mutest.goods(type,name,price,size,status,description)VALUES(#{type},#{name},#{price},#{size},#{status},#{description})”)

int addGood(JSONObject request);

// 编辑sql

@Update(“UPDATE mutest.goods SET type=#{type},name=#{name},price=#{price},size=#{size},status=#{status},description=#{description} WHERE id=#{id}”)

void updateGood(JSONObject request);




![在这里插入图片描述](https://img-blog.csdnimg.cn/20190727163912774.gif)



[]( )3 完整代码

================================================================



[]( )3.1 后端

----------------------------------------------------------------



### []( )pom.xml依赖



项目用到的完整的pom.xml依赖如下:



<?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 http://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.1.5.RELEASE</version>

    <relativePath/> <!-- lookup parent from repository -->

</parent>

<groupId>com.example</groupId>

<artifactId>mudemo</artifactId>

<version>0.0.1-SNAPSHOT</version>

<name>mudemo</name>

<description>Demo project for Spring Boot</description>



<properties>

    <java.version>1.8</java.version>

    <swagger.version>2.8.0</swagger.version>

    <google.guava>23.0</google.guava>

    <fastjson.version>1.2.47</fastjson.version>

    <druid.version>1.1.9</druid.version>

    <poi.version>3.17</poi.version>

    <jwt.version>0.9.0</jwt.version>

    <mybatis.version>1.3.2</mybatis.version>

</properties>



<dependencies>

    <!--web-->

    <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.0.1</version>

    </dependency>



    <!--连接池-->

    <dependency>

        <groupId>com.alibaba</groupId>

        <artifactId>druid-spring-boot-starter</artifactId>

        <version>${druid.version}</version>

    </dependency>



	<!--mysql-->

    <dependency>

        <groupId>mysql</groupId>

        <artifactId>mysql-connector-java</artifactId>

        <scope>runtime</scope>

    </dependency>



    <dependency>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-test</artifactId>

        <scope>test</scope>

    </dependency>



	<!--data:省略set、get方法-->

    <dependency>

        <groupId>org.projectlombok</groupId>

        <artifactId>lombok</artifactId>

    </dependency>



    <dependency>

        <groupId>com.alibaba</groupId>

        <artifactId>fastjson</artifactId>

        <version>${fastjson.version}</version>

    </dependency>



    <!--分页插件-->

    <dependency>

        <groupId>com.github.pagehelper</groupId>

        <artifactId>pagehelper-spring-boot-starter</artifactId>

        <version>1.2.5</version>

    </dependency>

</dependencies>



<build>

    <plugins>

        <plugin>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-maven-plugin</artifactId>

        </plugin>

    </plugins>

</build>



### []( )实体类



package mudemo.model;

import lombok.Data;

/**

  • @author guozhengMu

  • @version 1.0

  • @date 2019/8/26 16:16

  • @description

  • @modify

*/

@Data

public class Good {

private int id;

private String name;

private String type;

private double price;

private int size;

private int status;

private String description;

}




### []( )controller层



package mudemo.controller;

import com.alibaba.fastjson.JSONObject;

import mudemo.service.GoodsService;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.web.bind.annotation.*;

/**

  • @author guozhengMu

  • @version 1.0

  • @date 2019/8/26 16:51

  • @description

  • @modify

*/

@RestController

@RequestMapping(value = “/goods”)

public class GoodsController {

@Autowired

private GoodsService goodsService;



@RequestMapping(value = "/goodsList", method = RequestMethod.GET)

public JSONObject getGoodsList(@RequestParam("pageNum") int pageNum, @RequestParam("pageSize") int pageSize) {

    return goodsService.getGoodsList(pageNum, pageSize);

}



@RequestMapping(value = "/updateGood", method = RequestMethod.POST)

public JSONObject updateGood(@RequestBody JSONObject request) {

    return goodsService.updateGood(request);

}



@RequestMapping(value = "/addGood", method = RequestMethod.POST)

public JSONObject addGood(@RequestBody JSONObject request) {

    return goodsService.addGood(request);

}



@RequestMapping(value = "/deleteGood", method = RequestMethod.GET)

public JSONObject deleteGood(@RequestParam("id") int id) {

    return goodsService.deleteGood(id);

}

}




### []( )接口层实现层



接口层省略,这里只贴上接口实现类:



package mudemo.service.impl;

import com.alibaba.fastjson.JSONObject;

import com.github.pagehelper.PageHelper;

import com.github.pagehelper.PageInfo;

import mudemo.dao.GoodsMapper;

import mudemo.model.Good;

import mudemo.service.GoodsService;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;

/**

  • @author guozhengMu

  • @version 1.0

  • @date 2019/8/26 16:55

  • @description

  • @modify

*/

@Service(value = “GoodsService”)

public class GoodsServiceImpl implements GoodsService {

@Autowired

private GoodsMapper goodsMapper;



@Override

public JSONObject getGoodsList(int pageNum, int pageSize) {

    JSONObject result = new JSONObject();

    try {

        PageHelper.startPage(pageNum, pageSize);

        PageInfo<Good> pageInfo = new PageInfo(goodsMapper.getGoodsList());



        result.put("code", "0");

        result.put("msg", "操作成功!");

        result.put("data", pageInfo.getList());

        result.put("count", pageInfo.getTotal());

    } catch (Exception e) {

        result.put("code", "500");

        result.put("msg", "查询异常!");

    }

    return result;

}



@Override

public JSONObject addGood(JSONObject request) {

    JSONObject result = new JSONObject();

    try {

        goodsMapper.addGood(request);

        result.put("code", "0");

        result.put("msg", "操作成功!");

    } catch (Exception e) {

        result.put("code", "500");

        result.put("msg", "新增商品异常!");

    }

    return result;

}



@Override

public JSONObject updateGood(JSONObject request) {

    JSONObject result = new JSONObject();

    try {

        goodsMapper.updateGood(request);

        result.put("code", "0");

        result.put("msg", "操作成功!");

    } catch (Exception e) {

        result.put("code", "500");

        result.put("msg", "修改商品异常!");

        System.out.println(e.getMessage());

    }

    return result;

}



@Override

public JSONObject deleteGood(int id) {

    JSONObject result = new JSONObject();

    try {

        goodsMapper.deleteGood(id);

        result.put("code", "0");

        result.put("msg", "操作成功!");

    } catch (Exception e) {

        result.put("code", "500");

        result.put("msg", "删除商品异常!");

    }

    return result;

}

}




### []( )dao层



package mudemo.dao;

import com.alibaba.fastjson.JSONObject;

import mudemo.model.Good;

import org.apache.ibatis.annotations.*;

import java.util.List;

@Mapper

public interface GoodsMapper {

@Select("SELECT * FROM mutest.goods")

List<Good> getGoodsList();



@Insert("INSERT INTO mutest.goods(type,name,price,size,status,description)VALUES(#{type},#{name},#{price},#{size},#{status},#{description})")

int addGood(JSONObject request);



@Update("UPDATE mutest.goods SET type=#{type},name=#{name},price=#{price},size=#{size},status=#{status},description=#{description} WHERE id=#{id}")

void updateGood(JSONObject request);



@Delete("DELETE FROM mutest.goods WHERE id=#{id}")

void deleteGood(@Param("id") int id);

}




[]( )3.2 前端

----------------------------------------------------------------



### []( )index.html



<meta charset="UTF-8">

<title>商品信息</title>

<!--根据自己的项目目录修改-->

<link rel="stylesheet" href="layui/css/layui.css" media="all"/>
<form id="add_form" class="layui-form" action="" style="margin-top: 20px;align:center;">

    <!--隐藏字段action,用来区分增加和编辑行为-->

    <input type="hidden" name="action" id="action">

    <!--隐藏字段id,用于提供编辑需要的主键-->

    <input type="hidden" name="id" id="id">

    <!--隐藏字段request_type,用于提供请求方式:get,post,put-->

    <input type="hidden" name="request_type" id="request_type">



    <div class="layui-form-item" style="display: table;width: 96%">

        <div class="layui-form-item" style="display: table-cell;width: 50%">

            <label class="layui-form-label">类&emsp;&emsp;型</label>

            <div class="layui-input-block">

                <select id="" name="type" lay-filter="type" lay-verify="required">

                    <option value="">请选择</option>

                    <option value="国产">国产</option>

                    <option value="进口">进口</option>

                </select>

            </div>

        </div>

        <div class="layui-form-item" style="display: table-cell;width: 50%">

            <label class="layui-form-label">产品名称</label>

            <div class="layui-input-block">

                <input type="text" name="name" placeholder="请输入产品名称"

                       autocomplete="off" class="layui-input" lay-verify="required">

            </div>

        </div>

    </div>



    <div class="layui-form-item" style="display: table;width: 96%">

        <div class="layui-form-item" style="display: table-cell;width: 50%">

            <label class="layui-form-label">价&emsp;&emsp;格</label>

            <div class="layui-input-block">

                <input type="text" name="price" placeholder="请输入价格"

                       autocomplete="off" class="layui-input" lay-verify="required">

            </div>

        </div>

        <div class="layui-form-item" style="display: table-cell;width: 50%">

            <label class="layui-form-label">数&emsp;&emsp;量</label>

            <div class="layui-input-block">

                <input type="text" name="size" placeholder="请输入数量"

                       autocomplete="off" class="layui-input" lay-verify="required">

            </div>

        </div>

    </div>



    <div class="layui-form-item" style="width: 96%">

        <label class="layui-form-label">说&emsp;&emsp;明</label>

        <div class="layui-input-block">

            <input type="text" name="description" placeholder="请输入产品说明"

                   autocomplete="off" class="layui-input" lay-verify="required">

        </div>

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

总结

面试前的“练手”还是很重要的,所以开始面试之前一定要准备好啊,不然也是耽搁面试官和自己的时间。

我自己是刷了不少面试题的,所以在面试过程中才能够做到心中有数,基本上会清楚面试过程中会问到哪些知识点,高频题又有哪些,所以刷题是面试前期准备过程中非常重要的一点。

面试题及解析总结

三年Java开发,刚从美团、京东、阿里面试归来,分享个人面经

大厂面试场景

三年Java开发,刚从美团、京东、阿里面试归来,分享个人面经

知识点总结

三年Java开发,刚从美团、京东、阿里面试归来,分享个人面经

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

=“description” placeholder=“请输入产品说明”

                   autocomplete="off" class="layui-input" lay-verify="required">

        </div>

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-gwIpEgxq-1712799318332)]
[外链图片转存中…(img-3xL3BZIb-1712799318333)]
[外链图片转存中…(img-FgkopGnp-1712799318333)]
[外链图片转存中…(img-AzL0dgHt-1712799318334)]
[外链图片转存中…(img-wZbpZH2x-1712799318334)]
[外链图片转存中…(img-rlHgxAuZ-1712799318334)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-cwnajAhm-1712799318334)]

总结

面试前的“练手”还是很重要的,所以开始面试之前一定要准备好啊,不然也是耽搁面试官和自己的时间。

我自己是刷了不少面试题的,所以在面试过程中才能够做到心中有数,基本上会清楚面试过程中会问到哪些知识点,高频题又有哪些,所以刷题是面试前期准备过程中非常重要的一点。

面试题及解析总结

[外链图片转存中…(img-QvfFEVK6-1712799318335)]

大厂面试场景

[外链图片转存中…(img-hGwEIk5w-1712799318335)]

知识点总结

[外链图片转存中…(img-J83wYe5Q-1712799318335)]

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-rN81BvDx-1712799318335)]

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值