百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程文章 > 正文

622、springboot带参向mysql插入产品信息,此法适用于删除与修改

qiyuwang 2024-11-17 15:12 22 浏览 0 评论

622、springboot带参数向mysql插入产品信息,此法适用于删除与修改操作

springboot向mysql插入产品信息,带参用法,适用于插入,删除,修改等操作。教案暂时只列出插入操作,删除,修改操作,请同学们作为作业自己做,做后台管理时将增加删除,修改操作。

教学视频地址:

https://www.ixigua.com/7028722184373666317?id=7100224985347654157&logTag=6a3ea7c123daa0aa2cd2

教学素材下载地址:

http://disk.1473.cn/taobaoteaching

知识点:

1、下载”淘宝我要卖”页面素材及第620节springboot素材

2、数据库建立插入产品信息存储过程

3、为存储过程建立mapper配置节

4、为mapper生成接口

5、去控制层添加路由

1)、@PostMapping标识

2)、@RequestParam标识

3)、数据类型转换

6、淘宝我要卖页面通过springtoot向数据库插入产品信息

7、问题

8、效果

9、常见错误

10、新手如何学习架构

操作步骤

1、下载”淘宝我要卖”页面素材及第620节springboot素材

下载上图红色的html素材文件。

下载上图红色的sprintboot素材,按照第630节介绍的方法导入springboot项目,最好是从头学到尾,自己做素材。

2、数据库建立插入产品信息存储过程

CREATE DEFINER=`root`@`localhost` PROCEDURE `Product_Insert`(IN `name` VARCHAR(200), IN `type` INT(11), IN `price` DOUBLE, IN `number` INT(11), IN `picture` VARCHAR(500), IN `thumbnail220` VARCHAR(500), IN `thumbnail150` VARCHAR(500), IN `thumbnail80` VARCHAR(500), IN `brief` VARCHAR(500), IN `detail` TEXT, IN `username` VARCHAR(50))

NO SQL

BEGIN

INSERT into Products(ProductName,ProductType,ProductPrice,ProductQuantity,ProductPicture,ProductThumbnail220px,ProductThumbnail150px,ProductThumbnail80px,ProductBrief,ProductDetail,UserName,ProductStart) VALUES(name,type

,price,number,picture,thumbnail220,thumbnail150,thumbnail80,brief,detail,username,NOW());

select @@IDENTITY as id;

END

添加一条插入数据的id值,作为前端判断是否插入成功的标识,id值大于0则插入成功。

select @@IDENTITY as id

上条语句会返回插入的值的行id。

3、为存储过程建立mapper配置节

Mybatis的jdbctype和数据库字段类型的对应关系。

其完整编码如下:

<!-->带参数存储过程 注意jdbcType,需要查询,如一个参数则为Map类型,如为多个参数,则为java.util.HashMap类型 <-->

<select id="Product_Insert" resultType="integer" statementType="CALLABLE" parameterType="map">

<![CDATA[

{

call Product_Insert(

#{name,mode=IN,jdbcType=VARCHAR},

#{type,mode=IN,jdbcType=INTEGER},

#{price,mode=IN,jdbcType=DOUBLE},

#{number,mode=IN,jdbcType=INTEGER},

#{picture,mode=IN,jdbcType=VARCHAR},

#{thumbnail220,mode=IN,jdbcType=VARCHAR},

#{thumbnail150,mode=IN,jdbcType=VARCHAR},

#{thumbnail80,mode=IN,jdbcType=VARCHAR},

#{brief,mode=IN,jdbcType=VARCHAR},

#{detail,mode=IN,jdbcType=VARCHAR},

#{username,mode=IN,jdbcType=VARCHAR}

)

}

]]>

</select>

释义:resultType="integer" 数据库返回整形,大于0表示插入成功

整形写法:#{name,mode=IN,jdbcType=VARCHAR}

Double类型写法:#{price,mode=IN,jdbcType=DOUBLE}

字符串型写法:#{picture,mode=IN,jdbcType=VARCHAR}

记住这三种类型即可,如有更多类型,可查阅上面的表格。

4、为mapper生成接口

//此处是与mapper的xml一一配对的,需按照此格式编写。

