使用SSM+Vue前后端分离开发实现增删改查(超详细)(下)

简介: 使用SSM+Vue前后端分离开发实现增删改查(超详细)(下)

编写 ProductDao.xml

完整代码:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC
        "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.shaonaiyi.minimall.dao.ProductDao">
    <resultMap id="Product" type="com.shaonaiyi.minimall.entity.Product">
        <id property="id" column="id"></id>
        <result property="productName" column="productName"/>
        <result property="nums" column="nums"/>
    </resultMap>
    <select id="list" resultMap="Product">
        select * from product;
    </select>
    <insert id="add">
        insert into product
        (productname,nums) values(#{productName},#{nums})
    </insert>
    <update id="update" parameterType="com.shaonaiyi.minimall.entity.Product">
        update product set productname = #{productName},
        nums = #{nums} where
        id = #{id}
    </update>
    <delete id="delete" parameterType="int">
        delete from product where
        id = #{id}
    </delete>
</mapper>


注意:到底是写 productname 还是 productName ,需要分清。写好之后,你就可以进行部署运行和测试了。

4、部署Tomcat

此步骤比较简单,可以自行搜一下资料,灵感参考如下:


微信图片_20220619194508.png


5、编写测试用例

随便新建个文件夹,然后新建一个以 http 后缀结尾的文件,然后写测试用例即可:

image.png


完整的测试用例

### 1、获取商品列表
GET http://localhost:8080/product/list
### 2、添加商品
POST http://localhost:8080/product/add
Content-Type: application/json
{
"productName": "裙子",
"nums": 150
}
### 3、更新商品
POST http://localhost:8080/product/update
Content-Type: application/json
{
  "id":1,
  "productName": "皮靴",
  "nums": 88
}
### 4、删除商品
POST http://localhost:8080/product/delete
Content-Type: application/json
{
  "id":30
}
### 5、添加商品(非JSON方式)
POST http://localhost:8080/product/add-test
Content-Type: application/x-www-form-urlencoded
productName=裙子&nums=150
### 6、删除商品(非JSON方式)
POST http://localhost:8080/product/delete-test
Content-Type: application/x-www-form-urlencoded
id=29
###


写好测试用例后,左边会有个运行按钮,当你的 Tomcat 启动后,点击绿色小三角按钮就可以测试了:

微信图片_20220619194541.png


下面会有返回的结果。所以,直接使用 IDEA 进行测试是非常方便的。

测试小技巧:

http 文件中,直接打 gtrgtrpptrptrg 可以生成相应的代码,只需要写必要的参数就可以了,自己可以多试试。


00x2 前端代码实现


步骤总览

1、编写未对接数据库的前端代码

2、对接查询商品列表接口

3、SSM后台代码实现

4、部署Tomcat

5、编写测试用例


步骤实现

1、编写未对接数据库的前端代码

参考教程::Vue2.x案例之商品增删改查的实现。


在项目中新建一个 web 文件夹,然后新建 index.html 文件,因为代码比较简单,所以这里我使用传统的开发模式,方便大家入门:


image.png

image.png


然后就可以把教程中的代码粘贴进去了,用浏览器打开 index.html 文件,其实就可以实现增删改查了,只不过,页面都是没有对接数据库的,所以刷新页面的时候,页面会恢复原样,这当然不是我们所想要实现的效果!

2、对接查询商品列表接口

目前的商品数据是直接写死的:


  var data = {
    products: [
      { id: 1, productName: '袜子', nums: 15},
      { id: 2, productName: '羊毛衫', nums: 20},
      { id: 3, productName: '雪纺衫', nums: 24},
      { id: 4, productName: '高跟鞋', nums: 30}
    ],
    product4Add: { id: 0, productName: '', nums: '0'},
    product4Update: { id: 0, productName: '', nums: '0'}
  };


并且绑定到了Vue里面的data:

var vue = new Vue({
    el: '#app',
    data: data,
    ...


而我们应该做的是从后台的接口里获取到数据。


步骤如下:

我们将会引入 axios ,方便我们请求后台接口,然后写 list 方法对接后台的接口,查询到商品列表信息,你可以给出一个按钮,然后再执行list方法,但一般列表应该是一加载页面就去查询的。所以,我们可以使用Vue中的 mounted 钩子函数来达到这个目的。


1、引入axios

添加AJAX

<script src="https://cdn.bootcdn.net/ajax/libs/axios/0.21.1/axios.js"></script>


2、编写list方法对接后台接口

list() {
  let _this = this;
  axios.get("http://localhost:8080/product/list").then(
    (response) => {
      console.log("查询用户列表结果:", response);
      _this.products = response.data;
    }
  )
},


3、添加 mounted 钩子函数

mounted: function () {
  let _this = this;
  _this.list();
},


4、删除初始化的商品数据

var data = {
  products: [],
  ...
};


目前的完整代码如下:

<html>
<head>
  <meta charset="utf-8"/>
  <script src="https://cdn.bootcss.com/jquery/3.1.1/jquery.min.js"></script>
  <script src="https://cdn.bootcss.com/vue/2.5.22/vue.min.js"></script>
  <script src="https://cdn.bootcdn.net/ajax/libs/axios/0.21.1/axios.js"></script>
  ...省略部分未变代码
<script type="text/javascript">
  $("#div4Update").hide();
  //Model
  var data = {
    products: [],
    product4Add: {id: 0, productName: '', nums: '0'},
    product4Update: {id: 0, productName: '', nums: '0'}
  };
  ...省略部分未变代码
  //ViewModel
  var vue = new Vue({
    el: '#app',
    data: data,
    mounted: function () {
      let _this = this;
      _this.list();
    },
    methods: {
      list() {
        let _this = this;
        axios.get("http://localhost:8080/product/list").then(
          (response) => {
            console.log("查询用户列表结果:", response);
            _this.products = response.data;
          }
        )
      },
      add: function (event) {
    ...省略以下未变代码


代码比较多,其实没改几个地方,放出来代码,方便大家查阅。

3、对接删除商品接口

因为我们目前的 id 不是从后台获取的,所以,你可以把 id 获取到,然后显示出来,当然你也可以隐藏掉。隐藏掉操作如下,只需要加一句话就可以:

<td hidden>{{product.id}}</td>


image.png


但是你不获取,其实也可以,目前我们没有涉及到,所以不操作上面的步骤。


我们可以先把这段代码删掉,因为没有意义了:


  var maxId = 5;
  for (var i = 0; i < data.products.length; i++) {
    if (data.products[i].id > maxId)
      maxId = this.products[i].id;1
  }


然后将删除方法的代码修改为:

deleteProduct: function (id) {
  let _this = this;
  axios.post("http://localhost:8080/product/delete",
    {
      id: id
    }
    ).then(
    (response) => {
      if (response.data) {
        console.log("删除商品成功!");
        _this.list();
      }
    }
  )
},


说明:这里传参数,需要传 JSON 格式,否则无法跟后台接口对应上!(教程后面有完整代码

4、对接增加商品接口

增加接口与删除接口类似,把数据 post 给后端就可以了。

修改 product4Add ,删除初始值:


  var data = {
    products: [],
    product4Add: {},
    product4Update: {id: 0, productName: '', nums: '0'}
  };


注意:

1、这里是大括号 {} ,不是中括号 [] ,不然不行!

2、[] 表示一个数组, {} 表示一个对象。

修改 add 方法:

add: function (product) {
  let _this = this;
  axios.post("http://localhost:8080/product/add", product).then(
    (response) => {
      if (response.data) {
        console.log("添加商品成功!");
        _this.product4Add = {};
        _this.list();
      }
    }
  )
},


跟删除的方法非常相似,只不过这里是直接就传了一个 product 对象而已,与 JSON 格式是匹配的。

注意,此时,在点击 增加 按钮的时候,需要传一个 product 参数进来,所以需要加上:


<button type="button" v-on:click="add(product4Add)">增加</button>


5、对接修改商品接口

修改接口与增加接口类似,修改 product4Update ,删除初始值:

  var data = {
    products: [],
    product4Add: {},
    product4Update: {}
  };


修改 editupdate 方法

edit: function (product) {
  $("#productListTable").hide();
  $("#div4Update").show();
  let _this = this;
  _this.product4Update = product;
},
update: function (product) {
  let _this = this;
  axios.post("http://localhost:8080/product/update", product).then(
    (response) => {
      if (response.data) {
        console.log("修改商品成功!");
        _this.product4Add = {};
        $("#productListTable").show();
        $("#div4Update").hide();
      }
    }
  )
},


需要传一个 product 参数进来,所以需要加上:

<button type="button" v-on:click="update(product4Update)">修改</button>




说明:虽然更新页面里没有要求输入 id ,但是当你点击 编辑 按钮之后,其实是有带了 id 进去的。

那么到这里,然后修改功能就实现了!


image.png


老规矩,下面给出完整的代码!

6、index.html 完整代码
<html>
<head>
  <meta charset="utf-8"/>
  <script src="https://cdn.bootcss.com/jquery/3.1.1/jquery.min.js"></script>
  <script src="https://cdn.bootcss.com/vue/2.5.22/vue.min.js"></script>
  <script src="https://cdn.bootcdn.net/ajax/libs/axios/0.21.1/axios.js"></script>
  <style type="text/css">
    td {
      border: 1px solid #000;
    }
  </style>
</head>
<body>
<div id="app">
  <table id="productListTable">
    <thead>
    <tr>
      <th>商品名称</th>
      <th>数量</th>
      <th>操作</th>
    </tr>
    </thead>
    <tbody>
    <tr v-for="product in products">
      <td>{{product.productName}}</td>
      <td>{{product.nums}}</td>
      <td>
        <a href="#nowhere" @click="edit(product)">编辑</a>
        <a href="#nowhere" @click="deleteProduct(product.id)">删除</a>
      </td>
    </tr>
    <tr>
      <td colspan="3">
        商品名称:
        <input type="text" v-model="product4Add.productName"/>
        <br>
        数量:
        <input type="number" v-model="product4Add.nums"/>
        <br>
        <button type="button" v-on:click="add(product4Add)">增加</button>
      </td>
    </tr>
    </tbody>
  </table>
  <div id="div4Update">
    商品名称:
    <input type="text" v-model="product4Update.productName"/>
    <br>
    数量:
    <input type="number" v-model="product4Update.nums"/>
    <input type="hidden" v-model="product4Update.id"/>
    <br>
    <button type="button" v-on:click="update(product4Update)">修改</button>
    <button type="button" v-on:click="cancel">取消</button>
  </div>
</div>
<script type="text/javascript">
  $("#div4Update").hide();
  //Model
  var data = {
    products: [],
    product4Add: {},
    product4Update: {}
  };
  //ViewModel
  var vue = new Vue({
    el: '#app',
    data: data,
    mounted: function () {
      let _this = this;
      _this.list();
    },
    methods: {
      list() {
        let _this = this;
        axios.get("http://localhost:8080/product/list").then(
          (response) => {
            console.log("查询用户列表结果:", response);
            _this.products = response.data;
          }
        )
      },
      add: function (product) {
        let _this = this;
        axios.post("http://localhost:8080/product/add", product).then(
          (response) => {
            if (response.data) {
              console.log("添加商品成功!");
              _this.product4Add = {};
              _this.list();
            }
          }
        )
      },
      deleteProduct: function (id) {
        let _this = this;
        console.log("id" + id);
        axios.post("http://localhost:8080/product/delete",
          {
            id: id
          }
          ).then(
          (response) => {
            if (response.data) {
              console.log("删除商品成功!");
              _this.list();
            }
          }
        )
      },
      edit: function (product) {
        $("#productListTable").hide();
        $("#div4Update").show();
        let _this = this;
        _this.product4Update = product;
      },
      update: function (product) {
        let _this = this;
        axios.post("http://localhost:8080/product/update", product).then(
          (response) => {
            if (response.data) {
              console.log("修改商品成功!");
              _this.product4Add = {};
              $("#productListTable").show();
              $("#div4Update").hide();
            }
          }
        )
      },
      cancel: function () {
        //恢复显示
        $("#productListTable").show();
        $("#div4Update").hide();
      }
    }
  });
</script>
</body>
</html>


当然,代码还是有可以优化的地方的,但毕竟不想改那么多,如果你觉得不服,你可以从屏幕里出来打我!


image.png


这篇文章断断续续写了快一个月才完成,好累啊!将近3w字!!!

我决定把这篇文章把公众号里也发一下!原本不想发公众号,是因为公众号修改起来麻烦,那我发到公众号后,基本是不会再改的了,老铁们可以多提点建议,支持支持!


0xFF 总结


这篇文章使用SSM技术实现了后端,并且通过IDEA实现了测试,完全不依赖前端操作。然后随便建了文件夹就可以把前端给实现了,让有点前端基础的人也能轻松实现我们这一次的操作。完全打工前后端分离开发的流程!

请关注本博客,本博客很多文章都是在原博客上迭代写的,提供多种解决方案,有利于小伙伴们不迷路,感谢支持!

小伙伴们肯定觉得这个样式太难看了吧!本博客里有一篇配套的调整样式的文章,请参考:Bootstrap全局css样式的使用,效果是这样子滴,希望大家学得开心:


微信图片_20220619195519.png

相关实践学习
Serverless极速搭建Hexo博客
本场景介绍如何使用阿里云函数计算服务命令行工具快速搭建一个Hexo博客。
相关文章
|
1月前
|
前端开发 Oracle 关系型数据库
关于使用SSM+JSP开发时setter、getter隐式调用问题的小结
本文主要分享了在使用SSM+JSP进行网站开发时,因忽视setter、getter的隐式调用问题而导致的常见bug及其解决方法。详细介绍了setter和getter的隐式调用时机,并给出了具体示例,帮助开发者避免类似问题。
42 11
|
1月前
|
JavaScript
Vue基础知识总结 4:vue组件化开发
Vue基础知识总结 4:vue组件化开发
|
2月前
|
JavaScript 前端开发 测试技术
组件化开发:创建可重用的Vue组件
【10月更文挑战第21天】组件化开发:创建可重用的Vue组件
27 1
|
2月前
|
JavaScript 前端开发
vue全局公共组件自动引入并注册,开发效率直接起飞!
【10月更文挑战第14天】vue全局公共组件自动引入并注册,开发效率直接起飞!
54 1
|
2月前
|
存储 前端开发 中间件
vue3之vite配置vite-plugin-mock使用mock轻松创建模拟数据提高开发效率
vue3之vite配置vite-plugin-mock使用mock轻松创建模拟数据提高开发效率
402 0
|
2月前
|
存储 JSON JavaScript
Vue.js开发中基于localStorage与sessionStorage的本地存储利器:Vue-ls插件使用详解
Vue.js开发中基于localStorage与sessionStorage的本地存储利器:Vue-ls插件使用详解
68 0
|
2月前
|
设计模式 JavaScript 开发工具
Vue开发中使用好钩子方法(hook method)可以使你的代码更加模块化和可维护
Vue开发中使用好钩子方法(hook method)可以使你的代码更加模块化和可维护
20 0
|
2月前
|
JavaScript 算法 前端开发
在Vue开发中v-if指令和v-show指令的使用介绍,v-if和v-for的优先级以及使用注意事项的介绍
在Vue开发中v-if指令和v-show指令的使用介绍,v-if和v-for的优先级以及使用注意事项的介绍
23 0
|
4月前
|
Java 数据库连接 Maven
手把手教你如何搭建SSM框架、图书商城系统案例
这篇文章是关于如何搭建SSM框架以及实现一个图书商城系统的详细教程,包括了项目的配置文件整合、依赖管理、项目结构和运行效果展示,并提供了GitHub源码链接。
手把手教你如何搭建SSM框架、图书商城系统案例
|
3月前
|
Java 应用服务中间件 数据库连接
ssm项目整合,简单的用户管理系统
文章介绍了一个使用SSM框架(Spring、SpringMVC、MyBatis)构建的简单用户管理系统的整合过程,包括项目搭建、数据库配置、各层代码实现以及视图展示。
ssm项目整合,简单的用户管理系统