1)JDBC
1-1) jar파일 이클립스에연동
1-2) jdbc연결
1-3) JDBC사용해보기
1-4) JDBC 사용 객체와 작동방식
1-4)JDBC사용 예제
1-5) PreparedStatement
1-6)DB연결부분 develop
1-7)MetaData
1-8)execute
1-9) 예제
2) 내가만든 총 예제
1) @@ JDBC @@
1) 정의
- Java Database Connectivity
- 자바에서 데이터베이스에 연결하여, 데이터를 조회하거나 수정할 수 있도록 돕는 API
- 자바 애플리케이션과 데이터베이스 간의 통신을 가능하게 함

2) 역할
- 데이터베이스 연결
- SQL 실행
- SQL 실행 결과 Java에서 처리
3) 설치
- Java와 MariaDB간의 호환성 확인
https://mariadb.com/kb/en/about-mariadb-connector-j/
About MariaDB Connector/J
LGPL-licensed MariaDB client library for Java applications.
mariadb.com
2.다음링크로 접속해
https://mvnrepository.com/artifact/org.mariadb.jdbc/mariadb-java-client/3.5.1
Maven Repository에서 적절한 버전의 MariaDB Java Client jar파일 다운로드


1-1 ) jar파일을 이클립스에 넣기
jar파일
1) 특징
- Java Archive의 약자
- 여러 개의 Java 클래스 파일, 리소스를 하나의 파일로 묶어둔 곳
2) 역할
- 배포 : 여러 개의 Java 파일을 하나로 묶어서 배포하기 쉽게 함
- 라이브러리 제공 : 다른 프로그램에서 사용할 수 있는 기능을 제공하는 라이브러리의 형태로 사용
이클립스
프로젝트생성(나는 jdbc라는 이름으로만듬)
다운받은 jar파일을 복사붙여넣기한 후
다음과같이 실행

우클릭 후 다음과같은경로로 들어가

add JARs 를 클릭 후 복사붙여넣기한 jar파일을 찾아서 넣어준 후 apply

다음과같이 바뀔거임

