이 튜토리얼의 목적은 Java로 작성된 별도의 레이어를 사용하여 데이터베이스에서 테이블에 액세스하는 것입니다. 이 레이어는 일반적으로 데이터 액세스 계층 (DAL)이라고합니다.
DAL을 사용하면 가장 큰 이점은 항상 링크를 수행 한 다음 일부 쿼리를 실행하는 대신 insert () 및 find ()와 같은 일부 메소드를 직접 사용하여 데이터베이스의 액세스 작업을 단순화한다는 것입니다.
이 계층은 모든 데이터베이스 관련 통화 및 그 안에 쿼리를 처리합니다.
데이터베이스를 만듭니다
우리는 사용자를위한 간단한 테이블을 만들고 싶습니다.이 필드를 사용하여 생성 할 수 있습니다.
이드 int
이름 바르 차 (200)
암호 바르 차 (200)
나이 int
데이터 전송 객체
이 레이어에는 DTO (Data Transfer 개체)라는 간단한 클래스가 포함되어야합니다. 이 클래스는 데이터베이스의 테이블에 해당하는 간단한 맵이며 테이블의 각 열은 클래스의 멤버 변수에 해당합니다.
우리의 목표는 SQL 문 및 기타 데이터베이스 관련 명령을 처리하지 않고 간단한 Java 객체를 사용하여 데이터베이스를 추가, 삭제, 수정 및 확인하는 것입니다.
테이블을 Java 코드에 매핑하려면 동일한 필드가 포함 된 클래스 (Bean) 만 만들면됩니다.
더 나은 캡슐화를 위해 생성자 외에도 모든 필드 변수를 비공개로 선언해야합니다. 그 중 하나는 기본 생성자입니다.
공개 클래스 사용자 {개인 정수 ID; 개인 문자열 이름; 개인 문자열 패스; 개인 정수 시대;}필드를 올바르게 매핑하려면 데이터베이스의 널 값을 고려해야합니다. int 유형과 같은 Java의 원래 기본값의 경우 기본값은 0이므로 NULL 값을 수용 할 수있는 새 데이터 유형을 제공해야합니다. Integer와 같은 특수 유형 - 캡슐화 클래스를 사용하여 Int를 대체 할 수 있습니다.
마지막으로 우리 수업은 다음과 같아야합니다.
공개 클래스 사용자 {개인 정수 ID; 개인 문자열 이름; 개인 문자열 패스; 개인 정수 시대; public user () {} public user (문자열 이름, 문자열 패스, 정수 연령) {this.name = name; this.pass = 패스; this.age = age; } 공개 사용자 (정수 ID, 문자열 이름, 문자열 패스, 정수 시대) {this.id = id; this.name = 이름; this.pass = 패스; this.age = age; } public integer getage () {return age; } public void setage (정수 시대) {this.age = age; } public Integer getId () {return id; } public void setId (정수 ID) {this.id = id; } public String getName () {return name; } public void setName (문자열 이름) {this.name = 이름; } public String getPass () {return Pass; } public void setpass (String Pass) {this.pass = pass; }}모범 사례는 기본 빈 생성자, 완전한 생성자 및 ID 매개 변수가없는 완전한 생성자를 제공하는 것입니다.
데이터베이스에 연결하십시오
중간 클래스를 사용하여 데이터베이스에 대한 연결을 용이하게 할 수 있습니다. 이 클래스에서는 데이터베이스 JDBC, URL, 사용자 이름 및 비밀번호와 같은 데이터베이스 연결 매개 변수를 제공하고 이러한 변수를 최종으로 정의합니다 (이 데이터를 속성 또는 XML 구성 파일에서 가져 오는 것이 좋습니다).
연결 객체를 반환하거나 연결이 실패하거나 런타임 예외를 던지면 NULL을 반환하는 메소드를 제공합니다.
public static final string url = "jdbc : mysql : // localhost : 3306/testdb"; public static final string user = "testuser"; public static final string pass = "testpass";/*** 연결 개체* @return connection object*/public static connection getConnection () {driverManager.registerDriver (새로운 드라이버 ()); Return DriverManager.getConnection (URL, USER, PASS); } catch (sqlexception ex) {throw new runtimeexception ( "데이터베이스에 연결하는 오류", 예); }}클래스에 연결을 테스트하기위한 주요 방법을 포함시킬 수도 있습니다. 전체 클래스는 다음과 같습니다.
import com.mysql.jdbc.driver; import java.sql.connection; import java.sql.drivermanager; import java.sql.sqlexception;/** * 데이터베이스에 연결 * @author hany.sad */public static final string url = "JDBC : mysql : // localhost : 3306/testdb"; public static final string user = "testuser"; 공개 정적 최종 문자열 Pass = "TestPass"; / ** * 데이터베이스에 연결됩니다 * @return Connection Object */ public static connection getConnection () {try {driverManager.registerDriver (new driver ()); Return DriverManager.getConnection (URL, USER, PASS); } catch (sqlexception ex) {throw new runtimeexception ( "데이터베이스에 연결하는 오류", 예); }} / ** * 테스트 연결 * / public static void main (String [] args) {Connection Connection = ConnectionFactory.getConnection (); }}데이터 액세스 객체
DAO 레이어는 CRUD 작업을 수행 할 수 있습니다. 테이블을 추가, 삭제, 수정 및 확인할 수 있습니다.
우리의 DAO 레이어 인터페이스는 다음과 같습니다.
공개 인터페이스 userDao {user getUser (); set <user> getAllUsers (); 사용자 getUserByUserNameAndPassword (); 부울 insertUser (); 부울 updateUser (); 부울 deleteuser ();}사용자를 찾으십시오
사용자는 ID, 이름 또는 이메일과 같은 고유 한 필드를 쿼리 할 수 있습니다. 이 예에서는 ID를 사용하여 사용자를 찾습니다. 첫 번째 단계는 커넥터 클래스를 통해 연결을 생성 한 다음 SELECT 문을 실행하여 ID 7을 사용하여 사용자에게 가져 오는 것입니다.이 문을 사용하여 사용자를 쿼리 할 수 있습니다.
사용자 중에서 id = 7을 선택하십시오
여기서 우리는 매개 변수에서 ID를 얻기 위해 동적 진술을합니다.
이 쿼리를 실행하면 사용자 또는 NULL이 저장되는 결과 세트가 얻어집니다. 다음 () resultset 메소드를 사용하여 값이 있는지 여부를 감지 할 수 있습니다. True가 반환되면 데이터 getters를 계속 사용하여 resultSet에서 사용자 데이터를 얻습니다. 모든 데이터를 사용자로 캡슐화하면 반환합니다. 이 ID를 가진 사용자가 존재하지 않거나 다른 예외가 발생하는 경우 (예 : 유효하지 않은 SQL 문)이 메소드는 NULL을 반환합니다.
공개 사용자 getUser (int id) {Connection Connection = ConnectionFactory.getConnection (); try {state stmt = connection.createstatement (); resultSet rs = stmt.executeQuery ( "select * 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")); 리턴 사용자; }} catch (sqlexception ex) {ex.printstacktrace (); } return null;}많은 방법으로 우리는 그것을 호출하기 때문에 결과 세트에서 데이터를 추출하기 위해 별도의 방법을 사용하는 것이 더 편리합니다.
이 새로운 방법은 sqlexception을 던질 것이며 한계를 위해서는 개인이어야합니다.
Private User ExtractUserFromresultset (resultSet rs)는 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")); 리턴 사용자;}위의 방법은 새로운 방법으로 수정해야합니다.
공개 사용자 getUser (int id) {Connection Connection = ConnectionFactory.getConnection (); try {state stmt = connection.createstatement (); resultSet rs = stmt.executeQuery ( "select * where id =" + id); if (rs.next ()) {return extractuserfromrosultset (rs); }} catch (sqlexception ex) {ex.printstacktrace (); } return null;}로그인 방법
로그인 작업은 비슷합니다. 매개 변수 목록 및 쿼리 문에 영향을 미치지 않는 사용자 및 비밀번호 대안 ID를 제공하려고합니다. 사용자 이름과 암호가 올바른 경우이 메소드는 유효한 사용자를 반환하고 그렇지 않으면 NULL을 반환합니다. 많은 매개 변수가 있기 때문에 준비된 상태를 사용하는 것이 더 유용합니다.
공개 사용자 getUserByUserNameAndPassword (문자열 사용자, 문자열 패스) {커넥터 커넥터 = new Connector (); 연결 연결 = Connector.getConnection (); try {preparedstatement ps = connection.preparestatement ( "user where user =? and pass =?"); ps.SetString (1, 사용자); ps.SetString (2, Pass); resultSet rs = ps.ExecuteQuery (); if (rs.next ()) {return extractuserfromrosultset (rs); }} catch (sqlexception ex) {ex.printstacktrace (); } return null;}모든 사용자를 쿼리하는 방법
이 방법은 모든 사용자를 반환하므로 배열과 같은 컨테이너로 반환해야합니다. 그러나 우리는 얼마나 많은 기록이 있는지 모르기 때문입니다. 세트 또는 목록과 같은 컬렉션을 사용하는 것이 좋습니다.
public set getAllUsers () {커넥터 커넥터 = new Connector (); 연결 연결 = Connector.getConnection (); try {state stmt = connection.createstatement (); resultet rs = stmt.executeQuery ( "select * from user"); set users = new Hashset (); while (rs.next ()) {user user = extractuserfromresultset (rs); user.add (사용자); } 반환 사용자; } catch (sqlexception ex) {ex.printstacktrace (); } return null;}메소드 삽입
삽입 메소드는 사용자를 매개 변수로 가져 가서 준비된 스테이트 객체를 사용하여 SQL 업데이트 문을 실행합니다. ExecuteUpdate 메소드는 영향을받는 행의 수를 반환합니다. 한 줄을 추가하면 메소드가 반환해야한다는 것을 의미합니다. 그렇다면 true를 반환합니다. 그렇지 않으면 False를 반환합니다.
public boolean insertUser (사용자 사용자) {커넥터 커넥터 = new Connector (); 연결 연결 = Connector.getConnection (); try {preparedstatement ps = connection.preparestatement ( "사용자 값 (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 (사용자 사용자) {커넥터 커넥터 = new Connector (); 연결 연결 = Connector.getConnection (); try {preparedstatement ps = connection.preparestatement ( "사용자 세트 이름 =?, 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;}방법을 삭제하십시오
삭제하는 방법은 간단한 쿼리를 사용하는 것입니다.
id = 7 인 사용자에서 삭제하십시오
ID 매개 변수로 쿼리를 보내면이 레코드가 삭제됩니다. 성공적으로 삭제하면 1이 반환됩니다
public boolean deleteuser (int id) {커넥터 커넥터 = new Connector (); 연결 연결 = Connector.getConnection (); try {state stmt = connection.createstatement (); int i = stmt.executeUpdate ( "id =" + id user에서 삭제); if (i == 1) {return true; }} catch (sqlexception ex) {ex.printstacktrace (); } return false;}읽어 주셔서 감사합니다. 도움이되기를 바랍니다. 이 사이트를 지원 해주셔서 감사합니다!