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...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- navicat无法连接mysql服务器 (65)
- 下横线怎么打 (71)
- flash插件怎么安装 (60)
- lol体验服怎么进 (66)
- ae插件怎么安装 (62)
- yum卸载 (75)
- .key文件 (63)
- cad一打开就致命错误是怎么回事 (61)
- rpm文件怎么安装 (66)
- linux取消挂载 (81)
- ie代理配置错误 (61)
- ajax error (67)
- centos7 重启网络 (67)
- centos6下载 (58)
- mysql 外网访问权限 (69)
- centos查看内核版本 (61)
- ps错误16 (66)
- nodejs读取json文件 (64)
- centos7 1810 (59)
- 加载com加载项时运行错误 (67)
- php打乱数组顺序 (68)
- cad安装失败怎么解决 (58)
- 因文件头错误而不能打开怎么解决 (68)
- js判断字符串为空 (62)
- centos查看端口 (64)