创建 spring boot 项目,添加 mybatis 依赖。
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
这是一个普通的 POJO。
package com.xxx.qingdao.entity;
public class TargetSnapshot {
private String targetId;// 由于 Java 里没有 uint64, 并且这个字段没有算术运算
private Integer mmsi;
// 忽略 getter 和 setter 方法 和其他字段
}
注意方法 findByParamsByPage
包含了分页的参数。
package com.xxx.qingdao.dao;
import com.xxx.qingdao.entity.TargetSnapshot;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Component;
import java.util.List;
@Mapper
@Component
public interface TargetSnapshotMapper {
@Select("select * from t_target_snapshot where create_time > #{startDate} and create_time < #{endDate} limit #{page}, #{size}")
List<TargetSnapshot> findByParamsByPage(@Param("startDate") String startDate,
@Param("endDate") String endDate,
@Param("page") int page, @Param("size") int size);
}
注意,实现了一个 CommandLineRunner
接口,目的是在启动时执行这个方法。
package com.xxx.qingdao.dao;
import com.xxx.qingdao.entity.TargetSnapshot;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
public class QingdaoService implements CommandLineRunner {
private static final Logger logger = LoggerFactory.getLogger(QingdaoService.class);
@Autowired
private TargetSnapshotMapper targetSnapshotMapper;
@Override
public void run(String... args) throws Exception {
logger.info("#### start ####");
long start = System.currentTimeMillis();
int page = 0;
int size = 1000;
int count = targetSnapshotMapper.count("2019-12-04 11:45:00", "2019-12-04 11:47:00");
logger.info("count:{}", count);
while (true) {
List<TargetSnapshot> list = targetSnapshotMapper.findByParamsByPage("2019-12-04 11:45:00", "2019-12-04 11:47:00", page++ * size, size);
logger.info("size:{},page:{}", list.size(), page);
if (list.size() == 0) break;
}
long end = System.currentTimeMillis();
logger.info("#### end #### takes(ms): {}", (end - start));
}
}
在配置文件 application.properties
中配置数据源。
spring.datasource.url=jdbc:mysql://localhost:3306/gateway_target spring.datasource.username=root spring.datasource.password=xxxxxx
整体还是比较清晰的。
没有使用 RowBound 是因为它是逻辑分页,即查出所有的数据,然后再过滤一遍。