1-2) JDBC 연결
package jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/*
* JDBC : 자바애플리케이션과 DBMS를 연결하기위한도구
* 1.드라이버파일 연결 : classpath연결 : buildPath 메뉴이용
* 2.JDBC 관련패키지 : java.sql.*
* 3.드라이브클래스를 메모리에 road
* 4.dbms와 java를 연결해 객체생성
*/
public class JdbcEx1 {
public static void main(String[] args) throws ClassNotFoundException , SQLException{
//3 Class.forName(문자열) : 문자열에해당하는 클래스찾아서 클래스파일을 메모리에 로드
// mariadb : org.mariadb.jdbc.Driver
// oracle : oracle.jdbc.driver.OracleDriver
Class.forName("org.mariadb.jdbc.Driver");
//4.conn : db와 연결객체
//localhost : IP주소
//3306 : port번호 (maria , my sql : 3306)
Connection conn = DriverManager.getConnection
("jdbc:mariadb://localhost:3306/gdjdb","gduser","1234");
//나의DB명 , 사용자명 , 비번
System.out.println("jdbc 연결완료");
다음코드로 jdbc를 연결해준다(대소문자주의)
window -> show view -> other->Data Management -> Datasource Explorer

이와같은 폴더들이 뜰것임 Database connections 우클릭 -> new 클릭을 한다면
저렇게 DB고르는 화면이 나올것임 우리는 mariaDB를 사용하고있으므로
mySQL 클릭하자

저 버튼 클릭

JAR List 선택 후
있는 파일을 remove

add JAR을 누르고
아까 다운받은 jar파일을 넣어주자

다 됐다면 Properties 를 누른 후 다음과같이 설정해주자
(나의DB에맞게설정)


ok 누른 후 test Connection을 클릭해서 Succeded!가 뜨면 완료

finish클릭 하면 밑에 사진과같이 나의DB가 들어올것임

1-3 ) JDBC 사용해보기
패키지에 new -> file을 해서
sql확장자를 가진 파일하나를 생성해준 후
다음과같이 설정해준다.


다음과같이 Execute로 실행해야함

껐다키면 연결이해제될 가능성이 높아
Data Source Explorer에서 mysql을 Conncet 해줘야함

연결후에 자바로 SQL사용해보자
package jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class JdbcEx1 {
public static void main(String[] args) throws ClassNotFoundException , SQLException{
Class.forName("org.mariadb.jdbc.Driver");
Connection conn = DriverManager.getConnection
("jdbc:mariadb://localhost:3306/gdjdb","gduser","1234");
//나의DB명 , 사용자명 , 비번
System.out.println("jdbc 연결완료");
//이건 jdbc연결후에 실행하자
//Statement : SQL명령문을 DB에 전달위한 객체
Statement stmt = conn.createStatement();
//stmt.executeQuery("sql문") : sql문장 실행
// ResultSet : select구문의 결과를 저장하는 객체
ResultSet rs = stmt.executeQuery("select * from student");
while(rs.next()) { //레코드 하나씩 조회(모두읽을때까지)
//rs.getString("컬럼명") : 컬럼의값을 문자열로읽어와
System.out.print("학번 : "+rs.getString("studno"));
System.out.print(",이름 : "+rs.getString("name"));
System.out.print(",학년 : "+rs.getString("grade"));
System.out.println(",학과코드: "+rs.getString("major1"));
}
}
}
1-4) . JDBC 사용 객체와 작동방식
1) 흐름
- DriverManager로 데이터베이스 연결 설정
- Connection으로 데이터베이스 연결 유지(통로)
- Statement 또는 PreparedStatement로 데이터베이스에 SQL문 전달
- SQL 실행 결과를 ResultSet을 통해 가져옴
2) 주요 객체
1. DriverManager
- 역할 : JDBC 드라이버를 관리하고, 데이터베이스 연결 설정
- 주요 메소드 : getConnection(String url, String user, String password)
- 작동 방식 :
- 적절한 드라이버를 선택하여 데이터베이스 연결
- 연결 정보를 통해 Connection 객체 생성
2. Connection
- 역할 : 데이터베이스와 애플리케이션 간의 연결 유지
- 주요 메소드:
- createStatement(): SQL문 실행을 위한 Statement 객체 생성
- prepareStatement(String sql): SQL문이 미리 컴파일된 PreparedStatement 객체 생성
- close(): 연결 종료
- 작동 방식 :
- 데이터를 읽고 쓰는 모든 작업은 Connection을 통해 이루어짐
3. Statement
- 역할 : 데이터베이스에 SQL문 보냄
- 주요 메소드:
- executeQuery(String sql): SELECT문 실행
- executeUpdate(String sql): INSERT, UPDATE, DELETE문 실행
- 작동 방식 :
- SQL문을 문자열 매개변수로 전달
- 주로 정적인 쿼리에 사용
4. PreparedStatement
- 역할 : 데이터베이스에 SQL문 보냄
- 주요 메소드 :
- executeQuery(): SELECT문 실행
- executeUpdate(): INSERT, UPDATE, DELETE문 실행
- 특징 :
- 약속된 기호(?)를 사용하여 값 설정하기에 편함
- 동적인 쿼리에 주로 사용
5. ResultSet
- 역할 : SELECT문 실행 결과를 저장해서 가져옴
- 주요 메소드 :
- next(): 다음 행으로 이동
- getString(String columnLabel): 데이터 가져오기.
- 작동 방식 :
- 행 단위로 데이터를 읽어옴
- 커서를 통해 데이터에 순차적으로 접근

