title: Accessing user database from multiple classes
body: <p>I'm creating a basic register/login username/password database and I'm wondering if my approach is correct. I'm not satisfied with code just working, I want it to be clean and efficient as well.</p>
  
  <p>Users can access an internet login page, enter credentials, and basically log in. I have a Database class, which creates accounts and checks if the credentials entered are correct. </p>
  
  <p>So, the Database class:</p>
  
  <pre><code>public class Database {
  
      private Connection          connection          = null;
      private PreparedStatement   preparedStatement   = null;
      private ResultSet           resultSet           = null;
  
      // Method for registering a new account. Credentials are added into the database.
      public void registerAccount(String username, String password, String ipAddress) {
  
          try {
  
              Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
              connection = DriverManager
              .getConnection("jdbc:derby:C:\\DB;create=true;upgrade=true");
              String query = "INSERT INTO Users (username, password, ip_address) VALUES" + "(?,?,?)";
              preparedStatement = connection.prepareStatement(query);
              preparedStatement.setString(1, username);
              preparedStatement.setString(2, password);
              preparedStatement.setString(3, ipAddress);
              preparedStatement.executeUpdate();
  
          } catch (Exception e) {
              e.printStackTrace();
          } finally {
              close();
          }
  
      }
  
      private void close() {
  
          try {
  
              if (resultSet != null) {
                  resultSet.close();
              }
              if (preparedStatement != null) {
                  preparedStatement.close();
              }
              if (connection != null) {
                  connection.close();
              }
          } catch (Exception e) {
              e.printStackTrace();
          }
  
      }
  }
  </code></pre>
  
  <p>e.g.: When a user clicks submit to log in, a method inside the Database class is called:</p>
  
  <pre><code>// Checks if credetials are correct.
  public boolean checkLogin(String username, String password) {
  
      try {
  
          Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
          connection = DriverManager
                  .getConnection("jdbc:derby:C:\\DB;create=true;upgrade=true");
          String query = "SELECT username, password from Users WHERE username = ? AND password = ?";
          preparedStatement = connection.prepareStatement(query);
          preparedStatement.setString(1, username);
          preparedStatement.setString(2, password);
          resultSet = preparedStatement.executeQuery();
  
          if (resultSet.next()) {
              String user = resultSet.getString("username");
              String pass = resultSet.getString("password");
              if (username.equalsIgnoreCase(user)) {
                  if (password.equals(pass)) {
                      return true;
                  }
              }
          }
  
      } catch (Exception e) {
          e.printStackTrace();
      } finally {
          close();
      }
      return false;
  }
  </code></pre>
  
  <p>I also have a few other methods in the Database class to check if username is not taken when registering, or if an account is already registered on a particular IP, etc. Is this good practice or there are better, more efficient ways of achieving this?
  Thank you!</p>