java는 JDBC를 사용하여 간단한 데이터 접근층 구축 실례 상세 설명

이 강좌의 목적은 자바가 작성한 분리된 층을 이용하여 데이터베이스에 있는 테이블에 접근하는 것이다. 이 층을 통상적으로 데이터 접근층(DAL)이라고 부른다
DAL을 사용하는 가장 큰 장점은 insert () 와find () 와 같은 방법을 직접 사용하여 데이터베이스에 접근하는 작업을 간소화하는 것이다. 항상 링크를 하고 조회를 하는 것이 아니라.
이 층은 데이터베이스와 관련된 모든 호출과 조회를 내부에서 처리한다.
데이터베이스 만들기
우리는 사용자를 위해 간단한 표를 만들고 싶다. 우리는 이 필드를 사용해서 만들 수 있다
id        int
name      varchar(200)
password  varchar(200)
age       int
 
데이터 전송 대상
이 레이어에는 데이터 전송 객체(DTO)라는 간단한 클래스가 포함되어야 합니다.이 클래스는 데이터베이스에 있는 테이블과 대응하는 간단한 맵일 뿐, 테이블의 모든 열에 대응하는 클래스의 구성원 변수일 뿐이다.
우리의 목적은 간단한 Java 대상을 사용하는 것이지 SQL 문장과 데이터베이스와 관련된 다른 명령을 처리하여 데이터베이스의 삭제 검사를 하는 것이 아니다.
우리는 표를 자바 코드로 비추려면 같은 필드를 포함하는 클래스 (bean) 를 만들면 된다
더 잘 봉인되기 위해서, 구조 함수를 제외하고는 모든 필드 변수를 개인으로 하고, 접근기 (getter와setter) 를 만들어야 합니다. 그 중 하나는 기본 구조 함수입니다.

public class User {
  private Integer id;
  private String name;
  private String pass;
  private Integer age;
}
필드를 정확하게 매핑하기 위해서 데이터베이스에 있는 NULL 값을 고려해야 합니다.자바의 원시적인 기본값, 예를 들어 int 형식의 기본값은 0이기 때문에 빈 값을 수용할 수 있는 새로운 데이터 형식을 제공해야 합니다.우리는 INT 대신 Integer와 같은 특수한 유형인 봉인 클래스를 사용할 수 있다.
마지막으로 우리의 클래스는 다음과 같아야 한다.

