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参数出传过去了,但是报错空指针,所以查询失败