这里我使用的是SpringBoot + Mybatis + Oracle + com.opencsv
场景: 一个饲料配方对应多个原料成分,要求查询Oracle数据库并把数据输出到一个CSV文件中,以如下格式展示出来,用文本方式打开后,每个数据带上双引号。并开启定时任务
一、首先新建一个SpringBoot项目,引入pom.xml
org.springframework.boot spring-boot-starter-weborg.mybatis.spring.boot mybatis-spring-boot-starter2.2.0 org.springframework.boot spring-boot-starter-testtest org.mybatis mybatis3.4.5 compile com.oracle.database.jdbc ojdbc8runtime com.opencsv opencsv5.5.2
二、application.yml文件,配置数据库连接
spring: datasource: url: jdbc:oracle:thin:@locahost:1521:xjmy # xjmy是本人的数据库 username: username password: password driver-class-name: oracle.jdbc.driver.OracleDriver
三、创建Bom.java实体类
public class Bom { private String code; private String name; private String ingredientName; private String qty; public String getCode() { return code; } public void setCode(String code) { this.code = code; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getIngredientName() { return ingredientName; } public void setIngredientName(String ingredientName) { this.ingredientName = ingredientName; } public String getQty() { return qty; } public void setQty(String qty) { this.qty= qty; } }
四、创建Mapper.java
BomMapper.java饲料配方
import com.example.time_task.entity.Bom; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Select; import java.util.List; @Mapper public interface BomMapper { // 由于本人Oracle连接环境中,存在多个数据库连接,因此我的表名前面指定了具体的数据库名称 xjmy. @Select("SELECT t1.FNUMBER code,t1.FNAME_L2 name,t3.FNAME_L2 ingredientName,t2.FConsumeFixQty qty " + "FROM xjmy.T_MM_Bom t1 " + "left join xjmy.T_MM_BomEntry t2 on t2.FPARENTID = t1.FID " + "left join xjmy.T_BD_Material t3 on t2.FMATERIALID = t3.FID " + "order by t2.FPARENTID,t2.FSEQ") public ListgetBom(); }
CronMapper.java定时任务
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Select; @Mapper public interface CronMapper { // 由于本人Oracle连接环境中,存在多个数据库连接,因此我的表名前面指定了具体的数据库名称 xjmy. @Select("select cron from xjmy.T_XJMY_Cron") public String getCron(); }
五、在Oracle数据库中执行如下脚本,新增定时任务表和插入数据。
CREATE table T_XJMY_Cron ( id number primary key, cron varchar2(100) not null ); -- 每天凌晨1点执行,可参考Cron表达式设置时间 insert into T_XJMY_Cron values(1,'0 0 1 * * ?');
六、创建BomToCsv.java输出CSV文件类
import com.opencsv.CSVWriter; import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStreamWriter; import java.util.List; public class BomToCsv { public static String printCsv(Listdata) { try { // 输出路径以及文件名称 File file = new File("D:/jianglijun/csv/bom.csv"); // 输出流,并设置字符编码 OutputStreamWriter outputStreamWriter=new OutputStreamWriter(new FileOutputStream(file),"GBK"); BufferedWriter bw = new BufferedWriter(outputStreamWriter); // 将输出流 放入CSVWriter对象 CSVWriter printer = new CSVWriter(bw); if (null != data) { // 循环写入数据 for (String[] lineData : data) { printer.writeNext(lineData); } } // 刷新 bw.flush(); // 关闭资源 printer.close(); bw.close(); } catch (Exception e) { e.printStackTrace(); } return "success"; } }
七、创建DynamicScheduleTask.java定时任务类,并实现SchedulingConfigurer接口
@Configuration // 1.主要用于标记配置类,兼备Component的效果。 @EnableScheduling // 2.开启定时任务 @SuppressWarnings("all") // 3.消除警告 public class DynamicScheduleTask implements SchedulingConfigurer { @Autowired // 注入CronMapper.java CronMapper cronMapper; @Autowired // 注入BomMapper.java BomMapper bomMapper; @Override // 重写SchedulingConfigurer接口中的定时任务方法 public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { taskRegistrar.addTriggerTask( //1.添加任务内容(Runnable) () -> System.out.println("执行动态定时任务: " + LocalDateTime.now().toLocalTime()), //2.设置执行周期(Trigger) triggerContext -> { //2.1 从数据库获取执行周期 String cron = cronMapper.getCron(); //2.2 合法性校验. if (cron != null) { Listlist = new ArrayList<>(); String[] bomStr = null; // 2.4 获取查询数据并进行循环遍历 List bomList = bomMapper.getBom(); for (Bom bom : bomList) { // 2.5 判断该字符串数组是否为空 if (bomStr != null) { // 2.7 不为空则将该字符串数组转换成list3集合 List list3 = Arrays.asList(bomStr); // 2.8 判断list3中,是否包含已存在的饲料配方编码 if (list3.contains(bom.getCode()) == true) { // 2.10 如果存在,则在总的list集合里面移除 list.remove(bomStr); // 3. 新建一个字符串数组,并赋值该饲料配方后续的原料成分 String[] a = new String[]{bom.getIngredientName(),bom.getQty()}; // 4. 字符串数组拼接,网上找的相关代码 int bomLength = bomStr.length; int alength = a.length; bomStr = Arrays.copyOf(bomStr,bomLength+alength); System.arraycopy(a,0,bomStr,bomLength,alength); // 2.9 如果不存在,则进行新增饲料配方 } else { bomStr = new String[]{bom.getCode(),bom.getName(),bom.getIngredientName(),bom.getQty()}; } // 2.6 为空则进行新增饲料配方 } else { bomStr = new String[]{bom.getCode(),bom.getName(),bom.getIngredientName(),bom.getQty()}; } list.add(bomStr); } // 5. 调用输出CSV文件方法 String result = BomToCsv.printCsv(list); System.out.println("CSV文件输出结果:"+result); } //2.3 返回执行周期(Date) return new CronTrigger(cron).nextExecutionTime(triggerContext); } ); } }
八、执行TimetaskApplication.javaSpringBoot启动类
@SpringBootApplication public class TimetaskApplication { public static void main(String[] args) { SpringApplication.run(TimetaskApplication.class, args); } }
1、由于数据是公司配方,就不方便展示出来了……
2、以上都是本人前段时间遇到的实际需求场景,代码也是网上查找加上自己的逻辑整合出来的,如果不足之处,还请谅解!最后是进行项目打包运行。
3、本人代码结构如下:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)