发表于: 2018-04-25 23:02:19
1 541
今日完成:
一、批量插入,mybiats foreach标签
foreach中的标签
foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。foreach元素的属性主要有
item,index,collection,open,separator,close。
item表示集合中每一个元素进行迭代时的别名,
index指 定一个名字,用于表示在迭代过程中,每次迭代到的位置,
open表示该语句以什么开始,
separator表示在每次进行迭代之间以什么符号作为分隔 符,
close表示以什么结束,
在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况 下,该属性的值是不一样的,主要有一下3种情况:
如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了
参数类型为list
2.mybatis ExecutorType.BATCH
Mybatis内置的ExecutorType(执行类型)有3种,默认的是simple,该模式下它为每个语句的执行创建一个新的预处理语句,单条提交sql;而batch模式重复使用已经预处理的语句,并且批量执行所有更新语句,显然batch性能将更优; 但batch模式也有自己的问题,比如在Insert操作时,在事务没有提交之前,是没有办法获取到自增的id,这在某型情形下是不符合业务要求的
<!--批量插入-->
<insert id="studentBuchInsert">
INSERT INTO st_info(id,name,age)
VALUES
<foreach collection= "list" item= "user" separator = ",">
(#{user.id},#{user.name},#{user.age})
</foreach>
</insert>
public void studentBathInsert() {
SqlSession session = factory.openSession();
long start = currentTimeMillis();
long time = currentTimeMillis();
List<User> list=new ArrayList<>();
User user;
for (int i=0;i<10000;i++){
user = new User();
int x=1+(int)(Math.random()*50);
user.setName("张宇" + i);
user.setAge(x);
list.add(user);
}
session.insert("studentBuchInsert", list);
session.commit();
session.close();
long end = currentTimeMillis();
System.out.println("---------------" + (start - end) + "---------------");
特别注意:mysql默认接受sql的大小是1048576(1M),若数据量超过1M会报异常,网上资料在mysql中可以取消限制,找了一下没找到,先插入8万条看一下性能,
无索引插入8万条:exclude patterns:----------------5514---------------
清零重置主键,添加age索引:exclude patterns:----------------5465---------------
对插入数据影响不大
用for循环单词提交,取消索引插入数据,对比效率:exclude patterns:----------------27542---------------
可以看到,在mybatis中批量插入的效率提升还是很明显的
深度思考:
1.maven是什么,和Ant有什么区别
Ant的作用:是一种基于Java的build工具
- 可以用ant编译java类,生成class文件
- ant可以自定义标签、配置文件,用于构建。
- ant可以把相关层构建成jar包 。
- ant把整个项目生成web包,并发布到Tomcat
Ant的优点:
- 跨平台性:Ant是纯Java语言编写的,因此具有很好的跨平台性。
- 操作简单:Ant是由一个内置任务和可选任务组成的。Ant运行时需要一个XML文件(构建文件)。
- Ant通过调用target树,就可以执行各种task:每个task实现了特定接口对象。由于Ant构建文件时XML格式的文件,所以很容易维护和书写,而且结构很清晰。
- Ant可以集成到开发环境中:由于Ant的跨平台性和操作简单的特点,它很容易集成到一些开发环境中去。
Maven的作用: 除了以程序构建能力为特色之外,还提供高级项目管理工具。
Maven除了具备Ant的功能外,还增加了以下主要的功能:
- 使用Project Object Model来对软件项目管理;
- 内置了更多的隐式规则,使得构建文件更加简单;
- 内置依赖管理和Repository来实现依赖的管理和统一存储;
- 内置了软件构建的生命周期;
Maven的优点:
- 拥有约定,知道你的代码在哪里,放到哪里去
- 拥有一个生命周期,例如执行 mvn install就可以自动执行编译,测试,打包等构建过程
- 只需要定义一个pom.xml,然后把源码放到默认的目录,Maven帮你处理其他事情
- 拥有依赖管理,仓库管理
整体的比较:
Ant将提供了很多可以重用的task,例如 copy, move, delete以及junit单元测试Maven则提供了很多可以重用的过程。我们可以把 Maven看成是一个"build container"这个容器可以让我们重用从一系列的项目中抽像出来的build过程。
2.clean,install,package,deploy分别代表什么含义?maven的用途:
(1)maven是一个项目构建和管理的工具,提供了帮助管理构建、文档、报告、依赖、scms、发布、分发的方法。可以方便的编译代码、进行依赖管理、管理二进制库等等。
(2)maven的好处在于可以将项目过程规范化、自动化、高效化以及强大的可扩展性。
(3)利用maven自身及其插件还可以获得代码检查报告、单元测试覆盖率、实现持续集成等等。
maven的生命周期
(1)maven的生命周期就是对所有构建过程抽象与统一。
(2)生命周期包含项目的清理、初始化、编译、测试、打包、集成测试、验证、部署、站点生成等几乎所有的过程。
(3)maven有三套相互独立的生命周期
<1>CleanLifecycle(清理生命周期): 在进行真正的构建之前进行一些清理工作
pre-clean:执行一些需要在clean之前完成的工作
clean:移除所有上一次构建生成的文件
post-clean:执行一些需要在clean之后立刻完成的工作
<2>DefaultLifecycle(部署生命周期):构建的核心部分,编译,测试,打包,部署等等。
compile:编译项目的源代码
test:使用合适的单元测试框架运行测试。
package:将编译好的代码打包成可分发的格式,如JAR,WAR,或者EAR
install:安装包至本地仓库,以备本地的其它项目作为依赖使用
deploy:复制最终的包至远程仓库,共享给其它开发人员和项目
<3>SiteLifecycle(生成生命周期):生成项目报告,站点,发布站点。
pre-site:执行一些需要在生成站点文档之前完成的工作
site:生成项目的站点文档
post-site:执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
site-deploy:将生成的站点文档部署到特定的服务器上
(1)maven package install deploy区别
maven install:把target下打的包(jar等)安装到本地仓库,可以供其他项目使用
maven deploy:将打包的文件发布到远程参考,提供其他人员进行下载依赖
(2)mvn clean install 与 mvn install 的区别
maven package:打包(jar等)到本项目的target下
用mvn install后,新改的内容不生效,一定要后来使用mvn clean install 才生效。
maven在执行一个生命周期的命令的是时候将会执行之前的所有生命周期操作,比如执行mvn install,会执行前面一系列的动作包括 compile , package , test 等。而执行mvn package 会调用 maven-jar-plugin 这个插件进行打包,理论上来讲不做mvn clean得到的jar包应该是最新的,然而在打包结束后修改了代码内容,导致打出来的jar包没有更新,从而没有生效,所以使用mvn clean install对target文件清除后再进行打包。
4.为什么要用Log4j来替代System.out.println?
程序员经常会遇到脱离java ide环境调试程序的情况,这时大多数人会选择使用System.out.println语句输出某个变量值的方法进行调试。这样会带来一个非常麻烦的问题:一旦哪天程序员决定不要显示这些System.out.println的东西了就只能一行行的把这些垃圾语句注释掉。若哪天又需调试变量值,则只能再一行行去掉这些注释恢复System.out.println语句,调试代码充斥在逻辑代码中间,既不美观也不利于查找
log4j很好地处理了这一问题,并且system.out只能输出到控制台,而log4j之类的日志工具可以配置输出目标,输出等级,减少输出形式与程序的耦合
5.为什么DB的设计中要使用Long来替换掉Date类型
1.时区,在获取当前时间的时候,各个地区在同一个时间点会有不同的时间表示
2.精度,将java.util.Date转为java.sql.Date时候,日期的时分秒会被去掉,数据的精度发生变化了。而JDBC中定义接口时候,用的是java.sql.Date,而我们常常用到的Date都是java.util.Date,这往往导致一些转换过程中发生误差。java.sql.Timestamp类,它保持了日期数据原有的精度。可以实现和java.util.Date的无损转换。但是Timestamp这个类在一些预定义SQL中常常会出问题
java.sql.Date,在JDBC接口中使用了,如果对其进行修改,JDBC接口规范也要改,那么将引发各个数据库厂商对数据库驱动也要改,这是不可接受的。
3.有利于计算时间差,方便java与数据库之间的传输
明日计划:
完成深度思考,复习基础zhis
困难
null
收获
for each,语法
评论