java - Java将file.txt中的多行数据插入数据库表
问题描述
我有一个由几行组成的文本文件。我想将整行添加到数据库表中。在插入表之前,应该是substring
获取数据库表的字段值。我认为我的代码(查询)不适合大数据。我知道还有其他方法可以做到这一点。
public class ReaderFilesData {
LinkedList<String> listFiles = new LinkedList<String>();
private Path path = Paths.get("src/FilesDownloaded/");
DataTRX dataTRX = new DataTRX();
public void readFiles() {
File[] listFile = new File(path.toString()).listFiles();
for (File file : listFile) {
if (file.isFile()) {
listFiles.add(file.getName());
}
}
System.out.println("Total Files : " +listFiles.size());
}
public void readData() {
Path pathsourceFile;
String line;
BufferedReader reader;
for (int i=0; i<listFiles.size(); i++) {
try {
String fileName = listFiles.get(i);
System.out.println("FileName : " +fileName);
pathsourceFile = Paths.get("src/FilesDownloaded/"+fileName+"");
reader = new BufferedReader(new FileReader(pathsourceFile.toString());
while ((line = reader.readLine())!=null) {
int startPoint = line.lastIndexOf(';')+1;
String valueLine = new String(line.substring(startPoint));
System.out.println("Transaction data : " +valueLine);
dataTRX.setId(valueLine.substring(0,2));
dataTRX.setAmount(Integer.parseInt(valueLine.substring(2, 10)));
dataTRX.setDesc(valueLine.substring(10, 18));
System.out.println("getId : " + dataTRX.getId());
System.out.println("getAmount : " + dataTRX.getAmount());
System.out.println("getDesc : " + dataTRX.getDesc());
importData(dataTRX.getId(),
dataTRX.getAmount(),
dataTRX.getDesc(),
}
reader.close();
} catch (Exception e) {
e.getMessage();
}
}
}
public void importData(String id, int amount, String discount ) {
String insertData = "INSERT INTO tbl_trx (id, amount, desc) "
+ "VALUES (?,?,?)";
try {
try (PreparedStatement ps = GeneralRules.conn.prepareStatement(insertData)) {
ps.setString(1, id);
ps.setInt(2, amount);
ps.setString(4, desc);
ps.executeUpdate();
System.out.println("Data successfully update to database!!!\n");
ps.close();
}
} catch (Exception e) {
e.getMessage();
}
}
这是 file.txt 的示例数据
- 320000000200000001
- 2G0000000500000002
- AB0000001500000001
我在上面的行做子字符串数据库:
- 子字符串 id,amount,discount (32,00000002,00000001)
- 子串 id,金额,折扣 (2G,00000005,00000002)
- 子字符串 id,金额,折扣 (AB,00000015,00000001)
解决方案
你的代码对我来说似乎很好。但是如果我在优化/替换下面写它,我会做的
1)在变量声明中使用List
而不是从引用点中删除泛型。就像是LinkedList
String
List<String> listFiles = new LinkedList<>();
2) 与使用 try 和你为PreparedStatement
做的资源类似,我也会为BufferedReader
. 这将消除最后关闭“BufferedReader”的需要
try (BufferedReader reader = new BufferedReader(new FileReader(pathsourceFile.toString())))
3)因为你用过try with resource for PreparedStatement
,所以没必要有ps.close()
,因为preparedstatement实现了AutoCloseable
。所以尝试使用资源会解决它
4)e.getMessage()
我会使用而不是,e.printStackTrace()
因为它会给我更多关于错误的信息
就您对子字符串的使用而言,我会使用它,或者会使用正则表达式来拆分字符串。
如果要插入的行数更多,我认为这是你的情况,而不是executeUpdate()
每次都调用,而是使用Batch
模式。即,将语句添加到PreparedStatement
批处理中addBatch()
并一次性执行executeBatch()
推荐阅读
- image - 如何使用 RGBA 和更多通道独立于其颜色来更改图像的颜色
- powershell - 如何在powershell中转义大括号
- javascript - Javascript Builder 模式没有看到声明的变量
- c++ - OpenGL 翻译错误,C1068 和 C2003
- c++ - 如果我们不涉及真实代码,在 gmock 中模拟是否有意义?
- javascript - 谷歌表格日历
- python - 有没有办法在不使用循环的情况下获取列表的每个元素?
- java - 每次进行更改时都运行 mvn package?
- android - 用 KASAN 编译 AOSP 内核
- git - 如何仅针对当前修改的文件查看与另一个分支的 git 差异?