//因使用架构,大家知道用法,复制粘贴即可。

//@Param("name")String name name为数据库字段名,替换为你数据库的字段即可。

int Product_Insert(

@Param("name")String name,

@Param("type")int type,

@Param("price")double price,

@Param("number")int number,

@Param("picture")String picture,

@Param("thumbnail220")String thumbnail220,

@Param("thumbnail150")String thumbnail150,

@Param("thumbnail80")String thumbnail80,

@Param("brief")String brief,

@Param("detail")String detail,

@Param("username")String username);

5、去控制层添加路由

此处较为复杂,也很简单。复杂在springboot把简单的事情做得很复杂,简单在只要会字符串操作即能处理此看似极为复杂的问题。

所谓大道至简是也,字符串与数组的操作新手即会,速度最快,操作最简单。看了很多springboot关于前后端勾连的文章,无不是从极为繁琐的封装出发。此处另辟蹊径,用1473.cn的关于servlet的后端封装方法,解放程序员思想,如能触类旁通,后端程序员工作量可减少80%。

//插入一条语句

//post请求要获取参数需要@PostMapping标识,不获取参数则@RequestMapping,@PostMapping都可以。

@PostMapping(value = "/Product_Insert")

//这是get方式的写法,不推荐。

//public @ResponseBody int Product_Insert(@RequestParam String name,@RequestParam Integer type,@RequestParam Double price,@RequestParam Integer number,@RequestParam String picture,@RequestParam String thumbnail220,@RequestParam String thumbnail150,@RequestParam String thumbnail80,@RequestParam String brief,@RequestParam String detail,@RequestParam String username) throws Exception{

//这是post请求

public int Product_Insert(@RequestParam String mode) throws Exception{

//把前端传递的字符串转换为数组

String[] params=mode.split(",");

//把数组里面的元素发送给存储过程执行。

//数字类型,double类型需要类型转换。

int _lines = dao.Product_Insert(params[0], Integer.parseInt(params[1])

,Double.parseDouble(params[2]) ,Integer.parseInt(params[3]),

params[4],params[5],params[6],params[7],params[8],

params[9],params[10]);

//System.out.println(examples);

//插入,修改,删除等不返回结果的存储过程返回数据库行号,作为是否成功的标识。

return _lines;

}

1)、@PostMapping标识

post请求要获取参数需要@PostMapping标识,不获取参数则@RequestMapping,@PostMapping都可以。

请求前端参数标识,不是知识点,换一个架构又不一样,知道用法就可以了

2)、@RequestParam标识

请求前端参数标识,不是知识点,换一个架构又不一样,知道用法就可以了。

此处的参数名称mode需要与前端ajax中的名称mode一模一样,这架构做得太随意了。

3)、数据类型转换

字符串转换为整形。Integer.parseInt(params.get(1))

字符串转换为double类型。Double.parseDouble(params.get(2))

Integer,Double属于包装类型,前期学习可以不理它,知道有这个东西就行,其他语言里很少有这个概念,说明可有可无。

6、Get,post请求的进一步讲解

详情请参见第613节,次两节对于理解前后端关系非常重要。

1)、Get请求

因淘宝,京东有些请求是get请求,此处做一下介绍。

前端:

get请求的传参模式是在地址中加问号”?”,多个参数之间用与号”&”进行分割。参数形式为名称=值,示例如下:

