들어가기 전에
이번 시간엔 JDBC를 이용해 데이터베이스에서 입력/수정/조회/삭제를 하는 프로그램을 만들어 보도록 하겠습니다.
학습 목표
- JDBC를 이용해 입력/수정/삭제/조회 프로그래밍을 할 수 있다.
핵심 개념
- JDBC
- PreparedStatement
- ResultSet
- Connection
학습하기
들어가기 전에
이번 시간엔 JDBC를 이용해 데이터베이스에서 입력/수정/조회/삭제를 하는 프로그램을 만들어 보도록 하겠습니다.
학습 목표
핵심 개념
학습하기
Muted
High-definition playback is available for this video.
Change the resolution in Settings.
실습코드
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>kr.or.connect</groupId>
<artifactId>jdbcexam</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>jdbcexam</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.45</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
Role.java
package kr.or.connect.jdbcexam.dto;
public class Role {
private Integer roleId;
private String description;
public Role() {
}
public Role(Integer roleId, String description) {
super();
this.roleId = roleId;
this.description = description;
}
public Integer getRoleId() {
return roleId;
}
public void setRoleId(Integer roleId) {
this.roleId = roleId;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
@Override
public String toString() {
return "Role [roleId=" + roleId + ", description=" + description + "]";
}
}
RoleDao.java - Select
package kr.or.connect.jdbcexam.dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import kr.or.connect.jdbcexam.dto.Role;
public class RoleDao {
private static String dburl = "jdbc:mysql://localhost:3306/connectdb";
private static String dbUser = "connectuser";
private static String dbpasswd = "connect123!@#";
public Role getRole(Integer roleId) {
Role role = null;
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(dburl, dbUser, dbpasswd);
String sql = "SELECT description,role_id FROM role WHERE role_id = ?";
ps = conn.prepareStatement(sql);
ps.setInt(1, roleId);
rs = ps.executeQuery();
if (rs.next()) {
String description = rs.getString(1);
int id = rs.getInt("role_id");
role = new Role(id, description);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (ps != null) {
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return role;
}
}
jdbcExam1.java - Select
package kr.or.connect.jdbcexam;
import kr.or.connect.jdbcexam.dao.RoleDao;
import kr.or.connect.jdbcexam.dto.Role;
public class JDBCExam1 {
public static void main(String[] args) {
RoleDao dao = new RoleDao();
Role role = dao.getRole(100);
System.out.println(role);
}
}
참고 자료
https://docs.oracle.com
comment
24.04.05.
오류: kr.or.connect.jdbcexam.JDBCExam1 클래스에서 기본 메소드를 찾을 수 없습니다. 다음 형식으로 기본 메소드를 정의하십시오.
public static void main(String[] args)
또는 JavaFX 애플리케이션 클래스는 javafx.application.Application을(를) 확장해야 합니다.
이렇게 나오시는 분 계실까요 ㅠ?
220305
mySQL 버전 8.x.x 일 경우,
1. pom.xml
아래 링크에서 현재 쓰는 mysql 버전을 클릭하여 dependency를 복사하여 붙여넣기
https://mvnrepository.com/artifact/mysql/mysql-connector-java
2. RoleDao.java
Class.forName("com.mysql.cj.jdbc.Driver");
으로 변경
Maven project 생성하는 과정에서 archetype이 너무 많이 뜨는데, 설치 과정에서 잘못한 게 있을까요? 파일이 너무 많아 속도도 느린 것 같습니다.
mysql 대신 mariadb 사용할 경우에는 ctrl+f 로 mysql을 mariadb로 바꾸면 됩니다.
depecdency 버전도 maven update project로 수정하면 끝
mysql 8.0.22 version 오류 해결
1. pom.xml에 추가했던 dependency versiondmf 5.1.46으로 바꿈
2. RoleDao.java의 dburl "jdbc:mysql://localhost:3306/connectdb?serverTimezone=Asia/Seoul&useSSL=false" 로 설정
-> 아무 에러 안 뜸
1. DB접속을 위해, DriverManager를 통해 Connection을 가져오는 부분의 코드들을 공통으로 사용할 수 있다.
2. 사용한 자원을 닫아주기 위한 코드들을 제거할 수 있다.
맥에서 오류가 나서 아래 댓글보면서 해결한거 남깁니다.
첫번째 SSL 오류 dburl 변경
dburl = "jdbc:mysql://localhost:3306/connectdb?serverTimezone=Asia/Seoul&useSSL=false";
두번째 Unable to load authentication plugin 'caching_sha2_password'. 오류
터미널 루트 접속 후
ALTER USER connectuser@'localhost' IDENTIFIED WITH mysql_native_password BY 'connect123!@#';
로 해결했습니다.
mysql-connector-java 프로젝트 라이브러리에 추가하는 방법
https://m.blog.naver.com/PostView.nhn?blogId=50after&logNo=220912861796&proxyReferer=https:%2F%2Fwww.google.com%2F
이렇게 추가하시고 저는 pom.xml dependency버전에 mysql 버전 말고 다운받은 connector 버전으로 설정하고 dbURL뒤에 ?serverTimezone=Asia/Seoul&useSSL=false 추가하니까 잘 됐습니다 !
근데 저번 수업에서 jdbcDriver 설치하라고 되어있는데 이걸 다운받긴 했는데,, 이건 어디다가 쓰는건가요? 제가 다운로드만 받고 아무것도 안했는데 이번수업에서 오류가 안나서요..
복습 중에 미리 dao와 dto에 대해서 파악을 해뒀으면 좋았겠구나 싶어서
해당 개념들을 공부할 수 있는 링크 공유합니다.
https://jungwoon.github.io/common%20sense/2017/11/16/DAO-VO-DTO/
첫 번째 영상 그~대로 따라했을 때 나오는 오류 (windows 기준)
1. Timezone, SSL 통신 관련 에러가 발생할 경우(뭘로해볼까님 댓글)
RoleDao.java에서
dburl 부분을 다음과 같이 수정
: jdbc:mysql://localhost:3306/connectdb?serverTimezone=Asia/Seoul&useSSL=false
Class.forName() 괄호 안에 "com.mysql.cj.jdbc.Driver"로 넣기
2. java lang error가 뜰 것.
pom.xml에서 다음 부분의 <version> ~ </version>을
cmd창에서 mysql -V라고 입력했을 때의 결과로
치환해준다.
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.19</version> <= 이부분.
</dependency>
+) java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not allowed
이 오류는 cmd창(terminal)에 examples.sql파일이 있는 폴더에서 mysql을 실행하지 않아서 떴습니다.
select 구현시..
리스트를 객체로 넣어 출력하면 왜 role_id가 내림차순으로 나오는 원리가 궁금해요!
변경사항
mysql버전 확인후 변경.
dburl에 ?autoReconnect=true&serverTimezone=UTC추가.
mysql version 8.0 쓰시는 분들!!!
mysql -uroot -p
로 들어가셔서 아래 저희가 생성한 user에게 패스워드 설정다음과 같이 변경해주면 권한 문제가 해결됩니다 ㅎㅎ
ALTER USER connectuser@'%' IDENTIFIED WITH mysql_native_password BY 'connect123!@#';
마지막 영상 JDBCExam3 예제에서 role_id 501이 만들어지지 않습니다.. 왜그런거죠
select, insert 기능을 try-with-resources Statement로 구현할 때 ps.setX method 를 어떻게 바꿔야 할지 헤메다가 스택오버플로우에서 해결책을 찾았습니다.
https://stackoverflow.com/questions/8066501/how-should-i-use-try-with-resources-with-jdbc
계속 SQL문법에러떠서 자세히 살펴보니 sql 명령어 오타가 있었네요 ㅠㅠ
벌써 몇주째 해결 못하고 있는데 DAO를 이용하는 코드를 test.java 클래스에서 메인함수에 사용하면 잘되는데
서블릿에서 똑같은 코드를 이용하면 list로 데이터가 아예 들어오지 않는데 이 점은 무슨 문제일까요?
ex) TodoDao dao = new TodoDao();
List<TodoDto> list = dao.getTodos();
이렇게 사용하면 list에 객체 배열이 들어와야하는데 아무것도 들어있지 않습니다. 서블릿에서 사용시
오류해결방법(뭘로 해볼까님 참조)
1. cmd 창을 열어 mysql --version에서 나온 버전 pom.xml에 추가한 버전을 동일하게 해준다
2. 만약 mysql 8.0.16을 받았으면!
1) Class.forName("com.mysql.cj.jdbc.Driver"); << cj 추가
2) dburl = "jdbc:mysql://localhost:3306/connectdb?serverTimezone=Asia/Seoul&useSSL=false"; << TimeZone추가