본문 바로가기
공부/java

19일차

by 샤샤샤샤 2022. 12. 8.

자바와 MariaDB연결하기

 

먼저 Maria db를 다운받은 사이트에 가서 connect.jar을 다운받아 모듈 추가를 해야한다.

 

package MariaDB;

import java.sql.Connection;
import java.sql.DriverManager;

public class DBConnect {
    public static void main(String[] args) {
        //데이터베이스 접속 객체
        Connection conn = null;
        try {
            //MariaDB 드라이버 로드 ( com.mysql.cj.jdbc.Driver )
            Class.forName("org.mariadb.jdbc.Driver");
            //데이터베이스 접속
            conn = DriverManager.getConnection(
                    //jdbc:mysql://localhost:3306/mydb
                    "jdbc:mariadb://localhost:3306/mydb", //Host
                    "root", //사용자
                    "1234" //암호
                    );
        }catch (Exception e){
            e.printStackTrace();
            try {
                conn.close();
            } catch (Exception ex) {
                e.printStackTrace();
            }
        }
        if( conn != null) {
            System.out.println("데이터베이스 접속 성공!!");
        }
    }
}

Connection 클래스는 db와 연결하기 위한 클래스이다.

try / catch문으로 감싸줘야만 하며, 닫을때도 마찬가지다.

 

다음으로 java파일을 하나 만들어준다.

package MariaDB;

//데이타를 담는 클래스 종류
//VO : View Object, 값의 수정이 안되고, 로직이 없음.
//DTO : Data Transfer Object, 레이어간 데이타 전송 용도.
//ENTITY : DB 컬럼과 1:1로 연결됨. Spring JPA에서 주로 사용.

//데이타의 조작을 하는 클래스
//DAO : Data Acess Object, DB 조작 메소드들의 집합, CURD 메소드들.

public class MemberVO {
    //DB 컬럼과 1:1 매칭
    // INT : int (Integer)
    // VARCHAR : String
    // DATETIME : Date or LocalDateTime
    private int memberno;//회원번호
    private String id;//아이디
    private String name;//이름

    public int getMemberno() {
        return memberno;
    }