ajax("http://localhost:8080/Product_Insert?name="+_productTitle+"&type="+_categoryId+"&price="+_productPrice+"&number="+_productNumber+"&picture="+_productImg350px+"&thumbnail220="+_productImg220px+"&thumbnail150="+_productImg150px+"&thumbnail80="+_productImg80px+"&brief="+_productBrief+"&detail="+_productDetail+"&username="+_username,function(r){

后端:

Springboot后端使用如下标识接收get请求。@RequestMapping(value = "/Product_Insert")

2)、Post请求

前端:

参数之间以逗号进行区隔。

后端:

Springboot后端使用如下标识接收get请求。@PostMapping(value = "/Product_Insert")

7、淘宝我要卖页面通过springtoot向数据库插入产品信息

需要改写ajax函数,实现参数传递,同时,大家可以进一步了解有思俱乐部的架构。

//自定义ajax函数

ajax=function(url,params,callback){

//把数组用逗号分割,形成字符串

var _arg="mode="+params.join();

//自己构建ajax请求后端数据到前端。

var _xmr=new XMLHttpRequest();//创建一个ajax对象

//使用post方式打开请求。

_xmr.open("POST",url);

//必须发送一个HTTP协议的头文件

_xmr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");

//_xmr.setRequestHeader("Content-Type","application/json");

//向后端发送请求,并传递字符串参数。此字符串后端可拼接成数组。

_xmr.send(_arg);

//服务器返回的内容在此函数中

_xmr.onreadystatechange=function(){

//如果服务器返回状态为200,标识成功

if(this.readyState==4 && this.status==200){

//服务器返回的数据在此

//alert(this.responseText);

//把服务器返回的字符串转换为json

var _json=eval(this.responseText);

//alert(_json);

callback(_json);

}

}

}

8、问题

1)、mysql数据库order by 提示:Out of sort memory, consider increasing server sort buffer size

一个办法是修改配置sort_buffer_size = 2M,但这样修改会严重影响性能,最好的办法是优化sql语句,不要用select * ,而是只拿需要的字段。这样可以减少sort_buffer_size的消化。

2)、Mybatis没有text数据类型,如果是超大字符串会否报错,还未测试!

9、效果

插入数据成功后返回插入的行号,如下图所示。

10、常见错误

1)、控制层int参数错误:

Optional int parameter 'type' is present but cannot be translated into a null value due to being declared as a primitive type. Consider declaring it as object wrapper for the corresponding primitive type.

将int改成Integer即可。int类型属于基本类型,无法进行非null判断,但Integer属于包装类型,可以进行非null判断。所以导致了这个错误,还需要对参数进行非null判断。

If(type==null){做处理}

2)、控制层参数double类型出错:

Optional double parameter 'price' is present but cannot be translated into a null value due to being declared as a primitive type. Consider declaring it as object wrapper for the corresponding primitive type.

需要把double类型改成Double类型。

3)、前端向后端发送json格式转换错误

Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type `cn.usestudio.controller.DirectoryController$insertProduct` from Array value (token `JsonToken.START_ARRAY`); nested exception is com.fasterxml.jackson

解决办法:

4)、http405错误

如前端是get请求,后端是post请求,则会报405错误。

5)、http400错误

400 是 HTTP 的状态码,主要有两种形式:

(1)、bad request 意思是 "错误的请求";

(2)、invalid hostname 意思是 "不存在的域名"

在 ajax 请求后台数据时比较常见。产生 HTTP 400 错误的原因有:

(1)、前端提交数据的字段名称或者是字段类型和后台的实体类不一致,导致无法封装;

(2)、前端提交的到后台的数据应该是 json 字符串类型,而前端没有将对象转化为字符串类型;

解决方案:

(1)、对照字段名称,类型保证一致性

(2)、使用 stringify 将前端传递的对象转化为字符串:

data: JSON.stringify(param);

6、http415错误

在用POST方式携带token访问一个API接口时,返回状态码为415,错误信息为“Unsupported Media Type”,发送http请求时用json类型,springboot接收时用json类型。

前后端json不匹配。

6)、Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported

Content-Type设置为“application/x-www-form-urlencoded;charset=UTF-8”,如果前端POST请求中的body是Json对象的话,会报上述错误。

前端请求传Json对象则后端使用@RequestParam;

前端请求传Json对象的字符串则后端使用@RequestBody。

7)、no String-argument constructor/factory method to deserialize from String value

前端未使用application/json传递数据,而后端使用@RequestBody接收数据时,会报此错误。

Springboot规范太多,不够自由,直接使用C语言数组形式,简单,方便,高效。

8)、Mapper method 'cn.usestudio.mapper.DirectoryMapper.Product_Insert attempted to return null from a method with a primitive return type (int).

数据库需要返回插入数据的行号。

9)、NAVICATE 修改存储过程提示PROCEDURE _Navicat_Temp_Stored_Proc already exists

数据库bug了。

解决方法 :

DROP PROCEDURE _Navicat_Temp_Stored_Proc

相关推荐

