1

我正在使用 Java 访问 MS SQL 服务器。我正在寻找一种无需编写大型 sql 查询即可将数据导入各种表的简单方法。其中一些表有 30 列。

我找到了 apache commons dbutils 库,它可以很好地从表中读取数据并将行映射到 bean。我似乎找不到任何使用相同原理的代码将数据插入到将 bean 作为数据值传递的表中

这可能吗?

4

1 回答 1

0

是的,这会很好,但是,我认为这是不可能的。一种方法是在 POJO 类中创建一个静态函数来获取“插入 SQL 语句”。尽管您必须保持两个函数(插入和参数)之间的顺序。

雇员.java

public static String getEmployeeInsertStatement()
{
    //if you add more fields, increase this integer
    int numberOfParameters = 5;

    String insertion = "INSERT INTO employee\n"
            + "(name\n"
            + ",address\n"
            + ",phone\n"
            + ",comments\n"
            + ",hire_date\n";            

    insertion += ")"
              + "VALUES\n"
              + getParameterQuestionMarks(numberOfParameters);

    return insertion;
}

// allow for multiple insertions
public static Object[][] getEmployeeParamters(List<Employee> employees)
{
    List<List<Object>> paramList = new ArrayList<>();

    for (Employee employee : employees)
    {
        List<Object> objectList = new ArrayList<>();

        objectList.add(employee.getName());
        objectList.add(employee.getAddress());
        objectList.add(employee.getPhone());
        objectList.add(employee.getComments());
        objectList.add(employee.getHire_date());

        paramList.add(objectList);


    }

    return paramList.stream().map(u -> u.toArray(new Object[0])).toArray(Object[][]::new);

}

public static String getParameterQuestionMarks(int number)
{
    String paramterMarks = "(";
    for (int x = 1; x <= number; x++)
    {
        paramterMarks += "?";
        if ((x + 1) <= number)
        {
            paramterMarks += ",";
        }
    }
    paramterMarks += ")";

    return paramterMarks;
}

然后在您的 SQLManager 类中,您的插入方法如下:

public void insertEmployees(List<Employee> employees)
{
    Connection connection = createConnection();

    try
    {
        new QueryRunner().insertBatch(connection, Employee.getEmployeeInsertStatement(), new ScalarHandler<>(), Employee.getEmployeeParameters(employees));


    } catch (SQLException ex)
    {
        Logger.getLogger(SQLManager.class.getName()).log(Level.SEVERE, null, ex);

    } finally
    {
        try
        {
            DbUtils.close(connection);
        } catch (SQLException ex)
        {
            Logger.getLogger(SQLManager.class.getName()).log(Level.SEVERE, null, ex);

        }

    }

}
于 2019-08-07T19:00:39.320 回答