Statement
Statement란 실제 데이터베이스에 SQL문을 보내기 위해 필요한 객체이다. 삽입, 수정, 삭제 제, 검색을 처리하는 DML문을 사용할 때는 이 인터페이스를 사용한다. 이 객체는 Connection 객체의 연결 정보를 가져와서 DB에 접근하므로 이 객체를 사용하기 위해서는 접속 상태인 Connection 객체가 먼저 존재해야 한다. Statement 객체에서 자주 사용되는 메소드는 다음 표와 같다.
executeQuery() 메소드의 경우는 SELECT문을 실행할 때 사용되는데 이 메소드는 ResultSet객체를 반환한다. ResultSet 객체는 SELECT 문을 이용하여 테이블로부터 얻어온 데이터(레코드)를 담고 있는 객체라고 할 수 있는데 executeUpdate() 메소드는 삽입,수정,삭제와 관련된 SQL문 실행에 사용되며 수정된 레코드 수를 반환한다. 만약 두 개의 레코드를 삽입하게 되면 executeQueryUpdate() 메소드는 2를 반환하게 된다. 이렇게 반환하는 값으로 모든 레코드가 정상적으로 등록되었는지도 확일할 수 있다.
그리고 자주 사용된다기보다는 필수적으로 사용해야하는 메소드 중 close()메소드가 있다. 이 메소드는 Statement 객체를 모두 사용한 후 메모리에 반환하기 위해 사용된다. 객체를 사용하지 않을 때 반환해주면 메모리가 낭비되는 것을 막을 수 있다.
PreparedStatement
PreparedStatement 객체가 하는 일은 Statement객체와 비슷하다. PreparedStatement 인어페이스가 Statement 인터페이스를 상속받기 때문이다. Statement와 같이 레코드 조작 및 검색 쿼리를 위한 SQL문을 전달하기 위해 쓰인다. 하지만 PreparedStatement를 이용하게 되면 값 매핑 기능을 사용해서 Statement 인터페이스보다 편리하게 SQL문을 전송할 수 있다.
만약 100개 이상의 레코드를 추가하게 된다면 소스 코드 또한 방대하게 늘어나게 될 것이다. 이때 PreparedStatement 객체를 이용한다면 단 한 줄의 SQL문으로 수많은 레코드를 추가할 수 있다. 또한 Statement 객체로 SQL문을 실행할 때는 SQL문을 실행할 때마다 컴파일 단계를 거치지만 PreparedStatement 객체를 사용하면 객체를 생성할 때만 단 한 번 구문 분석(컴파일)을 거치므로 반복적인 SQL 구문을 실행할 때는 PreparedStatement가 훨씬 효율이 좋다.
//여기서부터 PreparedStatement 예제 작성
INSERT INTO
INSERT INTO 문은 테이블에 새 레코드를 삽입하는데 사용된다.
두가지 방법으로 INSERT INTO 문을 작성할 수 있는데.
첫번째 방법으로 삽입 할 열 이름과 값을 모두 지정해주는 것이다.
INSERT INTO table_name ( column1, column2, column3, ...)
VALUES (value1, value2, value3, ...)
표의 모든 열에 값을 추가하는 경우 SQL 조회에서 열 이름을 지정할 필요가 없다. 그러나 값의 순서가 테이블의 열과 동일한 순서인지 확인해 볼 필요가 있다. 다음은 그에 해당하는 예 다.
INSERT INTO table_name VALUES (value1, value2, value3 ...);
예제를 보도록하자.
이런 컬럼에 테이블이 있다.
이곳에 INSERT 문을 사용해서 데이터를 넣어보자.
이러한 쿼리문이다.
실행을 시켜보자 !
뭔가 실행이 된듯한데 테이블로 직접 확인을 해보자.
입력한 정보가 정확히 들어갔다.
이것으로 INSERT INTO 문의 설명을 마친다.
여기 blog_tb 라는 테이블이 있다.
이번 자료에서는 테이블을 삭제해보도록 하겠다.
하지만 우선 주의사항이 있는데.
테이블을 DROP 으로 삭제한다면 테이블은 삭제되고 내부에 존재하는 모든 데이터는 복구가 불가능하다.
DROP TABLE 테이블이름;
을 쿼리문으로 실행하면 테이블이름에 해당하는 테이블은 삭제된다.
쿼리문을 작성하고 이제 실행해보자!
결과 창에 뭔가 실행된 것을 볼 수 있다.
테이블의 삭제 여부를 확인하기 위해 show tables; 쿼리문으로 blog_db내에 존재하는 table들을 출력해봤다. 아무것도 없다. 사라지고 없다 이제.
이상 DROP TABLE에 관한 설명이었다.
다시 말하지만 DROP TABLE을 사용할때는 다시한번 정말 삭제를 해도 될 테이블인지 확인, 또는 백업을 해놓은 상태에서 하는게 좋은 방법이다.
getElementsByClassName()
getElementsByClassName() 메소드는 지정된 클래스 이름을 가진 문서의 모든 요소를 NodeList 객체로 반환한다.
NodeList 객체는 노드 컬렉션을 나타낸다. 노드는 인덱스 번호로 액세스 할 수 있고, 인덱스 는 0에서 시작한다.
Tip : NodeList 객체의 length 속성을 사용하여 지정된 클래스 이름을 가진 요소의 수를 결정한 다음 모든 요소를 반복하고 원하는 정보를 추출 할 수 있다.
getElementsByClassName() 메소드는 웹킷 기반 브라우저에서 적용한 탐색 스크립트이다.
getElementById()의 경우 ID가 부여된 단 하나의 요소만을 탐색하지만, getElementsByClassName()메서드는 className이 부여된 요소(그룹)을 반환한다.
'Test'라고 이름 지어진 모든 클래스 엘리먼트를 가져옵니다.
document.getElementsByClassName('test');
'Red'와 'Test' 라고 이름 지어진 모든 클래스 엘리먼틀르 가져옵니다.
document.getElementsByClassName('red test');
ID엘리먼트가 'main'인 엘리먼트 안의 'Test'라고 이름 지어진 모든 클래스 엘리먼트를 가져온다.
document.getElementById('main').getElementsByClassName('Test');
document.getElementsClassName()은 IE에서 지원하지 않는다.
그러니 다들 크롬쓰세요 크롬이 짱이니까
getElementById() 메소드
getElementById() 함수는 지정된 값을 갖는 ID속성을 갖는 요소를 리턴한다.
이 메서드는 HTML DOM에서 가장 일반적인 메서드 중 하나이며 문서의 요소를 조작하거나 정보를 얻으려 할 때마다 거의 사용된다.
- 지정된 ID를 가진 어떤 요소가 존재하지 않는 경우 NULL을 반환한다.
- ID는 페이지 내에서 고유해야하며, 지정된 ID가 둘 이상의 요소가 있는 경우 getElementById() 메서드는 소스코드의 첫번째 요소를 반환한다.
getElementById() 메소드 사용방법
element = document.getElementById(id);
id : 접근하거나 조작하고자 원하는 요소의 id를 입력
getElementById() 정리
-기본형태
Element getElementById(String elementId);
-전달인자
elementId : 원하는 엘리먼트의 id 어트리뷰트 값.
- 반환값
지정된 id 어트리뷰트를 가진 문서 엘리먼트를 나타내는 Element 노드
해당하는 엘리먼트를 찾지못하면 null을 반환.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<script>
function getValue(){
let x = document.getElementById("myValue");
alert(x.innerHTML);
}
</script>
</head>
<body>
<h1 id="myValue" onclick="getValue()">Click Here!!</h1>
</body>
</html>
| cs |
예제 소스이다.
테이블 생성
create table [테이블명](id int,name varchar(20));
컬럼 추가
alter table [테이블명] add [컬럼명] [타입] [옵션];
ex) alter table [테이블명] add [컬럼명] varchar(100) not null default '0';
컬럼 삭제
alter table [테이블명] drop [컬럼명];
컬럼명 변경 및 타입 변경
alter table [테이블명] change [컬럼명] [변경할컬럼명] varchar(12);
컬럼 타입 수정
alter table [테이블명] modify [컬럼명] varchar(14);
테이블명 수정
alter table [테이블명] rename [변경할테이블명];
테이블 삭제
drop table [테이블명];
데이터 유형 다음에 각 열에 대해 다른 선택적 속성을 지정할 수 있다.
- NOT NULL - 각 행에는 해당 열의 값이 있어야하며 null 값은 허용되지 않습니다.
- DEFAULT 값 - 다른 값이 전달되지 않을 때 추가되는 기본값을 설정합니다.
- UNSIGNED - 숫자 형식에 사용되며 저장된 데이터를 양수 및 0으로 제한합니다.
- AUTO INCREMENT - MySQL은 새로운 레코드가 추가 될 때마다 필드의 값을 1 씩 자동으로 증가시킵니다
- PRIMARY KEY - 테이블의 행을 고유하게 식별하는 데 사용됩니다. PRIMARY KEY 설정이있는 열은 종종 ID 번호이며 AUTO_INCREMENT와 함께 사용됩니다.
- DriverManager Class
DriverManager 클래스는 데이터 원본에 JDBC드라이버를 사용해서 JSP에서 사용할 수 있는 커넥션을 만드는 역할을 한다. DriverManager는 Class.forName() 메소드를 사용해서 생성되며, 이 메소드는 Interface driver를 구현하는 작업을 수행한다.
Class.forName("com.mysql.jdbc.Driver") 메소드의 매개 변수로 "com.mysql.jdbc.Driver"와 같은 특정 드라이버 클래스를 지정하면 자동으로 로딩되어 객체가 생성되고 DriverManager에 등록된다. 드라이버 클래스를 찾지 못할 경우, forName() 메소드는 ClassNotFoundException 예외를 발생시키므로 반드시 예외처리를 해야한다.
// 예외 처리하는 방법 - ClassNotFoundException 사용
try {
Class.forName("com.mysql.jdbc.Driver");
}catch(ClassNotFoundException e){}
// 또는 Exception 사용
try{
Class.forName("com.mysql.jdbc.Driver");
}catch("Exception e){}
일반적으로 드라이버 클래스들은 로드될 때 자신의 객체를 생성하고, 자동적으로 DriverManager 클래스의 메소드를 호출하여 그 객체를 등록한다.
DriverManager 클래스의 모든 메소드는 static이기 때문에 반드시 객체를 생성시킬 필요가없다. DriverManager 클래스는 Connection 인터페이스를 구현하는 객체를 생성할 때 getConnection() 메소드를 사용한다. getConnection() 메소드 사용시 SQLException 예외를 발생시키므로 반드시 예외 처리를 해야 한다.
try{
Connection conn = DriverManager.getConnection(url,user,pass);
}catch(SQLException e){}
getConnection(url,user,pass) 메소드는 수행 결과로 데이터베이스와 JSP가 연동할 수 Connection 객체를 리턴한다. 이 메소드의 첫 번재 매개 변수 URL은 jdbc:subprotocol:subname과 같은 형태를 갖는 데이터베이스 URL을 기술한다. user는 데이터베이스에 접근할 수 있는 계정명이고 pass는 계정의 패스워드를 말한다.
MySQL의 경우 getConnection("jdbc:mysql://localhost:3306/bascijsp","jspid","jsppass");와 같은 형태를 갖고, 오라클의 경우 DriverManager.getConnection("jdbc:orcle:thin:@localhost:1521:orcl","scott","tiger"); 와 같은 형태를 갖는다.
프로그램을 순서대로 작성시 Class.forName() 메소드 다음에 DriverManager.getConnection() 메소드를 기술한다. 그런데 이들 메소드가 발생시키는 예외가 다르기 때문이에 예외를 각각 기술해서 프로그래밍하면 다음과 같다.
try{
Class.forName("com.mysql.jdbc.Driver");
}catch(ClassNotFoundException e){}
try{
Connection conn = DriverManager.getConnection(
"jdbc:mysql://loaclhost:3306/basicjsp","jspid","jsppass");
}catch(SQLException e){}
혹시 각각 예외를 기술하는 것이 번거로운 경우 모든 예외를 처리할 수 있는 Exception을 사용해서 한 번에 처리할 수 있다.
try{
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/basicjsp","jspid","jsppass");
}catch(Exception e){}