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) {}
        }           
    }
}