import com.xc.springboot.dao.domain.MusicInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.ResultMap; import org.apache.ibatis.annotations.Select; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Component; import org.springframework.stereotype.Repository; import java.util.List; @Repository( "musicInfoMapper" ) public interface MusicInfoMapper { 取前5条数据 select * from table_name limit 0,5 查询第11到第15条数据 select * from table_name limit 10,5 limit关键字的用法: LIMIT [offset,] rows offset指定要返回的第一行的偏移量,rows第二个指定返回行的最大数目。初始行的偏移量是0(不是1)。 // 分页查询的方法 @ResultMap( "BaseResultMap" ) @Select( "select * from music_info limit #{index},#{num}" ) public List<MusicInfo> queryByThread(@Param(value = "index") int index, @Param(value = "num") int num); public void setSingerName(String singerName) { this .singerName = singerName == null ? null : singerName.trim(); * 获取 歌曲大小 music_info.music_size * @return 歌曲大小 public String getMusicSize() { return musicSize; * 设置 歌曲大小 music_info.music_size * @param musicSize 歌曲大小 public void setMusicSize(String musicSize) { this .musicSize = musicSize == null ? null : musicSize.trim(); * 获取 歌曲名 music_info.music_name * @return 歌曲名 public String getMusicName() { return musicName; * 设置 歌曲名 music_info.music_name * @param musicName 歌曲名 public void setMusicName(String musicName) { this .musicName = musicName == null ? null : musicName.trim(); @Override public String toString() { return "MusicInfo{" + "id=" + id + ", singerName='" + singerName + '\'' + ", musicSize='" + musicSize + '\'' + ", musicName='" + musicName + '\'' + '}' ; import com.xc.springboot.dao.mapper.MusicInfoMapper; import com.xc.springboot.dao.domain.MusicInfo; import com.xc.springboot.service.MusicInfoService; import com.xc.springboot.util.QueryThread; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @Service( "musicInfoService" ) public class MusicInfoServiceImpl implements MusicInfoService { @Autowired private MusicInfoMapper musicInfoMapper; // 注入依赖 @Override public void queryByThread() { // 数据集合大小,由调用者自己指定 int listSize = 100 ; // 开启的线程数 int runSize = 20 ; // 一个线程处理数据条数,如果库中有100条数据,开启20个线程,那么每一个线程执行的条数就是5条 int count = listSize / runSize; // 5 // 创建一个线程池,数量和开启线程的数量一样 ExecutorService executor = Executors.newFixedThreadPool(runSize); // 计算sql语句中每个分页查询的起始和结束数据下标 // 循环创建线程 // 此处调用具体的查询方法 System.out.println( "开始查询" ); for ( int i = 0; i < runSize; i++ ) { int index = i * count; int num = count; executor.execute( new Runnable() { @Override public void run() { try { // 查询的结果如何保存下来,会不会存在覆盖的问题 System.out.println( "每次查询的下标:" + index + ",条数:" + num); List <MusicInfo> list = musicInfoMapper.queryByThread(index , num); // 这里做成写入文件的方法 } catch (Exception e) { System.out.println( "查询失败" + e); // 执行完关闭线程池 executor.shutdown(); import com.fasterxml.jackson.databind.JsonNode; import com.xc.springboot.dao.domain.MusicInfo; import com.xc.springboot.service.MusicInfoService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.* ; import javax.servlet.http.HttpServletRequest; import java.util.HashMap; import java.util.List; import java.util.Map; @Controller public class IndexController { @RequestMapping( "/query1" ) @ResponseBody public String getInfoByThread() { musicInfoService.queryByThread(); return "success" ;

第六步:浏览器访问: http://localhost:8080/query1

最后总结:

1、 在具体的尝试中,遇到了一些问题

(1)      无法从匿名内部类中获取返回的结果,结果无法汇总,所以最终无法在web页面显示最后查询的结果

(2)      创建一个类实现Runnable接口,然后将该对象传入execute方法执行,发现index、num参数出传过去了,但是报错空指针,所以查询失败