一、背景
由于多租户本来就有动态数据源,所以新建一个数据库然后搜集里面的数据
二、配置
helpai: url: jdbc:mysql://localhost:3306/farm?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver
二、工具类
package jnpf.helpailog.service.impl;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import jnpf.model.helpailog.po.FtbHelpAiChatLog;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.UUID;
@Component
public class AiUtil {
@Value("${helpai.url}")
private String url;
@Value("${helpai.username}")
private String username;
@Value("${helpai.password}")
private String password;
private HikariDataSource dataSource;
@PostConstruct
public void init() {
HikariConfig config = new HikariConfig();
config.setJdbcUrl(url);
config.setUsername(username);
config.setPassword(password);
config.addDataSourceProperty("cachePrepStmts", "true");
config.addDataSourceProperty("prepStmtCacheSize", "250");
config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
dataSource = new HikariDataSource(config);
}
// Create a new user
public void insertFtbHelpAiChatLog(FtbHelpAiChatLog log) {
String sql = "INSERT INTO ftb_help_ai_chat_log (F_Id, F_UserId, F_Question, F_Answer, F_SessionId, F_TenantId, F_CreatorTime) VALUES (?, ?, ?, ?, ?, ?, ?)";
try (Connection conn = dataSource.getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, log.getId() != null ? log.getId() : UUID.randomUUID().toString());
pstmt.setString(2, log.getUserId());
pstmt.setString(3, log.getQuestion());
pstmt.setString(4, log.getAnswer());
pstmt.setString(5, log.getSessionId());
pstmt.setString(6, log.getTenantId());
pstmt.setTimestamp(7, new java.sql.Timestamp(log.getCreatorTime().getTime()));
pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
三、调用
@Autowired
AiUtil aiUtil;
aiUtil.insertFtbHelpAiChatLog(entity);
优化版本
1、新建一个接口
import java.util.Map;
public interface GenericEntity {
String getTableName();
Map<String, Object> getFieldValues();
}
2、实体类
import lombok.Data;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
@Data
public class FtbHelpAiChatLog1 implements GenericEntity {
private String id;
private String userId;
private String question;
private String answer;
private String sessionId;
private String tenantId;
private java.util.Date creatorTime;
// Getters and Setters
@Override
public String getTableName() {
return "ftb_help_ai_chat_log";
}
@Override
public Map<String, Object> getFieldValues() {
Map<String, Object> fieldValues = new HashMap<>();
fieldValues.put("F_Id", id != null ? id : UUID.randomUUID().toString());
fieldValues.put("F_UserId", userId);
fieldValues.put("F_Question", question);
fieldValues.put("F_Answer", answer);
fieldValues.put("F_SessionId", sessionId);
fieldValues.put("F_TenantId", tenantId);
fieldValues.put("F_CreatorTime", new java.sql.Timestamp(creatorTime.getTime()));
return fieldValues;
}
}
3、工具类
package jnpf.helpailog.config;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Map;
import java.util.UUID;
@Component
public class AiUtil {
private static final Logger logger = LoggerFactory.getLogger(AiUtil.class);
@Value("${helpai.url}")
private String url;
@Value("${helpai.username}")
private String username;
@Value("${helpai.password}")
private String password;
private HikariDataSource dataSource;
@PostConstruct
public void init() {
HikariConfig config = new HikariConfig();
config.setJdbcUrl(url);
config.setUsername(username);
config.setPassword(password);
config.addDataSourceProperty("cachePrepStmts", "true");
config.addDataSourceProperty("prepStmtCacheSize", "250");
config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
dataSource = new HikariDataSource(config);
}
public void insertEntity(GenericEntity entity) {
String tableName = entity.getTableName();
Map<String, Object> fieldValues = entity.getFieldValues();
StringBuilder sqlBuilder = new StringBuilder("INSERT INTO ");
sqlBuilder.append(tableName).append(" (");
StringBuilder valuesBuilder = new StringBuilder("VALUES (");
int index = 0;
for (String fieldName : fieldValues.keySet()) {
if (index > 0) {
sqlBuilder.append(", ");
valuesBuilder.append(", ");
}
sqlBuilder.append(fieldName);
valuesBuilder.append("?");
index++;
}
sqlBuilder.append(") ").append(valuesBuilder).append(")");
String sql = sqlBuilder.toString();
try (Connection conn = dataSource.getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql)) {
setPreparedStatementParameters(pstmt, fieldValues.values().toArray());
pstmt.executeUpdate();
} catch (SQLException e) {
logger.error("Failed to insert entity", e);
throw new RuntimeException("Failed to insert entity", e);
}
}
private void setPreparedStatementParameters(PreparedStatement pstmt, Object[] params) throws SQLException {
for (int i = 0; i < params.length; i++) {
if (params[i] instanceof String) {
pstmt.setString(i + 1, (String) params[i]);
} else if (params[i] instanceof java.sql.Timestamp) {
pstmt.setTimestamp(i + 1, (java.sql.Timestamp) params[i]);
} else if (params[i] instanceof UUID) {
pstmt.setString(i + 1, params[i].toString());
} else {
throw new IllegalArgumentException("Unsupported parameter type: " + params[i].getClass().getName());
}
}
}
}
浙公网安备 33010602011771号