Java准备语句和M:N插入
我有两个表,它们之间有一个反编译Java准备语句和M:N插入,java,database-design,prepared-statement,Java,Database Design,Prepared Statement,我有两个表,它们之间有一个反编译 Target_of_numbers - targetId (with auto increment) - name Numbers - numberId (with auto increment) - msisdn Target_of_numbers_Numbers - targetId - numberId 我想问一下,如果我使用这个Java类,如何能够插入到这个关系中 Connection conn = null; Prepare
Target_of_numbers
- targetId (with auto increment)
- name
Numbers
- numberId (with auto increment)
- msisdn
Target_of_numbers_Numbers
- targetId
- numberId
我想问一下,如果我使用这个Java类,如何能够插入到这个关系中
Connection conn = null;
PreparedStatement stmt = null;
谁能给我一个建议吗?好的,这就是我的解决方案。我不知道这是否是最好的,但效果很好: 这是主要的方法:
public void importTargetValue(NumberImportData data, Target target, ImportType type) throws SQLException {
List<Statement> stmtList = new ArrayList<Statement>();
Connection conn = null;
PreparedStatement stmtTarget = null;
PreparedStatement stmtNumber = null;
PreparedStatement stmtTargetNumber = null;
try {
conn = getConnection();
Long returnedTargetId = insertTarget(conn, stmtTarget, target);
for (TargetNumber t : data.getNumbers()) {
Long returnedNumberId = insertNumber(conn, stmtNumber, t);
//insert to decompozition
insertTargetNumber(conn, stmtTargetNumber, returnedTargetId, returnedNumberId);
}
} finally {
stmtList.add(stmtTarget);
stmtList.add(stmtNumber);
stmtList.add(stmtTargetNumber);
closeDbResources(conn, stmtList);
}
}
为数字插入:
private Long insertNumber(Connection conn, PreparedStatement stmtNumber, TargetNumber t) throws SQLException {
PreparedStatement statement = (PreparedStatement) stmtNumber;
ResultSet generatedKeys = null;
try {
statement = conn.prepareStatement("REPLACE INTO stats_number (msisdn) VALUES (?)", Statement.RETURN_GENERATED_KEYS);
statement.setString(1, t.getMsisdn());
int affectedRows = statement.executeUpdate();
if (affectedRows == 0) {
throw new SQLException("Creating number failed, no rows affected.");
}
generatedKeys = statement.getGeneratedKeys();
if (generatedKeys.next()) {
t.setNumberId(generatedKeys.getLong(1));
} else {
throw new SQLException("Creating number failed, no generated key obtained.");
}
} finally {
if (generatedKeys != null) try { generatedKeys.close(); } catch (SQLException logOrIgnore) {}
}
return t.getNumberId();
}
插入分解:
private void insertTargetNumber(Connection conn, PreparedStatement stmtTargetNumber, Long returnedTargetId, Long returnedNumberId) throws SQLException {
PreparedStatement statement = (PreparedStatement) stmtTargetNumber;
try {
statement = conn.prepareStatement("INSERT INTO stats_target_number (targetId, numberId) VALUES (?, ?)");
statement.setLong(1, returnedTargetId);
statement.setLong(2, returnedNumberId);
int affectedRows = statement.executeUpdate();
if (affectedRows == 0) {
throw new SQLException("Creating target failed, no rows affected.");
}
} finally {
}
}
以及一些关闭语句的方法:
protected final void closeDbResources(Connection conn, List<Statement> stmt) {
for (Statement s : stmt) {
if (s != null) {
log.debug("[SQL QUERY]: " + s);
try {
s.close();
} catch (SQLException e) {}
}
}
}
protectedfinal void closeDbResources(连接连接,列表stmt){
对于(语句s:stmt){
如果(s!=null){
log.debug(“[SQL查询]:”+s);
试一试{
s、 close();
}捕获(SQLE){}
}
}
}
您尝试过什么?你读过javaodoc吗?这个谷歌是你的朋友。在谷歌中输入“tutorial”,你很有可能看到这项技术的官方教程作为第一个结果。用“Java准备好的语句教程”试试吧。我的目标主要是找到一个解决方案,在我不知道它的值的情况下,如何保存目标\u的ID和数字的ID。。。但看起来我解决了。10分钟后,我将在这里发布我的解决方案。
protected final void closeDbResources(Connection conn, List<Statement> stmt) {
for (Statement s : stmt) {
if (s != null) {
log.debug("[SQL QUERY]: " + s);
try {
s.close();
} catch (SQLException e) {}
}
}
}