一、概述
之前在做node.js+mysql的项目时,需要实现一整个表的存储和修改,需要用到批量存储,但是貌似npm 中的mysql并不具备相关功能,只能自己靠着自己对批量存储的理解来手动写一个批量存储的代码。
二、思路
2.1 思路概述
我对批量存储的理解就是能够不止一条的执行sql语句(虽然说可能不是很准确,但是从结果逆推过来,差不多就是这个意思了)。首先,我们来想一下批量存储的目的是什么:批量存储能够帮你一次性处理很多条数据,然后把这些数据全都存储到数据库中。所以我们要做类似批量存储的逻辑的话,首要解决的问题就是“多条”,如果不能多条,谈何批量?所以,先要能够获取多条数据。其次,我们知道npm中mysql模块的使用方法都是我们来写一条数据库语句,然后该模块拿去执行(例如,我们写一个select * from users,该模块的作用是把这条语句拿给数据库执行,然后返回结果)。虽然我们这里已经获取了多条数据了,但是无奈我们的数据库模块并不具备一次性执行多条数据库语言的能力,所以这里还是要靠我们自己去写(所有这里的批量处理逻辑代码你都可以考虑写到两个地方——服务器端、前端JS)。
2.2 思路整理
综合以上思路概述(可能字数太多,不想看,那我们就整理个简单暴力的列表),我们可以整理出以下内容是需要我们自己动手处理的:
1.获取多条数据(前端获取表单中的多条数据)
2.重复执行数据库语句(类似一个变长循环,每一次循环执行一条数据库语句)
2.3 伪代码
这里我们设置标量values为我们获取的多条数据集合。那我们大概伪代码如下(能看懂最好,看不懂也无所谓,就是上面的文字意思):
for(var i in values){
INSERT INTO users(name,password) VALUES(values[i].name,values[i].password);
}
就是这么一个意思,根据我们获取的数据条数来确定我们需要执行多少条数据库语句。
三、代码
jQuery代码:(这里我获取table里面th的值,你们可以根据自己的情况,获取自己想要的值)
function submitGrade(){
var submitNum = $("#tableMain").find('tbody').find('tr').length;//先获取要提交数据的行数
//声明ajax传递的json数据
var ajaxData = {
SID:null,
Sname:null,
grade1:null,
grade2:null,
finalGrade:null,
Cname:null,
ratio:null,
Sdep:null,
Sclass:null,
Tname:null,
Cgrade:null
};
//根据数据的条数来确定执行多少个循环
for(i = 0; i < submitNum; i++){
//赋值语句
SID = $($($("#tableMain").find('tbody').find('tr')[i]).find('th')[0]).text();
Sname = $($($("#tableMain").find('tbody').find('tr')[i]).find('th')[1]).text();
grade2 = $($($("#tableMain").find('tbody').find('tr')[i]).find('th')[2]).find('input').val();
grade1 = $($($("#tableMain").find('tbody').find('tr')[i]).find('th')[3]).find('input').val();
Cname = getLocalStorageByKey('teacher', 'Tcourse');
Sdep = $($($("#tableMain").find('tbody').find('tr')[i]).find('th')[4]).text();
Sclass = $($($("#tableMain").find('tbody').find('tr')[i]).find('th')[5]).text();
Tname = $($($("#tableMain").find('tbody').find('tr')[i]).find('th')[6]).text();
ajaxData.SID = SID;
ajaxData.Sname = Sname;
ajaxData.grade2 = grade2;
ajaxData.grade1 = grade1;
ajaxData.Cname = Cname;
ajaxData.Sdep = Sdep;
ajaxData.Sclass = Sclass;
ajaxData.Tname = Tname;
//这里用ajax把值传递出去,注意这里没写success函数,如果写了他执行成功就会跳到success函数中去;只写error函数,如果出错了就跳到error函数中,打断当前循环。这样的话,只要最后我的i=submitNum就说明都没有出错,变相的说明成功了。
$.ajax({
method:'POST',
url:'/submitNormalGrade',
data:ajaxData,
error:submitNormalGradeError
})
}
//判断处理是否完成(只要i=submitNum就说明全都已经执行了)
if(i == submitNum){
alert('提交成绩成功');
}
function submitNormalGradeError(){
alert('提交成绩失败');
}
}
其余路由、DAO层都按照一般的增删查改写就行了,我们在前端已经实现了获取多条数据和多次ajax提交(变相的多次执行数据库语句)。
还有一种方法是向服务器端传输一个对象数组数据,如:
ajaxData = {
data:[]
}
但是发现好像服务器端不能通过req.body.data[0].name、req.body.data[1].name……来找到对应的数据,总之这个方法失败了。不然的话,这样应该会更好一点,能够减少ajax的请求数,然后在DAO层中遍历传来的数据,再一条一条依次执行。
因为我也是第一次接触批量处理,可能会有很多错误,希望大家能够指出。因为很少找到类似的demo,只能自己摸索写一个功能差不多,但是性能、质量方面并未做过多的测试。希望大家有知道的能够不吝赐教。