1-5) JDBC사용 예제
예제)
교수테이블에서 교수의번호,이름,id,입사일,급여 보너스,학과코드를 화면에출력하기
// 매번 연결객체를 적는것도 쉬운일이아니다 ( 메서드를 하나만들어버리자)
(이 메서드는 유저나 DB를 바꿀때마다 곤란해진다 밑에서 해결법을 다루겠다)
package jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DBConnection {
static Connection getConnection() throws ClassNotFoundException, SQLException {
Class.forName("org.mariadb.jdbc.Driver");
//DB와 연결객체
Connection conn = DriverManager.getConnection
("jdbc:mariadb://localhost:3306/gdjdb","gduser","1234");
return conn;
}
}
package jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
//교수테이블에서 교수의번호,이름,id,입사일,급여 보너스,학과코드를 화면에출력하기
public class Exam1 {
public static void main(String[] args) throws SQLException, ClassNotFoundException {
//만들어 놓은 클래스메서드활용하기
Connection conn = DBConnection.getConnection();
//SQL 명령문 DB에 전달하기위한객체
Statement st = conn.createStatement();
//select문 결과를 저장할 객체
ResultSet rs = st.executeQuery("select no,name,id,hiredate,salary,bonus,deptno from professor");
while(rs.next()) {
System.out.printf("교수번호 : "+rs.getString(1)); //이 번호는 스키마에있는번호가아님 (조호된 컬럼의 순서)
System.out.printf(",이름 : "+rs.getString(2));
System.out.printf(",id : "+rs.getString(3));
System.out.printf(",입사일 : "+rs.getString(4));
System.out.printf(",급여 : "+rs.getString(5));
System.out.printf(",보너스 : "+rs.getString(6));
System.out.println(",학과코드: "+rs.getString(7));
}
}
}

테이블생성 , 데이터삽입, 테이블삭제
package jdbc;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/*
* ResultSet executeQuery(sql) : select 구문 실행 시 호출 (db로부터 조회된레코드 return)
* int executeQuery(sql) : 실행 후 변경(추가,변경,삭제) 된 레코드의 갯수리턴
* create,drop,alter, insert , update , delete구문에서사용
*
*/
public class JdbcEx2 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
Connection conn = DBConnection.getConnection();
//SQL 명령문 DB에 전달하기위한객체
Statement st = conn.createStatement();
String sql = "create table jdbctest (id int primary key , name varchar(100))";
int result = st.executeUpdate(sql);//jdbctest테이블 생성
System.out.println("1.결과 : "+result);//0(레코드의갯수가없음)
sql = "insert into jdbctest values(1,'홍길동')";
result = st.executeUpdate(sql);
System.out.println("2.결과 : "+result); //레코드1개추가했으므로 1
sql = "insert into jdbctest values(2,'김삿갓'),(3,'이몽룡')";
result = st.executeUpdate(sql);
System.out.println("3.결과 : "+result); //2개의 레코드변경
ResultSet rs = st.executeQuery("select * from jdbctest");
while(rs.next()) {
System.out.print(rs.getString(1));
System.out.println(rs.getString(2)); //어차피 컬럼이2개뿐이므로 1,2 출력하자
}
sql = "delete from jdbctest "; //where없으므로 모든레코드삭제
result = st.executeUpdate(sql);
System.out.println("4.결과 : "+result);
//jdbctest테이블삭제
sql = "drop table jdbctest";
result = st.executeUpdate(sql);
System.out.println("5.결과 : "+result);//0
}
}
1.결과 : 0
2.결과 : 1
3.결과 : 2
1홍길동
2김삿갓
3이몽룡
4.결과 : 3
5.결과 : 0
예제)
* dept테이블을 이용해 서울지역레코드만 dept_seoul테이블로 생성하기
*
* dept_seoul테이블에
* deptno : 60 , dname : 특수영업부 , loc :서울레코드추가
*
* dept_seoul테이블에
* deptno:60 레코드의 dname : 특수영업1부로 수정하기
* dept_seoul 테이블의 모든컬럼의내용 화면에출력
package jdbc;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Exam2 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
Connection conn = DBConnection.getConnection();
Statement st = conn.createStatement();
String sql = "create table dept_seoul select * from dept where loc='서울'";
int result = st.executeUpdate(sql);
System.out.println(result);
sql = "insert into dept_seoul values(60,'특수영업부','서울')";
result= st.executeUpdate(sql);
System.out.println(result);
sql = "update dept_seoul set dname='특수영업1부' where deptno=60";
result= st.executeUpdate(sql);
System.out.println(result);
ResultSet rs = st.executeQuery("select * from dept_seoul");
while(rs.next()) {
System.out.print("deptno : "+rs.getString(1));
System.out.print(",dname : "+rs.getString(2));
System.out.println(",loc : "+rs.getString(3));
}
sql = "drop table dept_seoul";
result= st.executeUpdate(sql);
System.out.println(result);
}
}
4
1
1
deptno : 10,dname : 대표이사,loc : 서울
deptno : 20,dname : 기획부,loc : 서울
deptno : 30,dname : 기술부,loc : 서울
deptno : 40,dname : 영업부,loc : 서울
deptno : 60,dname : 특수영업1부,loc : 서울
0
1-5) PreparedStatement
Statemenet 보다 PreparedStatement 사용을 권장!
역할 : 데이터베이스에 SQL문 보냄
주요 메소드 :executeQuery(): SELECT문 실행
executeUpdate(): INSERT, UPDATE, DELETE문 실행특징
:약속된 기호(?)를 사용하여 값 설정하기에 편함
동적인 쿼리에 주로 사용
* Statement의 하위 인터페이스
* SetInt(순서,값) : 자료형인식
package jdbc;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;
public class JdbcEx3 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
Connection con = DBConnection.getConnection();
PreparedStatement pstmt = con.prepareStatement
("select * from student where grade=?");
//DB에 SQL문장을 먼저 전달
Scanner scan = new Scanner(System.in);
System.out.print("학년을 입력하세요");
int grade = scan.nextInt();
pstmt.setInt(1, grade);
//1:?의순서 (첫번쨰 ?) , grade:?에 치환 될 값
ResultSet rs = pstmt.executeQuery();
while(rs.next()) {
System.out.printf("학번:%7s,이름:%-5s,학년:%3d,키:%5.2f,몸무게:%5.2f,학과코드:%-5s\n",
rs.getString("studno"),
rs.getString("name"),
rs.getInt("grade"),
rs.getDouble("height"),
rs.getDouble("weight"),
rs.getString("major1"));
}
}
}

insert에서의 사용
package jdbc;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class JdbcEx4 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
Connection conn = DBConnection.getConnection();
String sql = "create table login "
+ "(id varchar(10) primary key , password varchar(10))";
PreparedStatement ps = conn.prepareStatement(sql);//create table 실행
int result = ps.executeUpdate();//레코드의변경갯수반환
System.out.println("loginTable create : "+result);//0
//데이터추가1
sql = "insert into login(id,password) values (?,?)";
ps = conn.prepareStatement(sql); //sql문장 db에전달
ps.setString(1, "hongkd");//1번쨰?의값
ps.setString(2, "1234");//2번쨰?의값
result = ps.executeUpdate();//보낸거를 실행 후 레코드의변경갯수 반환
System.out.println("hongkd insert : "+result);
//데이터추가2(다시 db에 sql을 보낼필요가없음)
ps.setString(1, "dong");//1번쨰?의값
ps.setString(2, "1532");//2번쨰?의값
result = ps.executeUpdate();//보낸거를 실행 후 레코드의변경갯수 반환
System.out.println("dong insert : "+result);
//테이블조회
sql ="select * from login order by password";
ps = conn.prepareStatement(sql);//sql을 db에전달
ResultSet rs = ps.executeQuery();//select문(sql)의 결과를 저장
while(rs.next()) {
System.out.print(rs.getString(1));
System.out.println(","+rs.getString(2));
}
sql = "drop table login";
ps = conn.prepareStatement(sql);
result = ps.executeUpdate();
System.out.println("login table drop : "+result);
}
}

1-6) DB연결부분 변경
package jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DBConnection {
static Connection getConnection() throws ClassNotFoundException, SQLException {
Class.forName("org.mariadb.jdbc.Driver");
//DB와 연결객체
Connection conn = DriverManager.getConnection
("jdbc:mariadb://localhost:3306/gdjdb","gduser","1234");
return conn;
}
}
위 메서드를 사용하면 DB가 바뀌거나 , user가 바뀌거나한다면 모두바꿔야하고 컴파일도 다시해야하므로번거롭다
변경 후

다음과같이 jdbc.properties 라는 파일을 하나만들어준다
driver , url , user , password 4개로 나눠서 적어준다
↓ ↓ ↓ ↓
package jdbc;
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
/*
* 외부파일에서 DB관련 설정내용을 저장.
*/
public class DBConnection {
// 매번 연결객체를 적는것도 쉬운일이아니다 ( 메서드를 하나만들어버리자)
static Connection getConnection() throws ClassNotFoundException, SQLException, IOException {
/*
* Properties : Hashtable의 하위클래스 (key,객체)-->(String,String) 제네릭표현없음
* FileInputStream과 연동해 Properties 객체로 값을 저장
*/
Properties pro = new Properties();
FileInputStream fis = new FileInputStream("jdbc.properties");
pro.load(fis); //properties의 내용을 (key,value)값으로 저장해줌
Class.forName(pro.getProperty("driver"));//key=Driver의 value을 가져오란 소리.
//pro.put("driver","org.mariadb.jdbc.Driver")와 같음
//DB와 연결객체
Connection conn = DriverManager.getConnection
(pro.getProperty("url"),pro.getProperty("user"),pro.getProperty("password"));
return conn;
}
}
이 메서드에는 driver, url , user , password 이 존재하지않으며 이 파일은 건드리지않아도됨
(바꾸고싶다면 Properties 파일을 건드려)
1-7)MetaData 이용
rsmd : 결과데이터의 정보를 저장 객체 (ResultSetMetaData 객체)
ResultSetMetaData rsmd = rs.getMetaData();
조회된 컬럼의 수 , 컬럼 명 , 컬럼타입 조회
package jdbc;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
/*
* ResultSetMetaData : 조회된컬럼명,컬럼갯수 등의 정보저장객체
*/
public class JdbcEx5_MetaData {
public static void main(String[] args) throws ClassNotFoundException, SQLException, IOException {
String sql = "select * from student";
Connection conn = DBConnection.getConnection();
PreparedStatement ps = conn.prepareStatement(sql);
//rs : DB에서전달해준 데이터정보(ResultSet객체)
ResultSet rs = ps.executeQuery();
//MetaData사용
//rsmd : 결과데이터의 정보를 저장 객체 (ResultSetMetaData 객체)
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();
//조회된 컬럼의 갯수(java는 db의스키마를알수없음 db가전달해준 컬럼의갯수)
System.out.println("조회된 컬럼 수 : "+columnCount);//12
System.out.printf("%-10s","컬럼명");
System.out.printf("%-10s","컬럼타입");
System.out.printf("%-10s\n","Null 허용");
for (int i = 1; i <= columnCount; i++) {
System.out.printf("%-10s",rsmd.getColumnName(i));//i번쨰로조회된 컬럼의이름
System.out.printf("%s(%d)\t",rsmd.getColumnTypeName(i),rsmd.getPrecision(i));
System.out.printf("%-10s\n",(rsmd.isNullable(i)==0)?"NOT NULL":"NULL");
}
}
}

MetaData를 이용한 예제
package jdbc;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
/*
* 학생의학번 이름 학년 학과코드 학과명 지도교수 이름을 출력해보자
* 출력시 Header에 컬럼도 출력하기
*/
public class Exam3 {
public static void main(String[] args) throws ClassNotFoundException, SQLException, IOException {
Connection conn = DBConnection.getConnection();
String sql = "select s.name,s.grade,s.studno,m.name ,p.name "
+ "from student s join professor p join major m "//항상 줄을 바꿀때는 한칸씩 띄워주지
+ "on s.profno = p.no and s.major1=m.code";
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
ResultSetMetaData rsmd = ps.getMetaData();
for (int i = 1; i <= rsmd.getColumnCount(); i++) {
System.out.printf("%-15s",rsmd.getColumnName(i));
}
System.out.println();
while(rs.next()) {
System.out.printf("%-15s",rs.getString("s.name"));//1
System.out.printf("%-15d",rs.getInt("s.grade"));//2
System.out.printf("%-12d",rs.getInt("s.studno"));//3
System.out.printf("%-10s\t",rs.getString("m.name"));//4
System.out.printf("%8s\n",rs.getString("p.name"));//5
}
}
}
java는 DB스키마의정보를 알지못한다
MetaDate로 컬럼을 조회해 컬럼명을 알아내서 다음과같이 정렬하자!

1-8) execute
* ResultSet executeQuery() : select 문장 실행
* int executeupdate() : select 문장 이외의 구문 실행(craete , insert , drop ,,,,,)
* bollean execute() : 모든 sql문장 사용가능
true : 실행된구문이 select
false : 실행구문이 select가 아닌경우
package jdbc;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
public class JdbcEx6_execute {
public static void main(String[] args) throws ClassNotFoundException, SQLException, IOException {
String sql = "select * from student";
Connection conn = DBConnection.getConnection();
PreparedStatement ps = conn.prepareStatement(sql);
if(ps.execute()) {//select구문인경우 : true리턴
ResultSet rs = ps.getResultSet();//ResultSet을 반환
ResultSetMetaData rsmd = rs.getMetaData();
for (int i = 1; i <= rsmd.getColumnCount(); i++) {
System.out.printf("%-10s",rsmd.getColumnName(i));
}
System.out.println();
while(rs.next()) {
for (int i = 1; i <= rsmd.getColumnCount(); i++) {
System.out.printf("%-10s",rs.getString(i));
}
System.out.println();
}
}
else {//select구문 이외의 sql문장
System.out.println("변경된 레코드 건수 : "+ps.getUpdateCount());
}
}
}
"select * from student" 조회 시 출력

String sql = "insert into test3 values(10,'동곤',now())"; 실행 시

조회

1-9) 예제

간략하게 코드소개
DBConnection클래스의 클래스멤버인 getConnection()을 사용해
DB에 접근한다 (Drivermanager Connection , Class.forName 등이있음)
Connection 객체 conn 반환
Scanner 를이용해 nextLine()으로 sql 문을 입력받음
prepareStatement(sql)로 Sql을 DB에 전달해줌
그 후 excute() 를 이용해 true면 select문 처리
false 면 그 외의 문장처리
select 의 경우 :
metaData() 함수를 이용해 ResultSetMetaData반환
(조회된컬럼의 수 , 컬럼명 등을 조회가능)
getColumnCount() : 조회된컬럼수
getColumnName(i) : i번쨰로조회된 컬럼명
getResultSet()를 이용해 ResultSet 객체rs반환해
레코드를 출력할 수 있게해줌
(executeQuery()를 사용한다고생각하자)
rs.getString() 사용
rs.last() : 마지막행으로이동
rs.first() : 첫번째행으로이동
rs.beforefirst() :첫번째행 이전으로이동
그외의경우
getUpdateCount() 로 변경된 레코드의수를 반환
executeUpdate() 와 같다고 생각하면 될것같음!
package jdbc;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.Scanner;
public class Test {
static Connection conn() throws ClassNotFoundException, SQLException, IOException {
Connection cc = DBConnection.getConnection();
return cc;
}
public static void main(String[] args) throws ClassNotFoundException, SQLException, IOException {
Scanner scan = new Scanner(System.in);
while(true) {
try {
int count=0;
System.out.print("쿼리를 입력하세요 : ");
String sql = scan.nextLine();
if(sql.contains("exit")) {
System.out.println("종료");
return;
}
PreparedStatement ps = conn().prepareStatement(sql);//sql을 DB에전달
if(ps.execute()) {//select문이면 true
startSelect(ps, sql);
}
else {
int updateCount = ps.getUpdateCount();
System.out.println("변경된 레코드의 수 : "+updateCount);
}
}
catch(Exception e) {
System.out.println("잘못된 형식");
System.out.println(e.getMessage());
continue;
}
}
}
}
select부분을 처리해주는 메서드 startSelect
static void startSelect(PreparedStatement ps , String sql) throws SQLException, ClassNotFoundException, IOException {
PreparedStatement countp = conn().prepareStatement("select count(*) from("+sql+")b ");
ResultSet crs= countp.executeQuery();
while(crs.next()) {
System.out.println("조회된 레코드의 수 : "+crs.getInt(1));
}//레코드 갯수 구하는법1
ResultSetMetaData psmd = ps.getMetaData();
ResultSet rs = ps.getResultSet();
/*
레코드의 갯수 구하는법2
rs.last();//rs를 마지막행으로 이동
int row = rs.getRow();//row(행)의 길이반환
System.out.println("조회된 레코드의 수 : "+row);
rs.beforeFirst();//첫번째 행 이전으로 돌아감
//첫번째행으로 돌아가면 rs.next()를 만나면 2번째행부터실행됨!!!!(주의)*/
for (int i = 1; i <= psmd.getColumnCount(); i++) {
System.out.printf("%-10s",psmd.getColumnName(i));
//i번쨰로조회한 컬럼의 이름
}
System.out.println();
while(rs.next()) {
for (int i = 1; i <= psmd.getColumnCount(); i++) {
System.out.printf("%-10s",rs.getString(i));//i번쨰컬럼의 레코드
}System.out.println();
}
/*
레코드 갯수 구하는법3
System.out.println("레코드 수 "+count/psmd.getColumnCount()); */
//count를 컬럼1개당 ++를 해줬다
//레코드 수를 찾으려면 count를 컬럼의갯수(psmd.getColumnCount)로 나눠줘야함
}

2) 내가만든 총 예제
* dongtb 라는 테이블을 생성한다 ( name varchar(10) primary key , height int , weight int)
* 생성 이후에 이름 , 키 , 몸무게를 3번 넣는다 ( 이름 중복금지)
* 그 후 dongtb의 전체 테이블컬럼과함께 출력해본 후
* drop 한다 (실제DB가 어지럽혀지기때문)
package jdbc;
import java.io.IOException;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.Scanner;
public class MyEx {
public static void main(String[] args) throws ClassNotFoundException, SQLException, IOException {
Scanner scan = new Scanner(System.in);
Connection conn = DBConnection.getConnection();
String sql = "create table dongtb "
+ " (name varchar(10) primary key ,height int , weight int)";
PreparedStatement ps = conn.prepareStatement(sql);
int create = ps.executeUpdate();
System.out.println("create 성공");
//insert문
sql = "insert into dongtb values(?,?,?)";
PreparedStatement ps2 = conn.prepareStatement(sql);
for (int i = 0; i < 3; i++) {
try {
System.out.print("이름 : ");
String name = scan.nextLine();
System.out.print("키 : ");
int height = scan.nextInt();
System.out.print("몸무게 : ");
int weight = scan.nextInt();
scan.nextLine();
//\n을 지우기위한 수단 ( nextInt는 \n이사라지지않아 nextLine에 \n문자가 입력되버림
ps2.setString(1, name);
ps2.setInt(2, height);
ps2.setInt(3, weight);
ps2.executeUpdate(); // DB에 insert문 보내기
}
catch(Exception e) {
System.out.println("오류 : "+e.getMessage());
sql = "drop table dongtb";
PreparedStatement ps4 = conn.prepareStatement(sql);
ps4.executeUpdate(); //오류발생시 테이블 drop후 종료
break;
}
}
//select
sql = "select * from dongtb";
PreparedStatement ps3 = conn.prepareStatement(sql);
ResultSetMetaData metaData = ps3.getMetaData();
for (int i = 1; i <= metaData.getColumnCount(); i++) {
//metaDate를 이용해 조회된 컬럼의 수 만큼 루프를돌린다
System.out.printf("%-10s",metaData.getColumnName(i));
//i번째 조회된 컬럼의 이름출력
}System.out.println();
ResultSet rs = ps3.executeQuery();//select을 저장해주는 메서드
while(rs.next()) {
System.out.printf("%-10s",rs.getString("name"));
System.out.printf("%-10d",rs.getInt("height"));
System.out.printf("%-10d\n",rs.getInt("weight"));
}
//drop
sql = "drop table dongtb";
PreparedStatement ps4 = conn.prepareStatement(sql);
int drop = ps4.executeUpdate();
System.out.println("drop 성공");
}
}

'부트캠프(DB)' 카테고리의 다른 글
부트캠프 27일차 (DDL,DML,VIEW,사용자관리) (0) | 2025.03.11 |
---|---|
부트캠프 26일차(서브쿼리 , DDL) (0) | 2025.03.10 |
부트캠프 25일차 (join (0) | 2025.03.07 |
부트캠프24일차 ( 조건함수 , 그룹함수) (1) | 2025.03.06 |
부트캠프23일차 (집합연산자 함수 날짜) (1) | 2025.03.05 |