系统入门云计算服务,项目上云最佳实践

232 阅读1分钟

download:系统入门云计算服务,项目上云最佳实践

drop database IF EXISTS test;
CREATE DATABASE test;
use test;
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` int(11) NOT NULL,
  `name` varchar(255) DEFAULT "",
  `age` int(11) DEFAULT 0,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


启动文件,配置了`Mapper`文件扫描的路径:

import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication @MapperScan("com.aphysia.springdemo.mapper") public class SpringdemoApplication {

public static void main(String[] args) {
    SpringApplication.run(SpringdemoApplication.class, args);
}

} 复制代码


`Mapper`文件一共准备了几个方法,插入单个对象,删除所有对象,拼接插入多个对象:

import com.aphysia.springdemo.model.User; import org.apache.ibatis.annotations.Param;

import java.util.List;

public interface UserMapper {

int insertUser(User user);

int deleteAllUsers();


int insertBatch(@Param("users") List<User>users);

} 复制代码


`Mapper.xml`文件如下:

insert into user(id,age) values(#{id},#{age})
<delete id="deleteAllUsers">
    delete from user where id>0;
</delete>

<insert id="insertBatch" parameterType="java.util.List">
    insert into user(id,age) VALUES
    <foreach collection="users" item="model" index="index" separator=",">
        (#{model.id}, #{model.age})
    </foreach>
</insert>
复制代码 ```

测试的时候,每次操作我们都删除掉所有的数据,保证测试的客观,不受之前的数据影响。

不同的测试

1. foreach 插入

先获取列表,然后每一条数据都执行一次数据库操作,插入数据:


### 2. 拼接sql插入

其实就是用以下的方式插入数据:

INSERT INTO user (id, age) VALUES (1, 11), (2, 12), (3, 13), (4, 14), (5, 15); 复制代码

@Test
void insertSplicingTest() {
    List<User> users = getRandomUsers();
    long start = System.currentTimeMillis();
    userMapper.insertBatch(users);
    long end = System.currentTimeMillis();
    System.out.println("time:" + (end - start));
}

复制代码


### 3. 使用Batch批量插入`MyBatis session``executor type` 设为 ` Batch  `,使用`sqlSessionFactory`将执行方式置为批量,自动提交置为`false`,全部插入之后,再一次性提交:

@Test
public void insertBatch(){
    SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH, false);
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    List<User> users = getRandomUsers();
    long start = System.currentTimeMillis();
    for(int i=0;i<users.size();i++){
        mapper.insertUser(users.get(i));
    }
    sqlSession.commit();
    sqlSession.close();
    long end = System.currentTimeMillis();
    System.out.println("time:" + (end - start));
}

复制代码


### 4. 批量处理+分批提交

在批处理的基础上,每1000条数据,先提交一下,也就是分批提交。