    public void setMemberno(int memberno) {
        this.memberno = memberno;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

이 파일은 get / set 생성자 함수를 통해 db에 존재하는 각 컬럼(Column) 의 데이터를 변경할수 있다.

굳이 모든 레코드에 접근하지 않아도 된다면, 필요한 컬럼만 가져와도 된다.

 

레코드 (Record) : 레코드란 여러 가지 데이터 타입을 가질 수 있는 복합형 구조의 데이터 타입이며, 하나의 행(Row)에 대응한다. 

 

이제 위의 db와의 연결에 더 많은 기능을 추가해보자.

package MariaDB;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class MemberDAO {
    //데이터베이스 접속 객체
    Connection conn = null;
    //SQL 쿼리를 구현한 객체
    Statement stmt = null;
    //쿼리에 대한 응답인 레코드셋을 가져오는 객체
    ResultSet rs = null;

    public MemberDAO(){
        try {
            //MariaDB 드라이버 로드
            Class.forName("org.mariadb.jdbc.Driver");
            //데이터베이스 접속
            conn = DriverManager.getConnection(
                    "jdbc:mariadb://localhost:3306/mydb", //Host
                    "root", //사용자
                    "1234" //암호
            );
        }catch (Exception e){
            e.printStackTrace();
            try {
                conn.close();
            } catch (Exception ex) {
                e.printStackTrace();
            }
        }
        if( conn != null) {
            System.out.println("데이터베이스 접속 성공!!");
        }
    }

   public int insert(MemberVO vo){
        int result = 0;
        try{
            //"INSERT INTO member (memberno, id, name) VALUES (1, 'hong', '홍길동')"
            String sql = "INSERT INTO member (memberno, id, name) "+
                    "VALUES ("+vo.getMemberno()+", '"+vo.getId()+"', '"+
                    vo.getName()+"')"; //세미콜론은 넣지 않는다!
            stmt = conn.createStatement();
            //정상수행되면 1을 리턴함.
            //insert,update,delete SQL문은 영향을 줄(ROW) 갯수를 반환함.
            result = stmt.executeUpdate(sql); //쿼리 수행!
        }catch(Exception e){
            e.printStackTrace();
        }
        return result;
   }
   //교재 p575
   public MemberVO selectOne(int memberno){
       MemberVO vo = new MemberVO();

       try{
           String sql = "SELECT * FROM member WHERE memberno="+memberno;
           stmt = conn.createStatement();
           rs = stmt.executeQuery(sql);
           if( rs.next() ) {
               vo.setMemberno(rs.getInt("memberno"));
               vo.setId(rs.getString("id"));
               vo.setName(rs.getString("name"));
           }
       }
       catch (Exception e){ e.printStackTrace(); }
       return vo;
   }
   public int update(MemberVO vo){
        int result = 0;
        try {
            String sql = "UPDATE member SET id='" +
                         vo.getId()+"', name='"+vo.getName()+"'"+
                         " WHERE memberno="+vo.getMemberno();
            stmt = conn.createStatement();
            result = stmt.executeUpdate(sql);
        }
        catch (Exception e){ e.printStackTrace(); }
        return result;
   }
   public int delete(int memberno){
        int result = 0;
        try{
            String sql = "DELETE FROM member WHERE memberno="+memberno;
            stmt = conn.createStatement();
            result = stmt.executeUpdate(sql);
        }
        catch (Exception e){ e.printStackTrace(); }
        return result;
   }
   public List<MemberVO> list(){
       List<MemberVO> list = new ArrayList<>();
       try{
           String sql = "SELECT * FROM member";
           stmt = conn.createStatement();
           rs = stmt.executeQuery(sql);
           while (rs.next()){
               MemberVO vo = new MemberVO();
               vo.setMemberno(rs.getInt("memberno"));
               vo.setId(rs.getString("id"));
               vo.setName(rs.getString("name"));
               list.add(vo);
           }
       }
       catch (Exception e){ e.printStackTrace(); }
       return list;
   }
   public void close(){
        if(conn != null ){
            try {
                conn.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
        if(stmt != null){
            try {
                stmt.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
        if(rs != null){
            try {
                rs.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
   }

}

이는 데이터를 추가, 수정, 조회, 삭제(insert, update, read, delete를 위한 클래스다.

작동 메커니즘은 다음과 같다. set함수를 통해 원하는 데이터를 입력하고, 그 값을 다시 get을 통해 sql문 문자열에 입력한다. 그리고 그 sql문을 통째로 연결된 db로 보내면, 그곳에서 그 쿼리문을 해석해서 코드를 실행하는 원리다.

이해를 돕기 위해 설명이 필요한 함수만 따로 정리하겠다.

 

conn.createStatement() : 위에서 만든 Connection을 자바 프로그램과 DB 사이에 연결이 되었다면 이 연결을 통해 자바프로그램은 DB 쪽으로 SQL 문을 전송하고, DB는 처리된 결과를 다시 자바프로그램 쪽으로 전달해야 한다. 바로 이 역활을 하는 객체가 Statement다. 즉, 양쪽간의 데이터 이동을 위한 통로, 운반책같은 개념으로 받아들이면 된다.

 

객체.executeUpdate( 쿼리문 ) : 객체(운반책)를 통해 쿼리문을 db로 보내 실행시키는 함수다. 이때 코드가 실행되면서 영향을 끼친 행의 갯수를 return값으로 가진다.

 

사실상 이 방식 자체는 하나의 공식처럼 되었기에, 필요에 따라 세부적인 값을 조절하면서 만들면 된다.

'공부 > java' 카테고리의 다른 글

타임리프 사용법  (0) 2023.01.22
자바(java)의 출력 함수  (0) 2023.01.22
18일차 복습  (0) 2022.12.08
16-17일 통신  (0) 2022.12.06
16일차 복습  (0) 2022.12.06