Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- REST API 규칙
- uncheck Exception
- Q 클래스
- JPA
- Unsatisfied dependency
- 복합키
- spring서버
- github
- jpa회원가입
- Error creating bean with name
- 인텔리제이
- jwt메서드
- 스프링 부트 기능
- git
- Filter
- queryDSL
- ERD 작성
- @IdClass
- json
- JoinColumn
- jpa에러
- 스프링 부트 공식 문서
- Spring Spring boot 차이
- REST란
- 스프링부트오류
- 최종 프로젝트
- 빈생성안됨
- json gson 차이
- JPA주의사항
- 1차캐시
Archives
- Today
- Total
Everyday Dev System
자바 어플리케이션에서 도커 컨테이너에 접속 select, insert 수행 본문
도커 컨테이너 생성이 선행되어 있어야 합니다.
이전글 참조:
또한, build.gradle 파일에
postgreSQL 의존성 추가가 필요합니다!
implementation 'org.postgresql:postgresql:42.2.27'
1. 테이블 생성 → ' ACCOUNT '
@Test
@DisplayName("Table 생성 실습")
void jdbcTest() {
DriverManager driverManager;
String url = "jdbc:postgresql://localhost:5432/messenger";
String username = "chaeyoung";
String password= "pass";
//when
try {
Connection connection = DriverManager.getConnection(url,username,password);
String createSql = "CREATE TABLE ACCOUNT (id SERIAL PRIMARY KEY, username varchar(255), password varchar(255))";
PreparedStatement statement = connection.prepareStatement(createSql);
statement.execute();
statement.close();
connection.close();
}catch (SQLException e){
e.printStackTrace();
}
}
만약, 아래와 같이 작성하면 try문이 끝나면 try() 괄호 안에 들어간 객체를 자동으로 close() 해줍니다.
try (Connection connection = DriverManager.getConnection(url,username,password)){ String createSql = "CREATE TABLE ACCOUNT (id SERIAL PRIMARY KEY, username varchar(255), password varchar(255))"; try(PreparedStatement statement = connection.prepareStatement(createSql)){ statement.execute(); } }catch (SQLException e){ e.printStackTrace(); }
위와 같이 생성됨을 알 수 있습니다.
조회해보면 저장된 정보가 없기 때문에 빈 테이블이 표시됩니다.
인텔리제이 DataBase 카테고리에 postgres 데이터 소스를 추가하고 테이블 생성을 확인할 수 있다.
터미널로 접속하지 않아도 됨.
2. 데이터 저장하기
public class JDBCTest {
@Test
@DisplayName("JDBC 삽입/조회 실습")
void jdbcInsertSelectTest() throws SQLException {
// given
String url = "jdbc:postgresql://localhost:5432/messenger";
String username = "chaeyoung";
String password = "pass";
// when
try (Connection connection = DriverManager.getConnection(url, username, password)) {
System.out.println("Connection created: " + connection);
String insertSql = "INSERT INTO ACCOUNT (id, username, password) VALUES ((SELECT coalesce(MAX(ID), 0) + 1 FROM ACCOUNT A), 'user1', 'pass1')";
try (PreparedStatement statement = connection.prepareStatement(insertSql)) {
statement.execute();
}
// then
String selectSql = "SELECT * FROM ACCOUNT";
try (PreparedStatement statement = connection.prepareStatement(selectSql)) {
var rs = statement.executeQuery();
while (rs.next()) {
System.out.printf("%d, %s, %s", rs.getInt("id"), rs.getString("username"),
rs.getString("password"));
}
}
}
}
@Test
@DisplayName("JDBC DAO 삽입/조회 실습")
void jdbcDAOInsertSelectTest() throws SQLException {
// given
AccountDAO accountDAO = new AccountDAO();
// when
var id = accountDAO.insertAccount(new AccountVO("new user", "new password"));
// then
var account = accountDAO.selectAccount(id);
assert account.getUsername().equals("new user");
}
}
위와 같이 데이터가 잘 삽입되었다.
3. DAO 클래스 활용하기
파일 구조
public class JDBCTest {
@Test
@DisplayName("JDBC DAO 삽입/조회 실습")
void jdbcDAOInsertSelectTest() throws SQLException {
// given
AccountDAO accountDAO = new AccountDAO();
// when
var id = accountDAO.insertAccount(new AccountVO("new user", "new password"));
// then
var account = accountDAO.selectAccount(id);
assert account.getUsername().equals("new user");
}
}
dao 클래스
package jdbc.dao;
import jdbc.vo.AccountVO;
import java.sql.*;
public class AccountDAO {
// jdbc 관련 변수
private Connection conn = null;
private PreparedStatement stmt = null;
private ResultSet rs = null;
private static final String url = "jdbc:postgresql://localhost:5432/messenger";
private static final String username = "chaeyoung";
private static final String password= "pass";
// SQL 쿼리
private final String ACCOUNT_INSERT = "INSERT INTO account(ID, USERNAME, PASSWORD) "
+ "VALUES((SELECT coalesce(MAX(ID), 0) + 1 FROM ACCOUNT A), ?, ?)";
private final String ACCOUNT_SELECT = "SELECT * FROM account WHERE ID = ?";
// CRUD 기능 메소드
public Integer insertAccount(AccountVO vo){
var id = -1;
try {
String[] returnId = {"id"};
conn = DriverManager.getConnection(url,username,password);
stmt = conn.prepareStatement(ACCOUNT_INSERT, returnId);
// 삽입된 행 또는 행에서 반환해야 할 열을 나타내는 열 이름 배열 변수 (returnId)
stmt.setString(1, vo.getUsername());
stmt.setString(2, vo.getPassword());
stmt.executeUpdate(); // 해당 메서드는 update 한 갯수를 반환함.
try(ResultSet rs = stmt.getGeneratedKeys()) {
if(rs.next()) {
id = rs.getInt(1);
// id = rs.getString(1);
}
}
}catch(SQLException e){
e.printStackTrace();
}
return id;
}
public AccountVO selectAccount(Integer id) {
AccountVO vo = null;
try{
conn = DriverManager.getConnection(url,username, password);
stmt = conn.prepareStatement(ACCOUNT_SELECT);
stmt.setInt(1,id);
var rs = stmt.executeQuery();
if(rs.next()) {
vo = new AccountVO();
vo.setId(rs.getInt("ID"));
vo.setUsername(rs.getString("USERNAME"));
vo.setPassword(rs.getString("PASSWORD"));
}
}catch(SQLException e){
e.printStackTrace();
}
return vo;
}
}
stmt = conn.prepareStatement(ACCOUNT_INSERT, returnId);
해당 메서드의 2번째 파라미터에 들어갈 값은 삽입된 행 또는 행에서 반환해야 할 열을 나타내는 열 이름 배열 변수
vo 클래스
package jdbc.vo;
public class AccountVO {
private Integer id;
private String username;
private String password;
public AccountVO(String username, String password){
this.username = username;
this.password = password;
}
public AccountVO() {
}
public void setId(Integer id) {
this.id = id;
}
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password){
this.password = password;
}
public String getUsername() {
return this.username;
}
public String getPassword() {
return this.password;
}
}
'내배캠 주요 학습 > JPA 심화' 카테고리의 다른 글
JPA) N : 1 관계 맵핑 (Thread : Channel : User) (0) | 2023.07.31 |
---|---|
JPA) N : 1 관계 맵핑 (thread : Channel) (0) | 2023.07.31 |
Spring Framework와 JPA 활용 (0) | 2023.07.31 |
Entity Class에 활용 어노테이션 - 1주차 4강 (0) | 2023.07.30 |
도커 컨테이너 생성 및 실행하기 (0) | 2023.07.28 |