【问题标题】:Why is my add method, not adding values into my sql database from java?为什么我的添加方法不是从 java 向我的 sql 数据库添加值?
【发布时间】:2022-12-12 18:22:43
【问题描述】:

因此,我必须将播放器添加到列表中,同时将其添加到我的 SQL Server 数据库中,但是表中的添加没有发生,即使列表中的添加没问题。

public class PlayerRepositoryJDBC {

    private Connection connection;
    private ArrayList<Player> allPlayers = new ArrayList<>();


    public ArrayList<Player> getAllPlayers() {
        return allPlayers;
    }

    public void setAllPlayers(ArrayList<Player> allPlayers) {
        this.allPlayers = allPlayers;
    }

    public PlayerRepositoryJDBC() throws SQLException {
        String connectionURL = "jdbc:sqlserver://localhost:52448;databaseName=MAP;user=user1;password=1234;encrypt=true;trustServerCertificate=true";
        try {
            System.out.print("Connecting to the server......");
            try (Connection connection = DriverManager.getConnection(connectionURL)) {
                System.out.println("Connected to the Server.");

                Statement select = connection.createStatement();
                ResultSet resultSet = select.executeQuery("SELECT * FROM PlayerMAP");
                int count = 0;
                while (resultSet.next()) {
                    count++;
                }
                if (count > 0) {
                    ResultSet result = select.executeQuery(" SELECT * FROM PlayerMAP");
                    while (result.next()) {
                        Player player = new Player
                                (result.getString("id"), result.getString("firstName"), result.getString("lastName"), result.getInt("age"), result.getString("nationality"), result.getString("position"), result.getInt("marketValue"));
                        allPlayers.add(player);
                    }
                } else {
                    String insert_string = "INSERT INTO PlayerMAP(id, firstName, lastName, age, nationality, position, marketValue) VALUES ('P1','Dan','Mic',18,'Romania','Forward',1250)";
                    Statement insert = connection.createStatement();
                    insert.executeUpdate(insert_string);
                    Player player=new Player("P1","Dan","Mic",18,"Romania","Forward",1250);
                    allPlayers.add(player);
                }
                //System.out.println(allPlayers.size());

            } catch (Exception e) {
                System.out.println("I am not connected to the Server");
                e.printStackTrace();
            }

        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public void add(Player entity) throws SQLException {
        allPlayers.add(entity);
        String id=entity.getId();
        String firstName=entity.getFirstName();
        String lastName=entity.getLastName();
        int age = entity.getAge();
        String nationality= entity.getNationality();
        String position=entity.getPosition();
        int marketValue=entity.getMarketValue();
        String insert_string = "INSERT INTO PlayerMAP(id, firstName, lastName, age, nationality, position, marketValue) VALUES ('"+id+"', '"+firstName+"', '"+lastName+"', '"+age+"', '"+nationality+"', '"+position+"', '"+marketValue+"')";

        Statement insert = this.connection.createStatement();
        insert.executeUpdate(insert_string);

    }

那是代码... 所以我希望我的程序在我的列表 allPlayers 中添加一个 Player 类型的对象,它也应该添加到我的数据库中的 PlayerMAP 表中。但是当我检查 SSMS 时,我的表 PlayerMAP 没有任何变化。

【问题讨论】:

  • try (Connection connection 定义了一个局部变量,因此您的类变量 connection 为空。
  • 看看at this,它涵盖了在 java 中使用准备好的语句插入 sql 以帮助防止 SQL 注入,它确实提到了 PostgreSQL,但代码与 SQL Server 相同
  • 遍历所有玩家来计算他们的效率不是很高:你可以做SELECT COUNT(1) FROM PlayerMAP。此外,当您只能使用带参数的 PreparedStatement 时,构建 SQL 语句是一个非常糟糕的主意。
  • 事实上,您甚至不需要玩家的数量:您只需要知道是否存在玩家即可。

标签: java sql sql-server


【解决方案1】:

我看到几个潜在的问题:

  1. 如果您的表中已经插入了 1 名或更多玩家 PlayerMapcount 将始终大于 0。因此,只有已经在数据库中的玩家才会添加到您的 allPlayers 列表中

  2. ResultSet result = select.executeQuery(" SELECT * FROM PlayerMAP");SELECT关键字前多了一个空格

  3. 如果字段 id 是表 PlayerMAP 的主键(正如我猜测的那样),如果具有该 ID 的玩家已经存在,则不会将 ID 为“P1”的玩家添加到数据库中

  4. 你不需要 2 个 try-catch 块。一个就够了。此外,您应该捕获抛出的特定异常,而不是通用的Exception。在这里,您应该改为捕获 SQLException

  5. 您是否尝试在添加新播放器之前添加 System.out.println(或调试点)?它将确保您已执行 SQL 插入

  6. 如果执行 SQL 插入,您的数据库是否处于自动提交模式?如果没有,您应该尝试致电connection.commit()

  7. 最后,不要忘记在插入后关闭连接

    try (Connection connection = DriverManager.getConnection(connectionURL)) {
        System.out.println("Connected to the Server.");
    
        Statement select = connection.createStatement();
        ResultSet resultSet = select.executeQuery("SELECT * FROM PlayerMAP");
        int count = 0;
        while (resultSet.next()) {
            count++;
        }
        if (count > 0) {
            ResultSet result = select.executeQuery("SELECT * FROM PlayerMAP");//Remove extra space
            while (result.next()) {
                Player player = new Player(result.getString("id"), result.getString("firstName"),
                        result.getString("lastName"), result.getInt("age"), result.getString("nationality"),
                        result.getString("position"), result.getInt("marketValue"));
                allPlayers.add(player);
            }
        } else {
            System.out.println("in");//Add System.out (or debug point) to see if your code is executed 
            String insert_string = "INSERT INTO PlayerMAP(id, firstName, lastName, age, nationality, position, marketValue) VALUES ('P1','Dan','Mic',18,'Romania','Forward',1250)";
            Statement insert = connection.createStatement();
            insert.executeUpdate(insert_string);
            connection.commit();//Commit your insert
            Player player = new Player("P1", "Dan", "Mic", 18, "Romania", "Forward", 1250);
            allPlayers.add(player);
            System.out.println("out: " + allPlayers.size()); //Add System.out (or debug point) to see if your code is executed 
        }
        connection.close();//Close your connection
    } catch (SQLException e) {//Catche SQLException instead of Exception
        System.out.println("I am not connected to the Server");
        e.printStackTrace();
        if (connection != null)
            connection.close();//Close the connection if exception occurs
    }
    

    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-29
    • 2022-10-19
    • 2014-10-08
    • 2012-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多