Java 데이터 접근 기술 - jdbc (1)
JDBC(Java Database Connectivity)는 Java에서 db에 접속 하고 사용할 수 있도록 하는 API임
대표적으로 3가지 기능을 Interface로 정의해서 제공을 해줌
Connection(연결) / Statement(쿼리쏘기) / ResultSet(결과)
근대 이거는 그냥 Interface이기 떄문에 각각의 벤더사가 자기의 제품에 맞게 저거를 상속받고 구현을 해야함
그래서 JDBC를 사용할 떄 원하는 회사(Oracle, Mysql, DB2, PostgreSQL)의 jdbc를 import 하면 되는 부분임
(근대 interface는 동일하지만 sql쿼리 문법은 조금씩 되는게 있고 안되는게 있기 때문에 주의)
일단 DB를 켜주자
리눅스면 systemctl start mysql 하면 될듯?
그리고 Java Project를 생성하고 아까 다운받은 jdbc jar를 외부 라이브러리에 import해주자
public class MysqlConst {
public static final String url = "jdbc:mysql://localhost/[databases]?useUnicode=true&serverTimezone=Asia/Seoul";
public static final String user = "[계정]";
public static final String password = "[비번]";
}
일단 접속내용을 계속 재사용하기 위해서 Const Class 생성했음....
근대 접속할 때 시간이나 인코딩 오류날 수 있으니
useUnicode=true&serverTimezone=Asia/Seoul
이거 쓰셈
public class DBConnectionUtil {
public static Connection getConnection(){
try{
return DriverManager.getConnection(url, user, password);
}catch (SQLException e){
throw new IllegalStateException(e);
}
}
}
DB에 연결하려면 JDBC가 제공하는 DriverManaget.getConnection( ... ) 를 사용해야함
그러면 library에 있는 데이터베이스 드라이버를 찾아서 커넥션을 반환해 준다..
(자동으로 해줌)
Class.forName("com.mysql.cj.jdbc.Driver");
직접 드라이버를 지정하고 싶으면 이렇게 하면됨(맞는진 모르겟음 ㅋㅋ)
일단 이거 사용할 거니깐 class를 만들어두자..
public class Artwork {
private String title;
private String type;
private String genre;
private String description;
private String OpeningDate;
// getter, setter는 생략..
}
롬복 사용하자...... 개귀찮네
public class Repository {
public Artwork save(Artwork artwork) throws SQLException {
StringBuilder sb = new StringBuilder();
sb.setLength(0);
sb.append("INSERT INTO ARTWORK ")
.append("VALUES(?,?,?,?,?,?");
Connection conn = null;
PreparedStatement pstmt = null;
try{
conn = DBConnectionUtil.getConnection();
pstmt = conn.prepareStatement(sb.toString());
pstmt.setString(1, artwork.getTitle());
pstmt.setString(2, artwork.getType());
pstmt.setString(3, artwork.getGenre());
pstmt.setString(4, artwork.getDescription());
pstmt.setString(5, artwork.getDirector());
pstmt.setString(6, artwork.getOpeningDate());
int res = pstmt.executeUpdate();
System.out.println("INSERT SUCCESS : " + res);
return artwork;
}catch(SQLException e){
e.printStackTrace();
throw e;
}finally {
if(pstmt != null){
pstmt.close();
}
if(conn != null) {
conn.close();
}
}
}
}
진짜 오랜만에 순수하게 jdbc코드 작성해보는 것 같다..
public class JdbcMain {
public static void main(String[] args) {
try{
Artwork newWork = new Artwork("그냥 제목","그냥 타입","그냥 장르","그냥 내용","그냥 감독","");
Repository repo = new Repository();
repo.save(newWork);
}catch (SQLException e){
e.printStackTrace();
}
}
}
그리고 실행해보자
일단 데이터는 잘 들어간다
이제 조회까지만 해보자(복습인데 CRUD다 하기는 귀차늠)
public Artwork getArtworkByTitle(String title) throws SQLException {
Artwork artwork = new Artwork();
StringBuilder sb = new StringBuilder();
sb.setLength(0);
sb.append("SELECT * FROM ARTWORK WHERE TITLE = ? ");
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try{
conn = DBConnectionUtil.getConnection();
pstmt = conn.prepareStatement(sb.toString());
pstmt.setString(1, title);
rs = pstmt.executeQuery();
if(rs.next()){
artwork.setTitle(rs.getString("TITLE"));
artwork.setType(rs.getString("Type"));
artwork.setGenre(rs.getString("Genre"));
artwork.setDescription(rs.getString("Description"));
artwork.setDirector(rs.getString("Director"));
artwork.setOpeningDate(rs.getString("OpeningDate"));
}
return artwork;
}catch(SQLException e){
e.printStackTrace();
throw e;
}finally {
if(rs != null){
rs.close();
}
if(pstmt != null){
pstmt.close();
}
if(conn != null) {
conn.close();
}
}
}
Artwork result = repo.getArtworkByTitle("그냥 제목");
System.out.println(result.toString());
근대 이거하면서 새롭게 안거는 ResultSet.getString할 때 저거 그냥 대문자든 소문자든 상관없는거같음.
DML일 경우는 주의해야할듯
mysql jdbc까보니깐
public String getString(String columnName) throws SQLException {
try {
return this.getString(this.findColumn(columnName));
} catch (CJException var3) {
throw SQLExceptionsMapping.translateException(var3, this.getExceptionInterceptor());
}
}
일단 이부분이 구현체같고 쭉 따라가보는데 어디선가 해당 column에 대해서 upper나 lower로 변환시켜주는 뭔가가 있지 않을까?? 싶은 느낌..
오늘은 여기 까지만..
https://tlqckd0.tistory.com/53
예전에 nodejs로 유사하게 구현한 적이 있었는데 비교해보는것도 좋을듯
근대 노트북 바꿀생각인데 이거 데이터 어덯게 migration함..? 아까운데
지금쓰던거는 집에 던져서 게임용으로 냅두고, 새거는 그냥 영상 + 공부용으로 쓸거같