Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 需要优化查询以插入记录_Java_Sql_Jdbctemplate - Fatal编程技术网

Java 需要优化查询以插入记录

Java 需要优化查询以插入记录,java,sql,jdbctemplate,Java,Sql,Jdbctemplate,我编写了一段JDBC模板代码,它将记录插入表中,但问题是我的执行卡在了这个特定的代码段上,似乎有点挂断了。我没有找出原因,因为查询在sqldeveloper中正确运行 List<SalaryDetailReport> reports = salaryDetailReportDAO.findAll(tableSuffix, regionId, circleId); // the above line find the required data, if data is found th

我编写了一段JDBC模板代码,它将记录插入表中,但问题是我的执行卡在了这个特定的代码段上,似乎有点挂断了。我没有找出原因,因为查询在sqldeveloper中正确运行

List<SalaryDetailReport> reports = salaryDetailReportDAO.findAll(tableSuffix, regionId, circleId);
// the above line find the required data, if data is found then it proceeds

if (reports != null && reports.size() > 0) {
    for (SalaryDetailReport salaryDetail : reports) {
        try {
            SalaryDetail sd = new SalaryDetail();
            sd.setDetailReport(salaryDetail);
            salaryDetailDAO.save(sd, tableSuffix);
        } catch (Exception e) {
            log.error("Error occured", e);
            e.printStackTrace();
            throw new MyExceptionHandler(" Error :" + e.getMessage());
        }
    }

    System.out.println("data found");

} else {
    log.error("Salary Record Not Found.");
    throw new MyExceptionHandler("No record Found.");
}

主要问题在于您的查询不处于状态。这会降低你的表现。尝试在单独的查询中从SALARY\u DETAIL\u TB获取SELECT EMP\u ID,并在主查询中传入Not in块。这将提高查询的性能。每次执行保存时,都会触发select查询

您必须决定是从SELECT还是从应用程序插入记录

如果您不需要在select之后对数据进行操作,那么只需在select语句中调用一个INSERT,而不需要任何for循环。因为只有一个INSERT语句调用,所以速度很快

因此,您将在SalaryDetailReportDAO中实现类似copyAllInSalaryDetailtableSuffix、regionId、circleId的方法,该方法将执行INSERT INTO salary\u detail\u tbl。。。选择哪里使用与findAll方法中相同的WHERE条件。所有插入都将仅在数据库层上执行

如果您想在数据插入之前对其进行操作,可以使用SalaryDetailbean和for cycle继续您的方法,但是您应该从insert语句中删除SELECT部分,并使用提供的bean中的值。然后保存方法可以如下所示:

@Override
public void save(SalaryDetail details, String tableSuffix) {
    // use tableSuffix if it is really needed
    String q = "INSERT INTO SALARY_DETAIL_TBL "
            + "                  (ID "
            + "                  ,EMP_NAME "
            + "                  ,EMP_CODE "
            + "                  ,NET_SALARY "
            + "                  ,YYYYMM "
            + "                  ,PAY_CODE "
            + "                  ,EMP_ID "
            + "                  ,PAY_CODE_DESC "
            + "                  ,REMARK "
            + "                  ,PAY_MODE ) "
            + "          VALUES (:id "
            + "                  ,:emp_name "
            + "                  ,:emp_code "
            + "                  ,:net_salary "
            + "                  ,:yyyymm "
            + "                  ,:pay_code "
            + "                  ,:emp_id "
            + "                  ,:pay_code_desc "
            + "                  ,:remark "
            + "                  ,:pay_mode)";

    MapSqlParameterSource param = new MapSqlParameterSource();
//    KeyHolder keyHolder = new GeneratedKeyHolder();
//  details.setId(((BigDecimal) keyHolder.getKeys().get("ID")).longValue());
    param.addValue("id", details.getId());
    param.addValue("emp_name", details.getEmpName());
    param.addValue("emp_code", details.getEmpCode());
    param.addValue("net_salary", details.getNetSalary());
    param.addValue("pay_code", details.getPayCode());
    param.addValue("pay_code_desc", details.getPayCodeDesc());
    param.addValue("pay_mode", details.getPayMode());
    param.addValue("remark", details.getPayRemark());
    param.addValue("yyyymm", details.getYyyymm());
    param.addValue("emp_id", details.getEmployee() != null ? details.getEmployee().getEmpId() : null);
    getNamedParameterJdbcTemplate().update(q, param);
}

您不需要在查询中声明参数吗?比如ID=:ID?您应该在数据库管理工具(如SQLDeveloper)中尝试查询。
@Override
public void save(SalaryDetail details, String tableSuffix) {
    // use tableSuffix if it is really needed
    String q = "INSERT INTO SALARY_DETAIL_TBL "
            + "                  (ID "
            + "                  ,EMP_NAME "
            + "                  ,EMP_CODE "
            + "                  ,NET_SALARY "
            + "                  ,YYYYMM "
            + "                  ,PAY_CODE "
            + "                  ,EMP_ID "
            + "                  ,PAY_CODE_DESC "
            + "                  ,REMARK "
            + "                  ,PAY_MODE ) "
            + "          VALUES (:id "
            + "                  ,:emp_name "
            + "                  ,:emp_code "
            + "                  ,:net_salary "
            + "                  ,:yyyymm "
            + "                  ,:pay_code "
            + "                  ,:emp_id "
            + "                  ,:pay_code_desc "
            + "                  ,:remark "
            + "                  ,:pay_mode)";

    MapSqlParameterSource param = new MapSqlParameterSource();
//    KeyHolder keyHolder = new GeneratedKeyHolder();
//  details.setId(((BigDecimal) keyHolder.getKeys().get("ID")).longValue());
    param.addValue("id", details.getId());
    param.addValue("emp_name", details.getEmpName());
    param.addValue("emp_code", details.getEmpCode());
    param.addValue("net_salary", details.getNetSalary());
    param.addValue("pay_code", details.getPayCode());
    param.addValue("pay_code_desc", details.getPayCodeDesc());
    param.addValue("pay_mode", details.getPayMode());
    param.addValue("remark", details.getPayRemark());
    param.addValue("yyyymm", details.getYyyymm());
    param.addValue("emp_id", details.getEmployee() != null ? details.getEmployee().getEmpId() : null);
    getNamedParameterJdbcTemplate().update(q, param);
}