자바와 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값으로 가진다.
사실상 이 방식 자체는 하나의 공식처럼 되었기에, 필요에 따라 세부적인 값을 조절하면서 만들면 된다.