Java—查询Oracle数据库输出CSV文件(二)

Java—查询Oracle数据库输出CSV文件(二),第1张

Java—查询Oracle数据库输出CSV文件(二)

这里我使用的是SpringBoot + Mybatis + Oracle + com.opencsv

场景: 一个饲料配方对应多个原料成分,要求查询Oracle数据库并把数据输出到一个CSV文件中,以如下格式展示出来,用文本方式打开后,每个数据带上双引号。并开启定时任务


一、首先新建一个SpringBoot项目,引入pom.xml


    
        org.springframework.boot
        spring-boot-starter-web
    
    
        org.mybatis.spring.boot
        mybatis-spring-boot-starter
        2.2.0
    
    
        org.springframework.boot
        spring-boot-starter-test
        test
    
    
        org.mybatis
        mybatis
        3.4.5
        compile
    
    
        com.oracle.database.jdbc
        ojdbc8
        runtime
    
    
        com.opencsv
        opencsv
        5.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 List getBom();
}

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(List data) {
        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) {
                    List list = 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、本人代码结构如下:

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5696977.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存