我正在使用 Java 访问 MS SQL 服务器。我正在寻找一种无需编写大型 sql 查询即可将数据导入各种表的简单方法。其中一些表有 30 列。
我找到了 apache commons dbutils 库,它可以很好地从表中读取数据并将行映射到 bean。我似乎找不到任何使用相同原理的代码将数据插入到将 bean 作为数据值传递的表中
这可能吗?
我正在使用 Java 访问 MS SQL 服务器。我正在寻找一种无需编写大型 sql 查询即可将数据导入各种表的简单方法。其中一些表有 30 列。
我找到了 apache commons dbutils 库,它可以很好地从表中读取数据并将行映射到 bean。我似乎找不到任何使用相同原理的代码将数据插入到将 bean 作为数据值传递的表中
这可能吗?
是的,这会很好,但是,我认为这是不可能的。一种方法是在 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);
}
}
}