public class User {
  private Integer id;
  private String name;
  private String pass;
  private Integer age;
  public User() {
  }
  public User(String name, String pass, Integer age) {
    this.name = name;
    this.pass = pass;
    this.age = age;
  }
  public User(Integer id, String name, String pass, Integer age) {
    this.id = id;
    this.name = name;
    this.pass = pass;
    this.age = age;
  }
  public Integer getAge() {
    return age;
  }
  public void setAge(Integer age) {
    this.age = age;
  }
  public Integer getId() {
    return id;
  }
  public void setId(Integer id) {
    this.id = id;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public String getPass() {
    return pass;
  }
  public void setPass(String pass) {
    this.pass = pass;
  }
}
좋은 방법은 기본적인 공구조 함수, 완전한 구조 함수, id 파라미터가 없는 완전한 구조 함수를 제공하는 것이다.
데이터베이스 연결
우리는 중간 클래스를 사용하여 데이터베이스에 쉽게 연결할 수 있습니다. 이 클래스에서 데이터베이스 연결 매개 변수, 예를 들어 데이터베이스 JDBC, URL, 사용자 이름과 비밀번호를 제공하고 이 변수를final로 정의합니다. (properties나 xml 프로필에서 이 데이터를 가져오면 더 좋습니다.)
연결 대상을 되돌리거나 연결이 실패했을 때null을 되돌리거나 실행할 때 이상을 던지는 방법을 제공합니다.

public static final String URL = "jdbc:mysql://localhost:3306/testdb";
public static final String USER = "testuser";
public static final String PASS = "testpass";
/**
 *  connection 
 * @return Connection  
*/
public static Connection getConnection() {
  try {
    DriverManager.registerDriver(new Driver());
    return DriverManager.getConnection(URL, USER, PASS);
  } catch (SQLException ex) {
    throw new RuntimeException("Error connecting to the database", ex);
  }
}
우리도 클래스에 연결을 테스트하는 주된 방법을 포함할 수 있다.전체 클래스는 다음과 같습니다.

import com.mysql.jdbc.Driver;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/**
 * Connect to Database
 * @author hany.said
 */
public class ConnectionFactory {
  public static final String URL = "jdbc:mysql://localhost:3306/testdb";
  public static final String USER = "testuser";
  public static final String PASS = "testpass";
  /**
   * Get a connection to database
   * @return Connection object
   */
  public static Connection getConnection()
  {
   try {
     DriverManager.registerDriver(new Driver());
     return DriverManager.getConnection(URL, USER, PASS);
   } catch (SQLException ex) {
     throw new RuntimeException("Error connecting to the database", ex);
   }
  }
  /**
   * Test Connection
   */
  public static void main(String[] args) {
    Connection connection = connectionFactory.getConnection();
  }
}
데이터 액세스 객체
DAO 레이어에서는 CRUD 작업을 수행할 수 있습니다.그것은 우리의 표를 삭제하고 고칠 수 있다.
우리의 DAO 레이어 인터페이스는 다음과 같이 해야 합니다.

public interface UserDao {
  User getUser();
  Set<User> getAllUsers();
  User getUserByUserNameAndPassword();
  boolean insertUser();
  boolean updateUser();
  boolean deleteUser();
}
사용자 찾기
사용자는 ID, 이름, 메일박스 등 유일한 필드를 통해 조회할 수 있습니다.이 예에서 우리는 ID를 사용하여 사용자를 찾습니다.첫 번째 단계는 연결기 클래스를 통해connection을 만들고 SELECT 문장을 실행하여 ID가 7인 사용자를 얻는 것입니다. 이 문장을 사용하여 사용자를 조회할 수 있습니다.
SELECT * FROM user WHERE id=7
여기서 우리는 매개 변수에서 ID를 얻기 위해 동적 문장을 만들었다.
이 검색을 실행하면 사용자나null이 저장된 결과 집합을 얻을 수 있습니다.Resultset의 next() 방법으로 값이 있는지 확인할 수 있습니다.true로 돌아가면 ResultSet에서 데이터 getters를 사용하여 사용자 데이터를 가져옵니다.모든 데이터를user에 봉인하면 되돌려줍니다.이 ID가 없는 사용자나 다른 예외 발생 (예: 잘못된 SQL 문장) 이 방법은null로 되돌아옵니다.

public User getUser(int id) {
  Connection connection = connectionFactory.getConnection();
    try {
      Statement stmt = connection.createStatement();
      ResultSet rs = stmt.executeQuery("SELECT * FROM user WHERE id=" + id);
      if(rs.next())
      {
        User user = new User();
        user.setId( rs.getInt("id") );
        user.setName( rs.getString("name") );
        user.setPass( rs.getString("pass") );
        user.setAge( rs.getInt("age") );
        return user;
      }
    } catch (SQLException ex) {
      ex.printStackTrace();
    }
  return null;
}
단독 방법으로 결과에서 데이터를 집중적으로 추출하는 것이 더욱 편리할 것이다. 왜냐하면 많은 방법에서 우리는 그것을 호출할 수 있기 때문이다.
이 새로운 방법은 SQLException을 버리고 클래스 내부에서만 사용할 수 있도록 제한하기 위해 개인적인 것이어야 한다.

private User extractUserFromResultSet(ResultSet rs) throws SQLException {
  User user = new User();
  user.setId( rs.getInt("id") );
  user.setName( rs.getString("name") );
  user.setPass( rs.getString("pass") );
  user.setAge( rs.getInt("age") );
  return user;
}
우리 위의 방법은 반드시 새로운 방법으로 수정해야 한다.

public User getUser(int id) {
  Connection connection = connectionFactory.getConnection();
  try {
    Statement stmt = connection.createStatement();
    ResultSet rs = stmt.executeQuery("SELECT * FROM user WHERE id=" + id);
    if(rs.next())
    {
      return extractUserFromResultSet(rs);
    }
  } catch (SQLException ex) {
    ex.printStackTrace();
  }
  return null;
}
로그인 방법
로그인 동작이 유사하다.우리는 매개 변수 목록과 조회 문장에 영향을 주지 않는 사용자 및 암호 대체 ID를 제공하기를 원합니다.만약 사용자 이름과 비밀번호가 정확하다면, 이 방법은 유효한 사용자를 되돌려줍니다. 그렇지 않으면null입니다.많은 매개 변수가 있기 때문에 PreparedStatement를 사용하면 더욱 유용합니다.

public User getUserByUserNameAndPassword(String user, String pass) {
  Connector connector = new Connector();
  Connection connection = connector.getConnection();
  try {
    PreparedStatement ps = connection.prepareStatement("SELECT * FROM user WHERE user=? AND pass=?");
    ps.setString(1, user);
    ps.setString(2, pass);
    ResultSet rs = ps.executeQuery();
    if(rs.next())
    {
  return extractUserFromResultSet(rs);
    }
  } catch (SQLException ex) {
    ex.printStackTrace();
  }
  return null;
}
모든 사용자를 조회하는 방법
이 방법은 모든 사용자를 되돌려주기 때문에, 우리는 그것들을 유사한 그룹의 용기에 저장해서 되돌려야 한다.하지만 우리는 몇 개의 기록이 있는지 모르기 때문이다.Set 또는 List와 같은 컬렉션을 사용하는 것이 좋습니다.

public Set getAllUsers() {
  Connector connector = new Connector();
  Connection connection = connector.getConnection();
  try {
    Statement stmt = connection.createStatement();
    ResultSet rs = stmt.executeQuery("SELECT * FROM user");
    Set users = new HashSet();
    while(rs.next())
    {
      User user = extractUserFromResultSet(rs);
      users.add(user);
    }
    return users;
  } catch (SQLException ex) {
    ex.printStackTrace();
  }
  return null;
}
 

삽입 방법
Insert 메서드는 사용자를 매개 변수로 하고 PreparedStatement 객체를 사용하여 SQL update 문을 실행합니다.executeUpdate 메서드는 영향을 받는 행 수를 반환합니다.만약 우리가 단행을 추가한다면, 이 방법은 1을 되돌려야 한다는 것을 의미하고, 만약 그렇다면, 우리는true를 되돌려야 한다. 그렇지 않으면, 우리는false를 되돌려야 한다.

public boolean insertUser(User user) {
  Connector connector = new Connector();
  Connection connection = connector.getConnection();
  try {
    PreparedStatement ps = connection.prepareStatement("INSERT INTO user VALUES (NULL, ?, ?, ?)");
    ps.setString(1, user.getName());
    ps.setString(2, user.getPass());
    ps.setInt(3, user.getAge());
    int i = ps.executeUpdate();
   if(i == 1) {
    return true;
   }
  } catch (SQLException ex) {
    ex.printStackTrace();
  }
  return false;
}
 

업데이트 방법
업데이트 방법은 삽입 방법과 유사합니다.유일하게 바뀐 것은 SQL 문장이다

public boolean updateUser(User user) {
  Connector connector = new Connector();
  Connection connection = connector.getConnection();
  try {
    PreparedStatement ps = connection.prepareStatement("UPDATE user SET name=?, pass=?, age=? WHERE id=?");
    ps.setString(1, user.getName());
    ps.setString(2, user.getPass());
    ps.setInt(3, user.getAge());
    ps.setInt(4, user.getId());
    int i = ps.executeUpdate();
   if(i == 1) {
  return true;
   }
  } catch (SQLException ex) {
    ex.printStackTrace();
  }
  return false;
}
 

삭제 방법
삭제 방법은 간단한 조회상을 사용하는 것이다
DELETE FROM user WHERE ID = 7
id 파라미터를 가지고 이 조회를 보내면 이 기록을 삭제합니다.삭제하면 1 반환

public boolean deleteUser(int id) {
  Connector connector = new Connector();
  Connection connection = connector.getConnection();
  try {
    Statement stmt = connection.createStatement();
    int i = stmt.executeUpdate("DELETE FROM user WHERE id=" + id);
   if(i == 1) {
  return true;
   }
  } catch (SQLException ex) {
    ex.printStackTrace();
  }
  return false;
}

읽어주셔서 감사합니다. 여러분에게 도움이 되었으면 좋겠습니다. 본 사이트에 대한 지지에 감사드립니다!

좋은 웹페이지 즐겨찾기