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

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

qiyuwang 2024-11-17 15:12 19 浏览 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

相关推荐

# 安装打开 ubuntu-22.04.3-LTS 报错 解决方案

#安装打开ubuntu-22.04.3-LTS报错解决方案WslRegisterDistributionfailedwitherror:0x800701bcError:0x80070...

利用阿里云镜像在ubuntu上安装Docker

简介:...

如何将Ubuntu Kylin(优麒麟)19.10系统升级到20.04版本

UbuntuKylin系统使用一段时间后,有新的版本发布,如何将现有的UbuntuKylin系统升级到最新版本?可以通过下面的方法进行升级。1.先查看相关的UbuntuKylin系统版本情况。使...

Ubuntu 16.10内部代号确认为Yakkety Yak

在正式宣布Ubuntu16.04LTS(XenialXerus)的当天,Canonical创始人MarkShuttleworth还非常开心的在个人微博上宣布Ubuntu下个版本16.10的内...

如何在win11的wsl上装ubuntu(怎么在windows上安装ubuntu)

在Windows11的WSL(WindowsSubsystemforLinux)上安装Ubuntu非常简单。以下是详细的步骤:---...

Win11学院:如何在Windows 11上使用WSL安装Ubuntu

IT之家2月18日消息,科技媒体pureinfotech昨日(2月17日)发布博文,介绍了3中简便的方法,让你轻松在Windows11系统中,使用WindowsSubs...

如何查看Linux的IP地址(如何查看Linux的ip地址)

本头条号每天坚持更新原创干货技术文章,欢迎关注本头条号"Linux学习教程",公众号名称“Linux入门学习教程"。...

怎么看电脑系统?(怎么看电脑系统配置)

要查看电脑的操作系统信息,可以按照以下步骤操作,根据不同的操作系统选择对应的方法:一、Windows系统通过系统属性查看右键点击桌面上的“此电脑”(或“我的电脑”)图标,选择“属性”。在打开的...

如何查询 Linux 内核版本?这些命令一定要会!

Linux内核是操作系统的核心,负责管理硬件资源、调度进程、处理系统调用等关键任务。不同的内核版本可能支持不同的硬件特性、提供新的功能,或者修复了已知的安全漏洞。以下是查询内核版本的几个常见场景:...

深度剖析:Linux下查看系统版本与CPU架构

在Linux系统管理、维护以及软件部署的过程中,精准掌握系统版本和CPU架构是极为关键的基础操作。这些信息不仅有助于我们深入了解系统特性、判断软件兼容性,还能为后续的软件安装、性能优化提供重要依据。接...

504 错误代码解析与应对策略(504错误咋解决)

在互联网的使用过程中,用户偶尔会遭遇各种错误提示,其中504错误代码是较为常见的一种。504错误并非意味着网站被屏蔽,它实际上是指服务器在规定时间内未能从上游服务器获取响应,专业术语称为“Ga...

猎聘APP和官网崩了?回应:正对部分职位整改,临时域名可登录

10月12日,有网友反映猎聘网无法打开,猎聘APP无法登录。截至10月14日,仍有网友不断向猎聘官方微博下反映该情况,而猎聘官方微博未发布相关情况说明,只是在微博内对反映该情况的用户进行回复,“抱歉,...

域名解析的原理是什么?域名解析的流程是怎样的?

域名解析是网站正常运行的关键因素,因此网站管理者了解域名解析的原理和流程对于做好域名管理、解决常见解析问题,保障网站的正常运转十分必要。那么域名解析的原理是什么?域名解析的流程是怎样的?接下来,中科三...

Linux无法解析域名的解决办法(linux 不能解析域名)

如果由于误操作,删除了系统原有的dhcp相关设置就无法正常解析域名。  此时,需要手动修改配置文件:  /etc/resolv.conf  将域名解析服务器手动添加到配置文件中  该文件是DNS域名解...

域名劫持是什么?(域名劫持是什么)

域名劫持是互联网攻击的一种方式,通过攻击域名解析服务器(DNS),或伪造域名解析服务器(DNS)的方法,把目标网站域名解析到错误的地址从而实现用户无法访问目标网站的目的。说的直白些,域名劫持,就是把互...

取消回复欢迎 发表评论: