JDBC 프로그래밍 순서, SQL 쿼리문

별의개발자커비·2023년 3월 19일
0

Database

목록 보기
3/8
post-thumbnail

1. 프로그래밍 순서

0) trycatch문

1) 드라이버 로드

Class.forName("com.mysql.jdbc.Driver");
  • 드라이버 인터페이스를 구현한 클래스를 로딩
  • mysql, oracle 등 각 벤더사 마다 클래스 이름이 다르다.
  • mysql은 "com.mysql.jdbc.Driver"이며, 이는 외우는 것이 아니라 구글링하면 된다.
  • String url = "jdbc:mysql://localhost/dev";

2) 데이터베이스 연결

Connection conn =null; 			//연결을 맺어낼 객체
  • 드라이버 매니저에게 Connection 객체를 달라고 요청한다.
  • Connection을 얻기 위해 필요한 url 역시, 벤더사마다 다르다.
  • mysql은 "jdbc:mysql://localhost/사용할db이름" 이다.

3) statement 객체 만들기

PreparedStatement ps = null;	//명령을 선언할 객체

4) SQL문 처리명령

ResultSet rs = null; 			//결과값을 담아낼 객체

executeQuery
select 명령문에서 사용

  • 반환값 : ResultSet 클래스의 인스턴스로 반환

executeUpdate
insert, update, delete 명령문에서 사용

  • 반환값 : int

5) close문

2. 예제, 개선 버전

0. 기본 형태

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class Demo1 {

	public static void main(String[] args) {
		String url = "jdbc:mysql://localhost:3306/javadb";
		// mysql url로 검색하기

		// 주의! sql 클래스인 애로 가져와야함
		Connection conn = null;
		Statement stmt = null;
		ResultSet rs = null;
		try {
			// 1. jdbc 드라이버 로드
			Class.forName("com.mysql.cj.jdbc.Driver");
			System.out.println("데이터베이스 연결중...");

			// 2. 데이터베이스 연결
			conn = DriverManager.getConnection(url, "root", "admin1234");
			System.out.println("데이터베이스 연결성공...");

			String str = "insert into student(name,age,gender,grade,type) values('홍길동',12,0,1,1 )";
			// 3. statement 객체 만들기
			stmt = conn.createStatement();
			
			// 4. SQL문 처리명령
			int result = stmt.executeUpdate(str);
			if (result > 0)
				System.out.println("데이터 삽입 성공");
			else
				System.out.println("데이터 삽입 실패");

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			// 0. close문
			if (conn != null)
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
		}

	}

}

0. 개선 예제로 메소드화된 코드 모음 클래스 (DbConnect)

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;

public class DbConnect implements AutoCloseable {
	// 드라이버 로드
	private  final String URL = "jdbc:mysql://localhost:3306/javadb";
	private  final String ID = "javadb";
	private  final String PASSWORD = "admin1234";
	private  Connection conn ;
	

	public Connection getConn() {
		return conn ;
	}

	public DbConnect() {
		try {
			Class.forName("com.mysql.cj.jdbc.Driver");
			this.conn = DriverManager.getConnection(URL, ID, PASSWORD);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public Statement getStatement() throws Exception {
			return conn.createStatement();
	}
	
	public PreparedStatement getPrepare(String sql) throws Exception {
		return conn.prepareStatement(sql);
	}

	@Override
	public void close() throws Exception {
		System.out.println("자동 close 호출");
		conn.close();
	}
}
  • @Override: AutoCloseable 구현하고

  • 오버라이드 하면 수거도 깔끔!

  • 예외처리

  • 여기서? vs 아님 데모에서?

개선 방법들

1) 1. 드라이버 로드 + 2. 데이터베이스 연결 메소드
1-1) dbco 메소드로 만들기

public  Connection getConnection() throws Exception {
	Class.forName("com.mysql.cj.jdbc.Driver");
	conn = DriverManager.getConnection(URL, ID, PASSWORD);
	return conn;
	}

1-2) db 클래스의 생성자에 넣어서 객체로 가져오기

	public DbConnect() throws Exception {
		Class.forName("com.mysql.cj.jdbc.Driver");
		this.conn = DriverManager.getConnection(URL, ID, PASSWORD);
	}

2) 3. statement 객체
2-1) getStatement() 메소드로 만들어버리기

	conn = DriverManager.getConnection(url, "root", "admin1234");
	stmt = conn.createStatement();public Statement getStatement() throws Exception {
		return conn.createStatement();
	}

2-2) 3. statement 객체 만들기

  • getPrepare(sql) 메소드로 만들어버리기
	public PreparedStatement getPrepare(String sql) throws Exception {
		return conn.prepareStatement(sql);
	}

3) 4. SQL문 처리명령

  • ResultSet으로 담아버리기
	int result = stmt.executeUpdate(str);ResultSet rs =  stmt.executeQuery(sql);

4) ? 로 sql 입력 문장 받기

String sql = "update student set name = '동해산', age = 100 where id = 2";String sql = " update student  set name =  ? , age = ?  where id = 2";
        pstmt.setString(1, "동해산");
			pstmt.setInt(2, 50);
			pstmt.executeUpdate();
  • string 중에 첫번째인 name
  • int 중에 첫번째인
  • 둘 다 전체 중에서가 아니라 문자는 문자끼리, int는 int...

1. select 예제

Statement stmt = dbco.getStatement();
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class Select_1 {
	// 조회 기능 
	public static void main(String[] args) {
		
		String sql = "select * from student";
		
		try(
				// 1. 드라이버 로드 + 2. 데이터베이스 연결 메소드 -> dbco
				DbConnect dbco = new DbConnect();
				// 3. statement 객체 만들기
				Statement stmt = dbco.getStatement();
				// 4. SQL문 처리명령
				ResultSet rs =  stmt.executeQuery(sql);
				)
		{
			// 데이터 읽어오는 부분 ( 다음줄이 있을 때까지)
			while (rs.next()) {
				System.out.println(
						rs.getInt("id") + " " + rs.getString("name")
				+ " " + rs.getInt("age") + " " + rs.getInt("gender") 
				+ " " + rs.getInt("grade") + " " + rs.getInt("type")
						);
			}
			
			// 0. catch문
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

1) ResultSet.rs

rs.next();
  • 홍길동 하나의 로우를 가져옴.
  • 리턴타입은 불린인데: rs 자체가 데이터를 반환하는 게 아니라, rs가 넥스트하면서 먼저 나온 데이터 집합을 가리키는 것
  • 마지막에 아무것도 없으면 널 반환

2) try with resources

  • try with resources 구문으로 자동 리소스 close
  • 사용되는 리소스(try옆())는 autoclosable 인터페이스 구현해야
  • static 아니니 객체 생성해서 쓰긴 해야함.

3) rs.getint

  • 갖고오고 싶은 row의 컬럼명을 입력

2. insert

package day9_jdbc2;

import java.sql.PreparedStatement;
import java.sql.Statement;

public class Insert_2 {

	public static void main(String[] args) {
		String str = "  insert into student(name,age,gender,grade,type)";
		str += " values(?,?,?,?,1 ) ";

		try (
				DbConnect dbc = new DbConnect();
				PreparedStatement pstmt = dbc.getPrepare(str);
				)
		{
			pstmt.setString(1, "김밥");
			pstmt.setInt(2, 20);
			pstmt.setInt(3, 0);
			pstmt.setInt(4, 2);
			pstmt.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		}

		
	}

}

// insert into student(name,age,gender,grade,type) values('홍길동',12,0,1,1 )

3.update

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;

public class Update_3 {

	public static void main(String[] args) {
		// 데이터베이스 접속
		// 업데이트 구문
		// 실행
		
		String sql = " update student";
		sql += " set name =  ? , age = ? ";
		sql += " where id = 2";

		try (
				DbConnect dbc = new DbConnect();
				PreparedStatement pstmt = dbc.getPrepare(sql);
				) 
		{
			// 4. SQL문 처리명령
//			String sql = "update student set name = '동해산', age = 100 where id = 2";
//			sql += " set name = " +  "'동해'";
			
		
			pstmt.setString(1, "백s산"); // @@ 여기 이해안감!!
			pstmt.setInt(1, 50);
			pstmt.executeUpdate();
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

4. delete

package day9_jdbc2;

import java.sql.PreparedStatement;

public class Delete_4 {

	public static void main(String[] args) {
		String sql = " DELETE FROM student WHERE id = ?";

		try(
				DbConnect dbcon = new DbConnect();
				PreparedStatement pstmt = dbcon.getPrepare(sql);
				)
		{
			pstmt.setInt(1, 2);
			pstmt.executeUpdate();
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}

}

//DELETE FROM student WHERE id = 2
profile
비전공자 독학러. 일단 쌔린다. 개발 공부👊

0개의 댓글