Java应用中,有时需要把CSV中的数据加载到数据库。数据库一般有自带的工具,但大都有专门的界面,很难成为可被Java调用的例程。
借助集算器可以很方便地完成这件事。
我们以“销售数据的csv文件”加载到Mysql数据库的销售表(sales)为例。
销售数据的csv文件(sales.csv),部分数据如下:
| ORDERID | CLIENT | SELLERID | AMOUNT | ORDERDATE |
| 1 | LIHD | 11 | 9893 | 2020/12/7 |
| 2 | NYSD | 1 | 8332 | 2020/12/7 |
| 3 | RSDRG | 10 | 4614 | 2020/12/7 |
| 4 | LDCH | 18 | 8807 | 2020/12/7 |
| 5 | JXJDI | 19 | 743 | 2020/12/7 |
数据库中的销售数据表(sales),对应的表结构为:
| 字段名 | 类型 |
| ORDERID | int |
| CLIENT | varchar(10) |
| SELLERID | smallint |
| AMOUNT | double |
| ORDERDATE | date |
1. 运行集算器,配置数据库连接并命名,填写的参数和 JDBC 连接时一样。
操作菜单:Tool->Datasource Connection->Datasouce 设置如下:

2. 在集算器中编写脚本csv2db.dfx:
小数据时(csv中的数据量较少,在运行环境中,适合直接加载至内存 ):
|
| A | B |
| 1 | =file("sales.csv").import@ct() | /读取csv文件内容 |
| 2 | =connect("mysql") | /连接数据库 |
| 3 | >A2.update@i(A1,sales,ORDERID,CLIENT,SELLERID,AMOUNT,ORDERDATE) | /使用db.update函数完成csv数据加载至数据库 |
| 4 | >A2.close() | /关闭数据库连接 |
如果知道csv中数据都是新的,那么可以使用了update@i函数,将只生成INSERT语句。如果还有要更新的数据,则直接使用update函数,但这样速度会慢很多,因为要判断是否生成UPDATE语句。update函数的详细用法见:db.update()。
3. 执行脚本,数据库中sales表已经加载了csv的数据,部分数据如下:

4. 集成到java应用中
集算器提供了 JDBC 驱动,将脚本集成代码如下:
public static void testDataServer() {
Connection con = null;
java.sql.PreparedStatement st;
try {
Class.forName("com.esproc.jdbc.InternalDriver");
con = DriverManager.getConnection("jdbc:esproc:local://");
// 调用 csv2db.dfx 脚本
st = con.prepareCall("call csv2db()");
st.execute();
System.out.println("finish");
} catch (Exception e) {
System.out.println(e);
} finally {
// 关闭连接
if (con != null) {
try {
con.close();
} catch (Exception e) {
System.out.println(e);
}
}
}
}
集算器与 JAVA 集成的进一步信息可参考:《Java 如何调用 SPL 脚本》。
当csv中的数据量较多,在运行环境中,不适合或者无法直接加载至内存时。只需要将A1格中的import改为cursor,就可以完成大数据情况下的csv数据加载至数据库的工作。
本文介绍了如何使用Java结合集算器将CSV数据高效地导入到Mysql数据库。通过集算器的脚本`csv2db.dfx`,在小数据量时利用`update@i`或`update`函数实现数据插入或更新,大数据量时使用`cursor`处理。集成到Java应用中,通过JDBC驱动调用SPL脚本完成数据加载。

216

被折叠的 条评论
为什么被折叠?



