5월 16일 내용 정리
어제 팀플 때문에 온라인 스터디를 했고...아주 난리법석 있었다능...
내가 정리해간 이론을 쭈욱 설명해주고 같이 데이터 넣는거 까지 할려고 했는데, 한명은 sql import가 안되서 2시간 내내 해결하고,
또다른 한명은 mySQL이 아니라 오라클드라이브를 받아서 안되고,,,
나도 같이 에러 찾고,,결국은 해결하긴했는데...결국 데이터 인서트 못하고 끝났는데, 다행히 선생님이 오늘 데이터 부분 연동하는 부분을 알려 주셔서
조원들 모두 숙지.. 다행쓰...
1.의존하는 모듈
먼저 어제 sql import가 안됐던 부분에 대해서 공부해봤는데,
의존 모듈이라는 개념을 모르고 있어서 헤맸던거 같다.
의존하는 모듈이란?
해당 모듈(프로젝트)을 실행하기 위해서 필요한 외부 모듈을 말한다.
예) java.desktop ( java.awt, java.swing ) / java.sql ( java.sql, javax.sql )
Java 11 이후 버전 부터 생성한 모듈(프로젝트)은 java.base 모듈만 사용가능하다.
예)java.base 모듈에는 java.lang / java.math / java.util / java.io / java.net / java.time 등이 있다.
기본적으로 java.base 모듈만 사용 가능하므로 다른 모듈을 사용할 경우 의존 모듈 등록해야 한다.
모듈 클래스에 필요에 따라'requires java.desktop; requires java.sql; ' 이런식으로 모듈에 필요한걸 등록해주면 됨
2.데이터 베이스 연동의 흐름도
(1).jdbc 드라이버 로드 및 데이터베이스 연결
(2).sql문 실행
(3).ResultSet 객체를 처리
(4).자원객체 닫기(close())
3.DBconnection.makeCon()
위와 같이 클래스에서 불러와서 쓸수 있다.
왜냐? jdbc 드라이버 로드 및 데이터베이스 연결 형식이 똑같고 DBconnection객체를 만들었기 때문
*드라이버 로딩
package study_0516;
// 의존하는 모듈
import java.sql.*;
//DBconnection.makeCon() 이렇게 다른 클래스에서 불러와서 쓸수 있다.
//왜냐? jdbc 드라이버 로드 및 데이터베이스 연결 형식이 똑같고 DBconnection객체를 만들었기 때문
public class DBconnection {
public static Connection makeCon(){ //Connection 타입으로 반환하는 static 메서드 생성
String driver="com.mysql.cj.jdbc.Driver"; //jdbc 드라이버를 메모리에 로드 할려면 그위치를 알려줘야한다.
String url ="jdbc:mysql://localhost:3306/shopdb1"; //사용하는 DB의 정보를 넘겨준다.
String user="root";
String pw="my1234";
Connection con= null; //Connection 객체는 static이다.
try {
Class.forName(driver); //jdbc 드라이버를 메모리에 로드하는것
System.out.println("데이터베이스 연결중...");
//드라이버로 읽어서 url을 찾아가 연결후 데이터베이스 연결을 위한 Connection객체를 생성
//DriverManager의 클래스의 getConnection()메서드로 사용자정보를 넘겨주면서 연결하고 static Connection 객체로 반환해줌
con=DriverManager.getConnection(url,user,pw);
System.out.println("데이터베이스 연결중성공");
}catch(ClassNotFoundException e) {
System.out.println("jdbc드라이버 연결 실패");
}catch(SQLException e) {
System.out.println("데이터베이스 연결 실패");
}
return con; //Connection 타입으로 메서드를 반환 하기때문에 con 변수로 반환
}
public static void main(String[] args) {
makeCon();
}
}
*드라이버 로딩 끌어다 쓰기 및 insert 하기
package study_0516;
import java.sql.*;
import practice.*; //다른패키지의 클래스를 끌어다가 쓰고싶을때 import를 쓴다.
public class DBexam {
public static void main(String[] args) throws SQLException{ // 예외 떠넘기기 DBconnection.makeCon(); 호출한 문장으로
//makeCon()은 static 메서드로 불러다가 Connection con 에 주소를 넘겨줌
Connection con=DBconnection.makeCon();
//객체를 생성을 못하면 예외를 발생시킴 그래서 메인메서드에서 throws 처리
//Statement 객체 생성 Connection인터페이스의 createStatement메서드를 통해서 Statement객체생성
Statement stmt=con.createStatement();
String sql="INSERT INTO person(name, phone, email)"+"VALUES('김자바', 010-1234-1234, kim@naver.com)";
if(stmt.executeUpdate(sql)==1) { //stmt.executeUpdate(sql)가 데이터 업데이트 수량으로 업데이트여부를 체크
System.out.println("레코드 추가성공");
}else {
System.out.println("레코드 추가실패");
}
//자원객체 닫기
con.close();
stmt.close();
}
}
*PreparedStatement 사용하여 insert 하기
package study_0516;
import java.sql.*;
import practice.*;
public class DBexam01 {
public static void main(String[] args) throws SQLException{
Connection con=DBconnection.makeCon();
//자바와 mysql은 서로 언어가 다른데, 이것을 서로 통역해주는 역할을 Statement, prepareStatement 를 해준다.
StringBuilder sql = new StringBuilder();
sql.append("INSERT INTO person(name, phone, email)");
sql.append("VALUES(?, ?, ?)");
PreparedStatement ps =con.prepareStatement(sql.toString()); //예외가 발생할수 있으므로 예외처리해줘야함
ps.setString(1, "한신림");
ps.setString(2, "010-134-1234");
ps.setString(3, "han@naver.com");
ps.execute();
}
}
package study_0516;
import java.sql.*;
public class DBexam02 {
public static void main(String[] args) throws SQLException{
/*그다음자료를 불러올때 next() 이용
*이전자료를 불러올때 previous() 이용
*/
Connection con=DBconnection.makeCon();
String sql= "select * from person;";
PreparedStatement ps = con.prepareStatement(sql); //예외가 발생할수 있으므로 예외처리해줘야함
ResultSet rs =ps.executeQuery(); //executeQuery()는 조회 할때 뭘쓸지 모르겠다 하면 execute()를 쓴다.
while(rs.next()) {
System.out.println("이름은:"+rs.getString(1));
System.out.println("번호는:"+rs.getString(2));
System.out.println("이메일:"+rs.getString(3));
}
//작업이 끝났으면 close()로 닫아주면 된다. 만약에 작업 안끝났으면 아래를 닫아주면 안됨
if(rs != null) { //null이 아니면 즉, 뭔가가 있으면 닫아라
rs.close();
}else if(ps != null) { //null이 아니면 즉, 뭔가가 있으면 닫아라
ps.close();
}else if(con !=null) { //null이 아니면 즉, 뭔가가 있으면 닫아라
con.close();
}
}
}