【问题标题】:Can I Insert Records into a SQL Table passing a bean as values using Apache Commons DBUtils我可以使用 Apache Commons DBUtils 将记录插入到将 bean 作为值传递的 SQL 表中吗
【发布时间】:2019-12-10 06:09:03
【问题描述】:

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

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

这可能吗?

【问题讨论】:

  • 你尝试过 jpa/hibernate 吗?
  • 我正在尝试简单地做到这一点,而无需使用类似的框架或 spring 等。

标签: java sql apache-commons-dbutils


【解决方案1】:

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

Employee.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 类中,你的 insert 方法是这样的:

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);

        }

    }

}

【讨论】:

    猜你喜欢
    • 2016-01-23
    • 1970-01-01
    • 2017-10-28
    • 1970-01-01
    • 1970-01-01
    • 2015-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多