用单例模式创建数据插入线程类:
package com.singletonmodel.two;
import java.sql.*;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DatabaseInsertThread {
private static final String DB_URL = "jdbc:mysql://localhost:3306/test_data";
private static final String DB_USERNAME = "root";
private static final String DB_PASSWORD = "admin";
private static DatabaseInsertThread instance;
private DatabaseInsertThread() {
// 私有构造函数,防止外部实例化对象
}
public static DatabaseInsertThread getInstance() {
if (instance == null) {
synchronized (DatabaseInsertThread.class) {
if (instance == null) {
instance = new DatabaseInsertThread();
}
}
}
return instance;
}
public void insertData(String engName) {
try {
Connection connection = DriverManager.getConnection(DB_URL, DB_USERNAME, DB_PASSWORD);
// 遍历eng_name字段,检查是否与待插入数据重复
String selectQuery = "SELECT eng_name FROM words_info";
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery(selectQuery);
while (resultSet.next()) {
String existingEngName = resultSet.getString("eng_name");
if (existingEngName.equalsIgnoreCase(engName)) {
// 如果存在相同的eng_name,则不插入数据
System.out.println("Data with same eng_name already exists. Skipping insertion.");
return;
}
}
// 获取当前时间
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String currentTime = dateFormat.format(new Date());
// 构建插入数据的SQL语句
String insertQuery = "INSERT INTO words_info (eng_name, chi_val, last_used_time, used_times, created_time, priority) VALUES (?, ?, ?, ?, ?, ?)";
PreparedStatement preparedStatement = connection.prepareStatement(insertQuery);
preparedStatement.setString(1, engName);
preparedStatement.setNull(2, Types.VARCHAR);
preparedStatement.setString(3, currentTime);
preparedStatement.setInt(4, 1);
preparedStatement.setString(5, currentTime);
preparedStatement.setInt(6, 0);
// 执行插入操作
int rowsAffected = preparedStatement.executeUpdate();
if (rowsAffected > 0) {
System.out.println("Data inserted successfully.");
} else {
System.out.println("Failed to insert data.");
}
// 关闭连接和相关资源
preparedStatement.close();
statement.close();
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
在主线程中启动子线程 :
package com.singletonmodel.two;
public class MainThread {
public static void main(String[] args) {
DatabaseInsertThread databaseInsertThread = DatabaseInsertThread.getInstance();
// 创建子线程并插入数据
Thread insertThread = new Thread(() -> {
// 需要插入的数据
String engName = "FECT";
databaseInsertThread.insertData(engName);
});
insertThread.start();
// 主线程继续执行其他任务
System.out.println("Main thread continues executing.");
}
}
测试结果如下: