: JDBC는 Java에서 데이터베이스와 통신할 수 있게 해주는 API입니다.
즉, Java 코드로 데이터베이스에 연결하고 데이터를 조작(삽입, 삭제, 조회 등)하는 방법이에요.

DBMS마다 필요한 Driver가 다름!
: DataBase Management System
DB랑 다른 것! ,
DB와 연동되어 데이터베이스를 관리하고 운영하는 소프트웨어
DBMS는 내 컴퓨터 서버에 존재한다! 그래서 localhost 경로를 작성해주면 됨...

즉 DB에서 RESULT SET을 뽑아와서, 자바의 컬렉션으로 담아낸다.
java와 db를 연결하는 것이 Connection객체이다.
Connection이 스트림이기 때문이다!
//이게 바로 비즈니스 로직(트랜잭션 관련)을 만드는 과정이다!
커넥션 객체를 활용해 DB와 SQL로 소통
애초에 원래 Connection 클래스가 존재한다.
Connection con = null;
그래서 열면 con.close(); 로 또 닫아줘야 함.
: 키-값 쌍(key-value pair) 형태로 데이터를 저장하고 관리하기 위한 클래스입니다.
Properties props = new Properties();
// 파일에서 속성을 로드
props.load(input);
: 데이터를 파일로 저장하며 주석을 추가할 수 있습니다.
String query = props.getProperty("insertMenu");
//
: 새로운 키-값 쌍을 설정합니다.
: 둘 다 Java의 JDBC (Java Database Connectivity) API의 클래스이다.
: 데이터베이스에 연결된 후, SQL 명령어를 실행할 때 사용됩니다.
즉, 데이터베이스에 명령을 전송합니다.
Statement클래스는 명시적으로 close()를 호출해야 한다.
<주요 기능>
1. 데이터베이스로 SQL 쿼리 실행 (SELECT, INSERT, UPDATE, DELETE 등)
2. 반환된 결과로 ResultSet 객체 생성 (SELECT 쿼리의 경우)
3. 업데이트된 행 수 반환 (INSERT, UPDATE, DELETE 쿼리의 경우) -
( 보통 성공시 result로 1 반환하여, 이 성공여부에 따라 service 패키지에서 트랜잭션처리한다. )
: 주로 SELECT 쿼리 실행 시 사용되며, 데이터베이스의 결과 집합을 반복하면서 데이터를 읽어 온다.
이 때, 다양한 데이터 타입으로 결과값을 읽는다.(ex. getString(), getInt() 등 )
next() 다음 행으로 이동, 결과가 있으면 true, 없으면 false
getString(String column) 해당 열의 값을 문자열로 반환
getInt(String column) 해당 열의 값을 정수로 반환
getDouble(String column) 해당 열의 값을 실수로 반환
close() ResultSet 객체 종료 및 리소스 반환
Statement가 닫히면(.close) 자동으로 닫힘



//DML(insert, update, delete) 실행 시 커밋을 수동으로 발생시킨다
con.setAutoCommit();
//커밋시
//수동으로 이런식으로 트랜잭션 제어하기.db를 이렇게 백엔드에서 제어한다.
con.commit();
con.rollback();
오토커밋, 롤백을 내가 가져와서 판단한다.
이후 이렇게 원하는 시점에 원하는 조건을 만족하게 BASE TABLE을 바꾼다.
//잘못 작성된 부분삭제
delete from tbl_menu where menu_code >24;
//내가 발생하고자 하는 번호로 초기화
alter table tbl_menu auto_increment = 25;
롤백이 필요한 이유! :
클라이언트의 한 요청은 여러 곳에 요청이 가므로 여러 곳에 영향을 끼칠 수 있는데 그 중 하나의 요청이라도 실패하면 실패인 것이므로 커밋을 다시 롤백해야 한다!!!
//설명.service 계층과 repository(DAO(Data Access Object)) 계층을 구분하고, xml 파일에서부터 쿼리를 불러와서 insert 해보기
//xml 파일은 쿼리문을 따로 저장하기위한 파일로 둔 것이다.
//설명.view이자 controller개념(입력 받은 데이터로 하나의 Menu객체로 만들기)
하나의 데이터로 입력받는다 - view, 그걸 하나의 메뉴 객체로 가공처리한다?- controller
public class Application2{
public static void main(String[] args){
//데이터 입력받는 것 - view개념
Scanner sc= new Scanner(System.in);
System.out.print("메뉴 이름: ");
String menuName = sc.nextLine();
System.out.print("메뉴 가격: ");
int menuPrice = sc.nextInt();
System.out.print("카테고리 코드 : ");
int categoryCode = sc.nextInt();
System.out.print("판매 상태: ");
sc.nextLine(); //개행문자를 버퍼에서 제거
String orderableStatus = sc.nextLine();
//이렇게 한번에 멤버로 뭉치는 것이 값의 가공처리!(Controller개념)
Menu menu = new Menu(menu Name, menuPrice, categoryCode, orderableStatus); //이 생성자는 aggreagte같은 곳의 Menu클래스에서 따로 만들어야함.
MenuService service = new MenuService();
service.registMenu(menu);
}
}
//service계층은 db와는 직접적인관련이 없지만.. commit과 rollback을 위해 여기서 connection 객체를 만든다.
/* 설명. Service 계층은 Connection 객체 생성 및 소멸(clsoe) 및
비즈니스 로직, 트랜잭션 처리(commit/rollback)*/
public class MenuService{
//설명. Connection 객체는 메소드 내부에서 생성하고 소멸한다.(요청별/트랜잭션별)
public void registMenu(Menu menu){
Connectino con = getConnection(); //그래서 메소드 안에 만들어야함
MenuRepository repository = new MenuRepository();
int result = repository.insertMenu(con, menu);
/*설명. JDBCTemplate에 메소드 추가*/
if(result==1){
con.commit(); //commit은 따로 JDBCTemplate에 close처럼 메소드 뺴놓기)
}else{
rollback(con);
}
close(con);
}
}
//설명. 넘어온 Connection 객체를 활용해 자신이 알고 있는 쿼리로 CRUD 실행하고 결과를 반환
public class MenuRepository{
public int insertMenu(Connection con, Menu menu){
PreparedStatement pstmt= null;
int result =0;
//설명. 쿼리는 xml파일(maaper파일)로부터 읽어와서 활용할 것
Properties prop = new Properties();
try{
prop.loadFromXML(
new FileInputStream("src/main/~~~~/mapper/menu-mapper.xml");
);
String query = prop.getProperty("insertMenu");
pstmt = con.prepareStatement(query);
pstmt.setString(1,menu.getMenuName());
pstmt.setInt(2,menu.getMenuPrice());
pstmt.setInt(3, menu.getCategoryCode());
pstmt.setString(4,menu.getOrderableStatus());
result = pstmt.executeUpdate();
//업데이트한 result를 서비스에게 반환
}catch(IOException e){
throw new RuntimeException(e);
}catch(SQLEception e){
throw new RuntimeException(e);
}
return result;
}
}
<쿼리>
참고로 쿼리에 ;은 찍지 않는다!
<properties>
<entry key="insertMenu"> //이 key로 불러올 수 있다.
INSERT
INTO TBL_MENU
(
MENU_NAME
, MENU_PRICE
, CATEGORY_CODE
, ORDERABLE_STATUS
)
VALUES
(
?
,?
,?
,?
)
</entry>
</properties>
참고) 쿼리에서 ?가 세 개이면 화면에서도 입력을 세 개 받아야 함!