在Word中分栏设置页码一页两个页码的技巧!

施老师:在正常情况下,Word文档中一页只会出现一个页码。但在某种情况下,比如说:用了分栏后,我们希望一页中出现两个页码,那应该如何实现呢?今天,就由宁双学好网施老师来为大家讲一下,利用域来实现一页两...

如何在关键时刻向上自荐(如何在关键时刻做出正确选择)

抓住机会,挺身而出有种时刻叫“关键时刻”,关键时刻,作为一个认为自己有能力的、训练有素的人,应该考虑挺身而出,甚至应该不考虑就挺身而出。...

WPS Word:跨页的文档表格,快速调整为一页。#Excel

如何快速将跨页的文档表格调整为一页?需要根据两种情况分别处理。如果表格所有行的行高相同,调整为一页的方法有两种。第一种方法是将光标移动到表格内,然后将鼠标移动到表格右下角的方框处,按住鼠标左键向上拖动...

word文档插入下一页分节符(word下一页分页符)

在word文档中,对文档页面进行分页是特别常见的操作,其中的下一页分节符也是用得比较多的,但是一些人不太清楚在哪里设置,也不知道它具体能实现的功能是什么。接下来看看如何在word文档中插入下一页分节符...

word文档如何设置某一页纸张的方向

word文档页面方向有横向和纵向,纵向是默认的纸张方向,有时我们需要将页面设置为横向,或只设置其中某一页方向,应该怎么操作呢?一起来看看下面的详细介绍第一步:...

word怎么单独设置一页为横向(word2019怎样设置单独一页为横向)

word里面其中一页可以改为横向的吗?经过实际操作发现是完全可以的。...

Word如何设置分栏,如何一页内容同时显示一栏和两栏

我们使用Word文档,有时需要用到两栏的排版,甚至一页内容同时包含一栏和两栏的排版,这种格式怎么设置呢?具体步骤如下:首先是两栏排版的设置,直接点击Word文件上方工具栏【布局】,选择【分栏】下面的【...

Word怎么分页?这三个方法可以帮到你

我们不仅可以利用Word编辑文档,还可以编辑文集呢。但是有时候会出现两个部分的文章长短不一,我们需要对文档进行分页处理。这样可以方便我们对文档进行其他操作。那么Word怎么分页呢?大家可以采用下面这...

Word内容稍超一页,如何优化至单页打印?

如何将两页纸的内容,缩到一页打印呢?有时候一页纸多一点内容,我们完全可以缩一下,放到一页来打印。...

[word] word 表格如何跨行显示表头、标题

word表格如何跨行显示表头、标题在Word中的表格如果过长的话,会跨行显示在另一页,如果想要在其它页面上也显示表头,更直观的查看数据。难道要一个个复制表头吗?当然不是,教你简单的方法操作设置Wo...

Word表格跨页如何续上表?(word如何让表格跨页不断掉)

长文档的表格跨页时,你会发现页末空白太多了,这时要怎么调整?选中整张表格,右击【表格属性】,点击【行】选项,之后勾选【允许跨页断行】,点击确定即可解决空白问题。...

Word怎么连续自动生成页码,操作步骤来了!

Word怎么连续自动生成页码,操作步骤来了!...

word文档怎么把两页合并成一页内容?教你4种方法

word怎么把两页合并成一页?word怎么把两页合并成一页?用四种方法演示一下。·方法一:把这一个文档合并成一页,按ctrl加a全选文档,然后右键点击段落,弹出的界面行距改成固定值,磅值可以改小一点,...

如何将Word中的一页的纸张方向设置为横向?这里提供详细步骤

默认情况下,MicrosoftWord将页面定向为纵向视图。虽然这在大多数情况下都很好,但你可能拥有在横向视图中看起来更好的页面或页面组。以下是实现这一目标的两种方法。无论使用哪种方法,请注意,如果...

Word横竖混排你会玩吗?(word横排竖排混合)

我们在用Word排版的时候,一般都是竖版格式,但偶尔会需要到一些特殊的版式要求,比如文档中插入的一个表格,横向的内容比较多,这时就需要用到横版,否则表格显示不全。这种横竖版混排的要求,在Word20...

取消回复欢迎 发表评论: