发表于: 2018-03-24 15:24:58

2 693


今天也是白天写日报了,上午修改自己的批量插入语句,然后掉坑里面了,多亏师兄才爬出来。

首先要明确foreach的用法,foreach本质应该算是一个增强for循环的语句,在sql批量操作中是如下的写法:

<foreach item="item" index="index" collection="list" separator=",">
(#{item})
</foreach>

(有一个open和close没写,open=“”close=“”,open表示循环会以这个引号里面的字符开始(不知道字符串行不行,网上都是“(”开始的,我最后试了去掉open这个参数也不影响foreach语句的进行),close表示循环会以这个引号里面的字符结束,index表示索引(没用上,不知道作用),最重要的是剩下的3个参数,collection是你插入这个循环的东西的key值(我的理解就是如果插入的是list那么key值就是list,是规定写法,这里应该只能插map和list,map应该写啥看了一遍就忘了=-=),separator是表示以引号里面的字符分隔循环。

我掉坑是因为这个item(item引号里面的名字没有规定写法 写什么都行 但是要和后面的#{}中的名称保持一致),理解错了item的含义,举个例子比较好理解,如果我list里面是Student类里面的name属性,那么我要写成#{item},如果我list里面是Student类,那么我要写成#{item.name},这样foreach才知道它要提取的是list里面的name属性,而我一开始插入的本来就是name的list,然后我还写成了item.name,得到了报错是没有给name一个getter和setter方法(应该是foreach认不出这个name就是student类里面的属性,因为我写的含义就是name.name,那程序自然就晕了..你给我的到底是啥东西 emmmm)。还有一点要注意的就是sql语句原本是insert into table(name) values  (#{name}),不要因为有了一个<foreach>语句就写成insert into table (name) <foreach> #{name}...我就是忘记加了外面这个括号导致一直报错sql语法错误,我自己还觉得写的挺对的。。师兄一看就看到了是这里少了括号。(自己看了2个小时的错误师兄一下解决..)

然后是测试批量插入速度,先附上一段测试程序代码(studentMapper已通过@autowire由spring容器自动生成)

Student student = new Student();

student.setName("博丽灵梦");
List<String> list =new ArrayList<String>();
for(int i=0;i<2000;i++){
list.add(student.getName());
}
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

System.out.println(df.format(new Date()));

studentMapper.pinsert(list);

SimpleDateFormat cf = new SimpleDateFoamat("yyyy-MM-dd HH:mm:ss");

System.out.println(cf.format(new Date()));

运用批量处理:插入2000条相同数据(且数据只有一个属性姓名),得到以下结果:

 运用传统方法插入同样的数据

这个时间不是很准,我就直接设置秒了,本来应该精确到毫秒,但是也能明显的看出差距,差距来源于foreach是循环之后统一提交一次sql语句进行处理(其实这个就是拼接?不懂,总之循环之后的语句是 ?,?,?,? 问号是从list或者map里面拿出来的属,然后这个语句作为插入语句values的值),而传统方法是每句sql都提交一次。那么这个foreach循环可不可以直接插入1000000条语句呢?我把循环中的i<2000改为i<1000000得到结果:

hhh,结果?不存在的,这test直接没跑过去,找原因,sql语句后面提示了这个:

果断问度娘,是这个修改方法,下面还有个直接修改mysql配置文件的,没截:



.....咋回事儿啊。用第二种方法试试:

.....就先写到这儿。去解决问题了,晚上再写剩下的...

这个问题没解决,倒是解决了一下centos7系统下安装mysql5.7的方法,网址在下面,一步一步走就可以,我之前想用xshell把文件手动传上去,但是解压的时候报错,还是按照网上的办法用yum命令下载了mysql5.7然后安装了,记得修改uft-8编码的时候

前面没有#号,我还一直按有#号的写,结果写完之后来回重启mysql和服务器发现uft-8编码还是没有改变,后来试着删了#号就可以了。

centos7环境下安装mysql5.7网站:https://www.linuxidc.com/Linux/2016-09/135288.htm

继续安装java去了,数据库的问题晚上再说。

有毒吧 11点了 睡觉去了2333 不弄了

好吧 熬夜配置完了。但是jar包导进去还是没法自动下载需要的依赖,应该是没有配置maven本地仓库的原因,服务器上不会配置了


返回列表 返回列表
评论

    分享到