有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

我插入到表中的java数据不会替换旧数据,如果数据已经存在,有方法替换数据吗?

问题如下:我正在为一个学校项目保存散列密码,但我仍然停留在SQL语句的语法上,无法替换已经存在的数据。该表只需要存储一个用户名/密码组合

public class DatabaseManager {

    String dbPath = "jdbc:sqlite:test.db";

    public DatabaseManager () {
        try {
            Class.forName("org.sqlite.JDBC");
            Connection conn = DriverManager.getConnection(dbPath);
            if (conn != null) {
                System.out.println("Connected to the database");
                DatabaseMetaData dm = (DatabaseMetaData) conn.getMetaData();

                // Setting up database
                databaseSetup(conn);

                boolean tempInsertion = databaseInsert("pancake", "house", conn);

                // Inserting data
                if (tempInsertion) {
                    System.out.println("Data insertion failed");
                }

                // Retrieving data

                List<String> retrievedData = databaseSelect(conn);

                if (retrievedData == null) {
                    System.out.println("Data extraction failed");
                }
                else {
                    System.out.println(retrievedData.size());
                }
                conn.close();
            }
        }
        catch (ClassNotFoundException ex) {
            ex.printStackTrace();
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
    }

    private boolean databaseInsert(String username, String password, Connection conn) {

        String sqlInsert = "INSERT OR REPLACE INTO login(username, password) VALUES(?,?)";

        PreparedStatement prepStatement;
        try {
            prepStatement = conn.prepareStatement(sqlInsert);
            prepStatement.setString(1, encrypt(username));
            prepStatement.setString(2, encrypt(password));

            prepStatement.executeUpdate();
        } catch (SQLException e) {
            return false;
        }      
        return true;
    }

    private List<String> databaseSelect(Connection conn) {
        List<String> tempList = new ArrayList<String>();

        String sqlSelect = "SELECT * FROM login";  

        Statement stmt;
        try {
            stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery(sqlSelect);  

            tempList.add(rs.getString("username"));
            tempList.add(rs.getString("password"));

            int columnsNumber = rs.getMetaData().getColumnCount();

            while (rs.next()) {
                for (int i = 1; i <= columnsNumber; i++) {
                    if (i > 1) System.out.print(",  ");
                    String columnValue = rs.getString(i);
                    System.out.print(columnValue + " " + rs.getMetaData().getColumnName(i));
                }
                System.out.println("");
            }

        } catch (SQLException e) {
            return null;
        }  
        return tempList;
    }

    private void databaseSetup( Connection conn) {
        String sqlExpression = "CREATE TABLE login (username varchar(255), password varchar(255))";

        try {
            Statement statement = conn.createStatement();
            statement.execute(sqlExpression);
        } catch (SQLException e) {}
    }   

    private String encrypt(String string) {
        try {
            MessageDigest exampleCrypt = MessageDigest.getInstance("SHA1");
            exampleCrypt.reset();

            exampleCrypt.update(string.getBytes("UTF-8"));
            return convertByte(exampleCrypt.digest());

        }
        catch(NoSuchAlgorithmException e) {
            System.out.println("Error, cannot encrypt string");
            e.printStackTrace();
        }
        catch(UnsupportedEncodingException e) {
            System.out.println("Error, cannot encrypt string");
            e.printStackTrace();
        }
        return null;
    }

    private static String convertByte(final byte[] hash) {

        Formatter formatter1 = new Formatter();

        for (byte i : hash) {
            formatter1.format("%02x", i);
        }
        String encryptedData = formatter1.toString();

        formatter1.close();
        return encryptedData;

    }

}

如上所述,问题是我一次只想存储一个密码/用户名组合,作为散列。然而,当这种情况发生时,它会复制哈希组合,而不是替换它


共 (0) 个答案