[Backend] JDBC
20210311
- DML(insert, update, delete)
- selector
- jdbc
Table
SQL(structed Query Language)
- Database 에 있는 정보를 사용할 수 있도록 지원하는 언어
- 모든 DBMS에서 사용 가능
대소문자는 구분하지 않음
table 생성
회원의 정보를 저장할 수 있는 member라는 이름의 테이블을 생성해보자.
스키마 : 데이터베이스의 테이블에 저장될 데이터의 구조와 형식을 정의
table 생성2
- ER Diagram(ERD)
- 개체타입과 관계타입을 기본 개념으로 현실세계를 개념적으로 표현는 법.
table 생성3
- 회원 정보를 저장할 수 있는 member라는 이름의 테이블을 생성
스키마 참조해 테이블 생성하는 sql 작성
DML(insert, update, delete)
Data manupulation
insert
- update
- delete
Select
기본 select
JDBC
JDBC (JAVA DataBase Connectivity)란?
자바 프로그래밍 언어로 만들어진 클래스와 인터페이스로 이뤄진 API로서 ANSI slq(1999)를 지원
sql 문을 실행할 수 있는 함수 호출 인터페이스이다
JDBC 특징
- DBMS 종류에 독립적인 자바 프로그래밍 가능
- 데이터베이스가 달라져도 동일한 API 를 사용하게 해준다.(드라이버 및 URL만 수정하면 가능)
- 자바가 가지는 플랫폼에 독립적이라는 특성과 DBMS 에 독립적인 특성
JDBC 기능
- 데이터베이스에 연결설정한다
- SQL 문장을 dBMS에 전송한다.
- SQL 문장 전송 후 결과를 처리할 수 있게 해준다.
JDBC 인터페이스
- Database를 만드는 업체에게 제공되는 인터페이스 -업체에게 제공되는 인터페이스를 각각의 dbms업체들이 구현
- 프로그래머에게 제공되는 인터페이스
JDBC API: java.sql package
connection(interface)
- 데이터베이스에 대한 하나의 세션을 표현한다.
세션은 하나의클라이언트가 서버에 요청하기 위해 연결을 맺은 상태를 의미
- DriverManager 클래스의 getConnection() 메서드를 이용하여 얻어올 수 있다.
- 디폴트로 setAutoCommit(true)로 설정된다.
- 개발자가 원하는 경우에 commit을 해주고싶거나 트랜잭션이 아주 중요한 부분에 있어서 Rollback처리를 하고자 하는 경우에는 setAutoCommit(false)로 연결설정한다 -단 이경우엔 sql 수행할 때 마다 명시적으로 commit을 호출해야 한다.
Statement(interface)
SQL 문장을 실행하고 그것에 대한 결과값을 가져오기 위해 사용
- public boolean execute(string sql) throws SQLException
특별히 sql 문을 구분하지 않고 dml, query,ddl등을 수행할 수 있다. 결과가 resultSet이면 true이고 결과가 DML이거나 특별한 결과가 없으면 false를 리턴한다.
- public ResultSet executeQuery(String sql) throws SQLException
select를 처리할 때 사용한다
- public int executeUpdate(String sql) throws SQLException
- 주로 DML 등의 SQL을 수행시 사용한다.
PreparedStatement(interface)
- 동일한 SQL 문장이 여러번 반복 수행시 사용하는 객체
- 대용량의 문자나 바이너리 타입의 데이트를 저장하기 위해서도 사용
- SQL 문장이 미리 컴파일 되어 PreparedStatement객체에 저장
- 여러번 반복수행시 clearParameters()메서드를 이용해 statement에 남겨진 값을 초기화 한다.
CallableStatement(interface)
데이터 베이스에 대해 실제 SQL문을 실행하는게 아니라 Stored Procedure를 호출한다.
Store Procedure란 연속되는 SQL 문으로 디비에 저장해두고 함수의 호출 처럼 사용한다.
데이터 베이스에 Stored Procedures를 만들어두고 자바에서 호출해 사용할 수 있다.
Stored Procedures 사용시 속도의 향상을 기대할 수 있고, 자바 코드에 SQL이 들어가지 않으므로 자바 코드가 SQL에 독립적이 된다.
ResultSet(interface)
- 쿼리에 대한 결과값 처리
- ResultSet객체의 커서는 처음 레코드 보다 바로 이전을 가리킨다.
- next()
- ResultSet객체의 커서를 이동
- getXXX(index or name) 메서드를 이용해 데이터를 얻을 수 있다.(getString, get int,…)
#### JDBC 프로그래밍 개발순서
- JDBC 드라이버 로딩
- DBMS 와 연결(Connection 생성)
- SQL 실행 준비(statement, preparedStatement생성)
- SQL 실행
- DML(insert, update, delete)
- Query(select)
- DBMS 연결 끊기
- JDBC 드라이버 로딩
- 데이터 베이스와의 접속을 오픈하기 위해 애플리케이션의 JVM 안으로 특정 드라이버 클래스를 적재
- class.forName(Driver ClassName);
- DBMS 와 연결(Connection 생성)
- DriverManager 클래스를 이용해 URL 형태로 주어진 디비에 대한 접속을 요청
- Conncection con = DriverManager.getConnection(URL<dbid,dbpassword);
- JDBC url은 드라이버 고유 방식으로 개별 데이터베이스를 식별.
- SQL 실행 준비(statement, preparedStatement생성)
- String sql = “insert, update, delete,select…”;
- Statement생성 -statement stmt = conn.createStatement();
- preparedStatement 생성 -preparedStatement pstmt = connprepareStatement(sql);
- SQL 실행
- DML -int cnt = stmt.executeUpdate(sql);
- select -ResultSet rs = stmt.executeQuery(sql);
PreparedStatement
- sql문의 치환변수 값 설정: pstmt.setXXX(index,val):
- DML -int cnt = pstmt.executeUpdate() ; -select -resultSet rs = pstmt.executeQuery();
- DBMS 연결 끊기
모든 작업 끝난 후엔 ResultSet, Statement(PreparedStatement), Conncection객체의 close() 메서 이용해 작업을 종료한다(연결한 역순으로 종료)
Connection은 상당한 Overhead를 가져온다. 따라서 최적화 된 상태를 유지 하기 위해서는 반드시 Connection을 닫아줘야 한다.
관계형 데이터 베이스
- 2차원의 배열형태 표에 저장하는 거
STOP propergation 이란?
ajax 보충
ajax는 최근 웹페이지 50프로 훨씬 넘어감. 옛날에는 웹 쓰면 폼 전송했는데 요새 웹 쓰면 자세히 보면 하나의 페이지에서 머물면서 동작하는걸 알게 됨(대표적인게 결제) 한 화면에서 동작하고 넘어가고 이게 대부분 다 ajax에서 어떻게 파싱해서 사용할 수 있는가!? 를 알아보자.
DOM으로 읽어들여서 탐색한다. DOM 객체 같은거 이런걸 편하게 쓰려면 제이쿼리에 넣어서 썻었다는 거. 이녀석 탐색하려고 찍어보니 쟤는
앞에 $ 해서 뭐 되어있는건 제이쿼리. 꺽쇠로 뭐라 되어있으면 DOM객체.
그리고 유효성 검사 each 이런거 벗어나는 거도 중요
function(idx,item){
//console.log(item);
if(item.id ===id && item.pass===pass){}
//login성공
console.log("로그인 성공"+item.name); //첫번째에서 성공하면 끝나야(두번째 else 까지 갈 필요가 업다.)
return; //
}else{}
}
/* type:"",
data:"",
여기서 리턴하면 콜백을리턴함. 우리가 벗어나야 할 건 반복문을 리턴해야 함.
promise 패턴은 나중에 배우게 됨 콜백헬이라던가 이런거.