idea模板:
/**
* ${Shitilei}信息 服务层实现。
*
* @author admin
*/
@Service
@RequiredArgsConstructor
public class Operate${Shitilei}Service {
private final ${Shitilei}Mapper ${shitilei}Mapper;
private final RegionUtil util;
/**
* ${shitilei}表
* @return 操作结果
*/
@Transactional
public Long create${Shitilei}(){
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Integer count=0;//统计成功插入数据多少条
Integer fhCount=0;//符合条件的一共多少条
Map<Integer,Integer> dqMap=new LinkedHashMap<>();//排查错误用 存所有批次成功多少条
Integer dqCount=0;//上个批次成功多少条 排查错误用
Integer number=1;//批次逐个增加
String objStr="/";//字符串为空时默认
Double objDouble=-1d;//小数为空时默认
int objInt=-1;//整数为空时默认
String objDate="1900-01-01 00:00:00";//日期为空时默认
int finalNumber=1000;//固定 1000条
//符合条件的sql
//sql不允许有;号 只允许有一条联表大sql
String property = System.getProperty("user.dir")+"/file/"+"${shitilei}.sql";
String sql = util.readSqlFile(property);
//计算总条数的sql
String sqlCount="select count(0) from ("+sql+") t";
Long countByQuery = Db.selectCount(sqlCount);
int countSize =countByQuery.intValue();//符合条件的总数
int startCount = 0;//开始索引
int jCount = 1;//第几页
while (countSize>0) {//有值才进来循环遍历
int endCount = finalNumber;
startCount = (jCount - 1) * endCount;//当前起始
//分页 当前批次从第几条到第几条
String dqSql=sql+" limit "+startCount+","+endCount;//当前批次的sql语句
//当前批次 材料表数据
List<Row> rows = Db.selectListBySql(dqSql);
List<${Shitilei}Ao> infos = RowUtil.toEntityList(rows, ${Shitilei}Ao.class);
//符合条件的收件信息表数据
fhCount += infos.size();//符合条件的总数
List<${Shitilei}> list = new ArrayList<>();//存放当前批次的数据
for (${Shitilei}Ao pojo : infos) {//逐个赋值
${Shitilei} entity=new ${Shitilei}();
list.add(entity);
}
if (number > 1) {
dqCount = count;//上一个批次成功条数
}
count += ${shitilei}Mapper.insertBatch(list, list.size());//这个批次最多1000一个
list.clear();//不当前这批次的都添加完再清空 继续下一个批次数据添加
int i = count - dqCount;
dqMap.put(number, i);//存起来方便查看 当前第几批次/当前批次成功多少条
dqCount = 0;//重置
number++;//更新批次号
jCount++;//更新页数
countSize -= finalNumber;//下一页 是否继续循环
}
if(!count.equals(fhCount)){
Set<Integer> keys = dqMap.keySet();
for (Integer key : keys) {
System.out.println("第"+key+"批次:成功插入"+dqMap.get(key)+"条");
}
throw new RuntimeException("插入数据与符合条件的个数不一致(符合条件的个数:"+fhCount+"条,成功插入的个数:"+count+"条)");
}
return count.longValue();
}
}
读取.sql文件里sql语句的工具类并拼接成string字符串类型返回:
import cn.hutool.core.util.StrUtil;
import org.springframework.stereotype.Component;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
@Component
public class RegionUtil {
/**
* 面积单位转换
* @param area 面积
* @param fromUnit 传入面积单位 "0001"平方米、"0002"亩、"0003"公顷、"0004"平方千米(默认"0001"平方米)
* @param toUnit 输出面积单位 "0001"平方米、"0002"亩、"0003"公顷、"0004"平方千米
* @return 转换后面积
*/
public BigDecimal convertArea(BigDecimal area, String fromUnit, String toUnit) {
if(area==null||fromUnit.equals(toUnit)) {
return area;
}
if (StrUtil.isBlank(fromUnit)) {
fromUnit = "0001";
}
// 将所有单位转换为平方米
double area1 = area.doubleValue();
double squareMeters ;
switch (fromUnit) {
case "0004": //平方千米
squareMeters = area1 * 1000000;
break;
case "0003": //公顷
squareMeters = area1 * 10000;
break;
case "0002": //亩
squareMeters = area1 * 666.667;
break;
//case "0001": //平方米
default://平方米
squareMeters = area1;
}
// 将平方米转换为目标单位
double convertedArea ;
switch (toUnit) {
case "0001": //平方米
convertedArea = squareMeters;
break;
case "0004": //平方千米
convertedArea = squareMeters / 1000000;
break;
case "0003": //公顷
convertedArea = squareMeters / 10000;
break;
case "0002": //亩
convertedArea = squareMeters / 666.667;
break;
default:
throw new RuntimeException("输出面积单位错误!");
}
return BigDecimal.valueOf(convertedArea).setScale(2, RoundingMode.HALF_UP);
}
/**
* area 面积
* fromUnit 面积单位
* toUnit 把fromUnit面积单位转换成指定的面积单位
* scale 保留小数点后几位
* */
public BigDecimal convertArea(BigDecimal area, String fromUnit, String toUnit,int scale) {
if(area==null||fromUnit.equals(toUnit)) {
return area;
}
if (StrUtil.isBlank(fromUnit)) {
fromUnit = "0001";
}
// 将所有单位转换为平方米
double area1 = area.doubleValue();
double squareMeters ;
switch (fromUnit) {
case "0004": //平方千米
squareMeters = area1 * 1000000;
break;
case "0003": //公顷
squareMeters = area1 * 10000;
break;
case "0002": //亩
squareMeters = area1 * 666.667;
break;
//case "0001": //平方米
default://平方米
squareMeters = area1;
}
// 将平方米转换为目标单位
double convertedArea ;
switch (toUnit) {
case "0001": //平方米
convertedArea = squareMeters;
break;
case "0004": //平方千米
convertedArea = squareMeters / 1000000;
break;
case "0003": //公顷
convertedArea = squareMeters / 10000;
break;
case "0002": //亩
convertedArea = squareMeters / 666.667;
break;
default:
throw new RuntimeException("输出面积单位错误!");
}
return BigDecimal.valueOf(convertedArea).setScale(scale, RoundingMode.HALF_UP);
}
/**
* 金额单位转换
* @param amount 金额
* @param fromUnit 传入金额单位 "0001"元、"0002"万元(传入不在限定值或空默认元)
* @param toUnit 输出金额单位 "0001"元、"0002"万元
* @return 转换后金额
*/
public BigDecimal convertAmount(BigDecimal amount, String fromUnit, String toUnit) {
if(amount==null||fromUnit.equals(toUnit)) {
return amount;
}
if (StrUtil.isBlank(fromUnit)) {
fromUnit = "0001";
}
// 先将输入的金额统一转换为元
double amount1 = amount.doubleValue();
double yuan ;
switch (fromUnit.toLowerCase()) {
case "0002": // 万元
yuan = amount1 * 10000;
break;
//case "0001": // 元
default:// 元
yuan = amount1;
}
// 根据目标金额单位进行转换
double convertedAmount ;
switch (toUnit.toLowerCase()) {
case "0001": // 元
convertedAmount = yuan;
break;
case "0002": // 万元
convertedAmount = yuan / 10000;
break;
default:
throw new RuntimeException("输出金额单位错误!");
}
return BigDecimal.valueOf(convertedAmount);
}
/**
* amount 价格
* fromUnit 价格单位
* toUnit 把fromUnit价格单位转换成指定的价格单位
* scale 保留小数点后几位
* */
public BigDecimal convertAmount(BigDecimal amount, String fromUnit, String toUnit,int scale) {
if(amount==null||fromUnit.equals(toUnit)) {
return amount;
}
if (StrUtil.isBlank(fromUnit)) {
fromUnit = "0001";
}
// 先将输入的金额统一转换为元
double amount1 = amount.doubleValue();
double yuan ;
switch (fromUnit.toLowerCase()) {
case "0002": // 万元
yuan = amount1 * 10000;
break;
//case "0001": // 元
default:// 元
yuan = amount1;
}
// 根据目标金额单位进行转换
double convertedAmount ;
switch (toUnit.toLowerCase()) {
case "0001": // 元
convertedAmount = yuan;
break;
case "0002": // 万元
convertedAmount = yuan / 10000;
break;
default:
throw new RuntimeException("输出金额单位错误!");
}
return BigDecimal.valueOf(convertedAmount).setScale(scale, RoundingMode.HALF_UP);
}
/**
* 传入文件路径比如: D://test.sql 逐行读取sql语句然后拼接最终返回字符串
* */
public String readSqlFile(String path) {
StringBuilder sb = new StringBuilder();
try {
File file = new File(path);
BufferedReader br = new BufferedReader(new FileReader(file));
String line;
while ((line = br.readLine()) != null) {
sb.append(line).append("\n");
}
br.close();
} catch (IOException e) {
throw new RuntimeException("报错了:"+e.getMessage());
}
return sb.toString();
}
}
注意:sql语句结尾不要带;号 并且sql文件只能有一个联表大sql