您的位置 首页 java

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

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

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

教学视频地址:

教学素材下载地址:

知识点:

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

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

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

4、为mapper生成接口

5、去控制层添加路由

1)、@PostMapping标识

2)、@ Request Param标识

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(“#34;+_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

文章来源:智云一二三科技

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

文章地址:https://www.zhihuclub.com/200694.shtml

关于作者: 智云科技

热门文章

网站地图