오라클 & 자바 연결
① DBConn작성
package com.db;
import java.sql.Connection;
import java.sql.DriverManager;
public class DBConn {
private static Connection dbConn;
//Connection : 인터페이스
//dbConn을 담을 수 있는 Connection 생성
public static Connection getConnection(){ //get : 이미 올라가 있으니 가져다 쓰기만 할 때는 보통 get을 사용
if(dbConn==null){
try {
String url = "jdbc:oracle:thin:@LOCALHOST:1521:XE";
// XE : 오라클 expression 버전
// jdbc로 oracle에 thin(type4)형식으로 LOCALHOST에 접속을 하겠다.
// ▶ 노트북으로 연결시 LOCALHOST
// 그 중 오라클이 사용하는 포트는 1521번. 연결하는 DB는 XE
String user = "SUZI";
String password = "A123";
Class.forName("oracle.jdbc.driver.OracleDriver");
//Driver를 로딩
//더 빠른 접속이 가능하다
dbConn = DriverManager.getConnection(url, user, password);
//연결된거를 dbConn에 넣어놓음
} catch (Exception e) {
System.out.println(e.toString());
}
}
return dbConn;
}
//DB는 연결을 하면 항상 끊어주는 작업을 해야한다
public static void close(){
if(dbConn!=null){
try {
if(!dbConn.isClosed()){
dbConn.close();
}
} catch (Exception e) {
System.out.println(e.toString());
}
}
//연결을 끊어주면 그 안에 쓰레기 값이 남아 두번째 연결을 할때는 Adapter에러가 발생, 접속이 안된다
//★항상 연결을 끊으면 dbConn을 null로 초기화 해야함
dbConn=null;
}
}
② 연결 확인
package com.day20;
import java.sql.Connection;
import com.db.DBConn;
public class Test1 {
public static void main(String[] args) {
//DB호출 명령어
Connection conn = DBConn.getConnection();
if(conn==null){
System.out.println("데이터베이스 연결 실패!");
System.exit(0);
}
System.out.println("데이터베이스 연결 성공!");
DBConn.close();
}
}
결과
데이터베이스 연결 성공!
③ 연결 확인
사용자 : SUZI
테이블 : SCORE
○ DB연결 방법
1. DriverManager가 Connection을 생성 ▶ DBConn
2. Connection이 Statement를 생성
(statement : sql 구문을 실행하는 인터페이스)
3. Statement가 query를 실행
package com.day20;
import java.sql.Connection;
import java.sql.Statement;
import com.db.DBConn;
public class Test2 {
public static void main(String[] args) {
Connection conn = DBConn.getConnection();
if(conn==null){
System.out.println("연결 실패!");
System.exit(0);
}
try {
//2. Connection이 Statement를 생성(sql 구문을 실행하는 인터페이스)
//statement의 종류는 세가지
Statement stmt = conn.createStatement();
String sql;
//sql문은 자바에서 String형태
//① insert
sql = "insert into score (hak,name,kor,eng,mat) ";
sql+= "values ('333','배수지',99,99,99)";
//② update
sql = "update score set name='김태리',kor=80, eng=80, mat=80 ";
sql+= "where hak=222";
//③ delete
sql = "delete score where hak='222'";
//3. Statement가 query를 실행
int result = stmt.executeUpdate(sql); //stmt는 sql쿼리를 가지고 DB에 찾아가서 sql을 실행
//제대로 실행되면 1을, 아니면 0을 돌려줌
if(result==1){
System.out.println("삽입 성공!");
}
} catch (Exception e) {
System.out.println(e.toString());
}
DBConn.close();
}
}
결과
① insert
② update
③ delete
Statement
1. Statement
○ sql문을 전달, 실행하는 인터페이스
○ 종류는 3가지 : Statement, PrepareStatement,
○ 제대로 실행되면 1을, 아니면 0을 돌려줌
○ 클래스와 인터페이스의 초기값은 null
① Statement
○ Connection 클래스의 createStatement( ) 메소드를 호출함으로써 얻어진다.
○ 사용
Connection conn = DBConn.getConnection();
Statement stmt = conn.createStatement();
int result = stmt.executeUpdate(sql);
② PreparedStatement
○ Connection 객체의 prepareStatement( ) 메소드를 사용해서 생성
○ sql문장이 미리 컴파일되어진다.
○ sql문을 미리 검사 후 확인 된 sql문을 넣는다. ▶ pstmt = conn.prepareStatement(sql);
○ 한 번 분석되면 재사용이 용이하다.
○ 사용
Connection conn = DBConn.getConnection();
PreparedStatement pstmt = null;
pstmt = conn.prepareStatement(sql);
int result = pstmt.excuteUpdate();
③ CallableStatement
○ 저장 프로시져를 호출하여 사용
○ 사전 작업 1
demo > BuildPath > ConfigureBuildPath > libraries > Add Exrernal JARS
> ojdbc6.jar의 원래 위치(app\itwill\product\11.2.0\dbhome_1\jdb\lib 추가
2. PreparedStatement 실습
DTO클래스
○ DTO(Data Transfer Object)
데이터를 전달해주는 역할
데이터가 포함된 객체를 한 시스템에서 다른 시스템으로 전달하는 작업을 처리하는 객체
package com.score7;
public class ScoreDTO {
//DB에 저장하는 값
private String hak;
private String name;
private int kor;
private int eng;
private int mat;
//DB에 없는 값
private int tot;
private int avg;
private int rank;
public String getHak() {
return hak;
}
public void setHak(String hak) {
this.hak = hak;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getKor() {
return kor;
}
public void setKor(int kor) {
this.kor = kor;
}
public int getEng() {
return eng;
}
public void setEng(int eng) {
this.eng = eng;
}
public int getMat() {
return mat;
}
public void setMat(int mat) {
this.mat = mat;
}
public int getTot() {
return tot;
}
public void setTot(int tot) {
this.tot = tot;
}
public int getAvg() {
return avg;
}
public void setAvg(int avg) {
this.avg = avg;
}
public int getRank() {
return rank;
}
public void setRank(int rank) {
this.rank = rank;
}
@Override
public String toString() {
String str;
str = String.format("%5s %8s %4d %4d %4d %4d %4d %4d",
hak,name,kor,eng,mat,tot,avg,rank);
return str;
}
}
DAO클래스
○ DAO(Data Access Object)
sql문을 DB에 전달하는 역할
Database의 data에 접근을 위한 객체
DB를 사용해 데이터를 조화하거나 조작하는 기능을 전담하도록 만든 오브젝트
package com.score7;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import com.db.DBConn;
public class ScoreDAO {
//1.insert
public int insertData(ScoreDTO dto){ //ScoreDTO를 전달해 줘야 함
int result = 0;
Connection conn = DBConn.getConnection();
PreparedStatement pstmt = null;
String sql;
try {
sql = "insert into score (hak,name,kor,eng,mat) ";
sql+= "values (?,?,?,?,?)"; //인수에 들어가는 개수만큼 ?로 표시
pstmt = conn.prepareStatement(sql); //sql문을 여기서 검사, 확인된 sql문을 넣음
pstmt.setString(1, dto.getHak()); //첫번째자리에 hak을 넣겠다
pstmt.setString(2, dto.getName());
pstmt.setInt(3, dto.getKor());
pstmt.setInt(4, dto.getEng());
pstmt.setInt(5, dto.getMat());
result = pstmt.executeUpdate(); //여기서는 검사할 필요가 없음
pstmt.close();
} catch (Exception e) { //원래는 이렇게 작성
try { pstmt.close();} catch (Exception e2) {}
try { DBConn.close();} catch (Exception e2) {}
}
return result;
}
//2.update
public int updateData(ScoreDTO dto){
int result = 0;
Connection conn = DBConn.getConnection();
PreparedStatement pstmt = null;
String sql;
try {
sql = "update score set kor=?,eng=?,mat=? ";
sql+= "where hak=?";
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, dto.getKor());
pstmt.setInt(2, dto.getEng());
pstmt.setInt(3, dto.getMat());
pstmt.setString(4, dto.getHak());
result = pstmt.executeUpdate();
pstmt.close();
} catch (Exception e) {
System.out.println(e.toString());
}
return result;
}
//3.delete
public int deleteData(String hak) {
int result = 0;
Connection conn = DBConn.getConnection();
PreparedStatement pstmt = null;
String sql;
try {
sql = "delete score where hak=?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, hak);
result = pstmt.executeUpdate();
pstmt.close();
} catch (Exception e) {
System.out.println(e.toString());
}
return result;
}
//4.selectAll
public List<ScoreDTO> getList(){
List<ScoreDTO> lists = new ArrayList<ScoreDTO>();
Connection conn = DBConn.getConnection();
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql;
try {
sql = "select hak,name,kor,eng,mat,";
sql+="(kor+eng+mat) tot,(kor+eng+mat)/3 avg,";
sql+= "rank() over (order by (kor+eng+mat) desc) rank ";
sql+= "from score";
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();
while(rs.next()){
ScoreDTO dto = new ScoreDTO();
dto.setHak(rs.getString("hak"));
dto.setName(rs.getString("name"));
dto.setKor(rs.getInt("kor"));
dto.setEng(rs.getInt("eng"));
dto.setMat(rs.getInt("mat"));
dto.setTot(rs.getInt("tot"));
dto.setAvg(rs.getInt("avg"));
dto.setRank(rs.getInt("rank"));
lists.add(dto);
}
rs.close();
pstmt.close();
} catch (Exception e) {
System.out.println(e.toString());
}
return lists;
}
//5.이름 검색
public List<ScoreDTO> getList(String name){
List<ScoreDTO> lists = new ArrayList<ScoreDTO>();
Connection conn = DBConn.getConnection();
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql;
try {
sql = "select hak,name,kor,eng,mat,";
sql+= "(kor+eng+mat) tot,(kor+eng+mat)/3 avg ";
sql+= "from score where name like ?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, "%"+name+"%");
rs = pstmt.executeQuery();
while(rs.next()){
ScoreDTO dto = new ScoreDTO();
dto.setHak(rs.getString("hak"));
dto.setName(rs.getString("name"));
dto.setKor(rs.getInt("kor"));
dto.setEng(rs.getInt("eng"));
dto.setMat(rs.getInt("mat"));
dto.setTot(rs.getInt("tot"));
dto.setAvg(rs.getInt("avg"));
lists.add(dto);
}
rs.close();
pstmt.close();
} catch (Exception e) {
System.out.println(e.toString());
}
return lists;
}
//6.학번 검색
public ScoreDTO getLists(String hak){
ScoreDTO dto = null;
Connection conn = DBConn.getConnection();
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql;
try {
sql = "select hak,name,kor,eng,mat,";
sql+= "(kor+eng+mat) tot,(kor+eng+mat)/3 avg ";
sql+= "from score where hak=?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, hak);
rs = pstmt.executeQuery();
if(rs.next()){
dto = new ScoreDTO();
dto.setHak(rs.getString("hak"));
dto.setName(rs.getString("name"));
dto.setKor(rs.getInt("kor"));
dto.setEng(rs.getInt("eng"));
dto.setMat(rs.getInt("mat"));
dto.setTot(rs.getInt("tot"));
dto.setAvg(rs.getInt("avg"));
}
rs.close();
pstmt.close();
} catch (Exception e) {
System.out.println(e.toString());
}
return dto;
}
}
Score클래스
○ 데이터를 입력하는 역할을 수행한다.
package com.score7;
import java.util.Iterator;
import java.util.List;
import java.util.Scanner;
public class Score {
Scanner sc = new Scanner(System.in);
ScoreDAO dao = new ScoreDAO();
//입력
public void insert(){
try {
ScoreDTO dto = new ScoreDTO();
System.out.print("학번:");
dto.setHak(sc.next());
System.out.print("이름:");
dto.setName(sc.next());
System.out.print("국어점수:");
dto.setKor(sc.nextInt());
System.out.print("수학점수:");
dto.setEng(sc.nextInt());
System.out.print("영어점수:");
dto.setMat(sc.nextInt());
int result = dao.insertData(dto);
if(result!=0)
System.out.println("추가에 성공했습니다");
else
System.out.println("추가에 실패했습니다");
} catch (Exception e) {
System.out.println(e.toString());
}
}
//수정
public void update(){
try {
ScoreDTO dto = new ScoreDTO();
System.out.print("수정 할 학번:");
dto.setHak(sc.next());
System.out.print("국어점수:");
dto.setKor(sc.nextInt());
System.out.print("수학점수:");
dto.setEng(sc.nextInt());
System.out.print("영어점수:");
dto.setMat(sc.nextInt());
int result = dao.updateData(dto);
if(result!=0)
System.out.println("수정에 성공했습니다");
else
System.out.println("수정에 실패했습니다");
} catch (Exception e) {
System.out.println(e.toString());
}
}
//삭제
public void delete(){
try {
System.out.print("삭제 할 학번:");
int result = dao.deleteData(sc.next());
if(result!=0)
System.out.println("삭제에 성공했습니다");
else
System.out.println("삭제에 실패했습니다");
} catch (Exception e) {
System.out.println(e.toString());
}
}
//전체출력
public void selectAll(){
List<ScoreDTO> lists = dao.getList();
Iterator<ScoreDTO> it = lists.iterator();
while(it.hasNext()){
ScoreDTO dto = it.next();
System.out.println(dto.toString());
}
}
//이름 검색
public void searchName(){
System.out.print("검색 할 이름:");
List<ScoreDTO> lists = dao.getList(sc.next());
Iterator<ScoreDTO> it = lists.iterator();
while(it.hasNext()){
ScoreDTO dto = it.next();
System.out.println(dto.toString());
}
}
//학번 검색
public void searchHak(){
System.out.print("검색 할 학번:");
ScoreDTO dto = dao.getLists(sc.next());
if(dto!=null)
System.out.println(dto.toString());
}
}
Main클래스
package com.score7;
import java.util.Scanner;
import com.db.DBConn;
public class ScoreMain {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int ch;
Score ob = new Score();
try {
while(true){
do{
System.out.print("1.입력 2.수정 3.삭제 4.전체출력 5.이름검색 6.종료 : ");
ch = sc.nextInt();
}while(ch<1 || ch>6);
switch(ch){
case 1:
ob.insert();
System.out.println(); break;
case 2:
ob.update();
System.out.println(); break;
case 3:
ob.delete();
System.out.println(); break;
case 4:
ob.searchAll();
System.out.println(); break;
case 5:
ob.searchNamel();
System.out.println(); break;
case 6:
DBConn.close();
System.exit(0);
}
}
} catch (Exception e) {
System.out.println(e.toString());
}
}
}
▶입력
1.입력 2.수정 3.삭제 4.전체출력 5.이름검색 6.학번검색 7.종료 : 1
학번:444
이름:전지현
국어점수:87
수학점수:75
영어점수:82
추가에 성공했습니다
1.입력 2.수정 3.삭제 4.전체출력 5.이름검색 6.학번검색 7.종료 : 4
111 배수지 86 97 84 267 89 1
222 김태리 98 87 79 264 88 2
333 박신혜 78 84 85 247 82 3
444 전지현 87 75 82 244 81 4
▶수정
1.입력 2.수정 3.삭제 4.전체출력 5.이름검색 6.학번검색 7.종료 : 2
수정 할 학번:111
국어점수:97
수학점수:90
영어점수:100
수정에 성공했습니다
1.입력 2.수정 3.삭제 4.전체출력 5.이름검색 6.학번검색 7.종료 : 4
111 배수지 97 90 100 287 95 1
222 김태리 98 87 79 264 88 2
333 박신혜 78 84 85 247 82 3
444 전지현 87 75 82 244 81 4
▶삭제
1.입력 2.수정 3.삭제 4.전체출력 5.이름검색 6.학번검색 7.종료 : 3
삭제 할 학번:444
삭제에 성공했습니다
1.입력 2.수정 3.삭제 4.전체출력 5.이름검색 6.학번검색 7.종료 : 4
111 배수지 97 90 100 287 95 1
222 김태리 98 87 79 264 88 2
333 박신혜 78 84 85 247 82 3
▶이름검색
1.입력 2.수정 3.삭제 4.전체출력 5.이름검색 6.학번검색 7.종료 : 5
검색 할 이름:태리
222 김태리 98 87 79 264 88 0
▶학번검색
1.입력 2.수정 3.삭제 4.전체출력 5.이름검색 6.학번검색 7.종료 : 6
검색 할 학번:333
333 박신혜 78 84 85 247 82 0
3. CallableStatement 실습
○프로시져 생성
cmd창에서 실행
SUZI계정에서 다음 프로시져들을 생성한다
① insertScore
create or replace procedure insertScore
(phak in score.hak%type,
pname in score.name%type,
pkor in score.kor%type,
peng in score.eng%type,
pmat in score.mat%type)
is
begin
insert into score (hak,name,kor,eng,mat)
values (phak,pname,pkor,peng,pmat);
commit;
end;
/
② updateScore
create or replace procedure updateScore
(phak in score.hak%type,
pkor in score.kor%type,
peng in score.eng%type,
pmat in score.mat%type)
is
begin
update score set kor=pkor,eng=peng,mat=pmat
where hak=phak;
commit;
end;
/
③ deleteScore
create or replace procedure deleteScore
(phak in score.hak%type)
is
begin
delete score where hak=phak;
commit;
end;
/
④ selectAllScore
create or replace procedure selectAllScore
(presult out sys_refcursor)
is
begin
open presult for
select hak,name,kor,eng,mat,
(kor+eng+mat) tot, (kor+eng+mat)/3 avg,
rank() over(order by (kor+eng+mat) desc) rank
from score order by hak;
end;
/
⑤ selectNameScore
create or replace procedure selectNameScore
(presult out sys_refcursor,
pname in varchar2)
is
begin
open presult for
select hak,name,kor,eng,mat,
(kor+eng+mat) tot, (kor+eng+mat)/3 avg
from score where name like '%'||pname||'%';
end;
/
⑥ selectHakScore
create or replace procedure selectHakScore
(presult out sys_refcursor,
phak in varchar2)
is
begin
open presult for
select hak,name,kor,eng,mat,
(kor+eng+mat) tot, (kor+eng+mat)/3 avg
from score where hak=phak;
end;
/
○ PreparedStatement 실습에서 DAO클래스만 다음과 같이 변경해준다
DAO클래스
package com.score8;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import oracle.jdbc.OracleTypes;
import com.db.DBConn;
public class ScoreDAO {
//1.insert
public int insertData(ScoreDTO dto){ //ScoreDTO를 전달해 줘야 함
int result = 0;
Connection conn = DBConn.getConnection();
CallableStatement cstmt = null;
String sql;
try {
sql ="{call insertScore(?,?,?,?,?)}";
cstmt = conn.prepareCall(sql); //sql문을 여기서 검사, 확인된 sql문을 넣음
cstmt.setString(1, dto.getHak()); //첫번째자리에 hak을 넣겠다
cstmt.setString(2, dto.getName());
cstmt.setInt(3, dto.getKor());
cstmt.setInt(4, dto.getEng());
cstmt.setInt(5, dto.getMat());
result = cstmt.executeUpdate(); //여기서는 검사할 필요가 없음
cstmt.close();
} catch (Exception e) { //원래는 이렇게 작성
try { cstmt.close();} catch (Exception e2) {}
try { DBConn.close();} catch (Exception e2) {}
}
return result;
}
//2.update
public int updateData(ScoreDTO dto){
int result = 0;
Connection conn = DBConn.getConnection();
CallableStatement cstmt = null;
String sql;
try {
sql = "{call updateScore(?,?,?,?)}";
cstmt = conn.prepareCall(sql);
cstmt.setString(1, dto.getHak());
cstmt.setInt(2, dto.getKor());
cstmt.setInt(3, dto.getEng());
cstmt.setInt(4, dto.getMat());
result = cstmt.executeUpdate();
cstmt.close();
} catch (Exception e) {
System.out.println(e.toString());
}
return result;
}
//3.delete
public int deleteData(String hak) {
int result = 0;
Connection conn = DBConn.getConnection();
CallableStatement cstmt = null;
String sql;
try {
sql = "{call deleteScore(?)}";
cstmt = conn.prepareCall(sql);
cstmt.setString(1, hak);
result = cstmt.executeUpdate();
cstmt.close();
} catch (Exception e) {
System.out.println(e.toString());
}
return result;
}
//4.selectAll
public List<ScoreDTO> getList(){
List<ScoreDTO> lists = new ArrayList<ScoreDTO>();
Connection conn = DBConn.getConnection();
CallableStatement cstmt = null;
ResultSet rs = null;
String sql;
try {
sql = "{call selectAllScore(?)}"; //출력할 결과를 받을 ?
cstmt = conn.prepareCall(sql);
//out파라미터의 자료형 설정
cstmt.registerOutParameter(1, OracleTypes.CURSOR);
//프로시져 실행
cstmt.executeUpdate();
//out파라미터의 값을 돌려받는다
rs = (ResultSet)cstmt.getObject(1);
while(rs.next()){
ScoreDTO dto = new ScoreDTO();
dto.setHak(rs.getString("hak"));
dto.setName(rs.getString("name"));
dto.setKor(rs.getInt("kor"));
dto.setEng(rs.getInt("eng"));
dto.setMat(rs.getInt("mat"));
dto.setTot(rs.getInt("tot"));
dto.setAvg(rs.getInt("avg"));
dto.setRank(rs.getInt("rank"));
lists.add(dto);
}
rs.close();
cstmt.close();
} catch (Exception e) {
System.out.println(e.toString());
}
return lists;
}
//5.이름 검색
public List<ScoreDTO> getList(String name){
List<ScoreDTO> lists = new ArrayList<ScoreDTO>();
Connection conn = DBConn.getConnection();
CallableStatement cstmt = null;
ResultSet rs = null;
String sql;
try {
sql = "{call selectNameScore(?,?)}"; //출력할 결과를 받을 ?
cstmt = conn.prepareCall(sql);
//out파라미터의 자료형 설정
cstmt.registerOutParameter(1, OracleTypes.CURSOR);
//in파라미터
cstmt.setString(2, name+"%");
//프로시져 실행
cstmt.executeUpdate();
//out파라미터의 값을 돌려받는다
rs = (ResultSet)cstmt.getObject(1);
while(rs.next()){
ScoreDTO dto = new ScoreDTO();
dto.setHak(rs.getString("hak"));
dto.setName(rs.getString("name"));
dto.setKor(rs.getInt("kor"));
dto.setEng(rs.getInt("eng"));
dto.setMat(rs.getInt("mat"));
dto.setTot(rs.getInt("tot"));
dto.setAvg(rs.getInt("avg"));
lists.add(dto);
}
rs.close();
cstmt.close();
} catch (Exception e) {
System.out.println(e.toString());
}
return lists;
}
//6.학번 검색
public ScoreDTO getLists(String hak){
ScoreDTO dto = null;
Connection conn = DBConn.getConnection();
CallableStatement cstmt = null;
ResultSet rs = null;
String sql;
try {
sql = "{call selectHakScore(?,?)}"; //출력할 결과를 받을 ?
cstmt = conn.prepareCall(sql);
//out파라미터의 자료형 설정
cstmt.registerOutParameter(1, OracleTypes.CURSOR);
//in파라미터
cstmt.setString(2, hak);
//프로시져 실행
cstmt.executeUpdate();
//out파라미터의 값을 돌려받는다
rs = (ResultSet)cstmt.getObject(1);
if(rs.next()){
dto = new ScoreDTO();
dto.setHak(rs.getString("hak"));
dto.setName(rs.getString("name"));
dto.setKor(rs.getInt("kor"));
dto.setEng(rs.getInt("eng"));
dto.setMat(rs.getInt("mat"));
dto.setTot(rs.getInt("tot"));
dto.setAvg(rs.getInt("avg"));
}
rs.close();
cstmt.close();
} catch (Exception e) {
System.out.println(e.toString());
}
return dto;
}
}
결과는 PreparedStatement 실습과 같다
'STUDY > JAVA' 카테고리의 다른 글
Java 21일차(1) - 다른 컴퓨터의 데이터베이스와 연결 (0) | 2019.02.06 |
---|---|
Java 20일차(2) - 회원가입 DB연결하여 만들기 (0) | 2019.02.01 |
Java 8일차 (0) | 2019.01.29 |
Java 7일차 (0) | 2019.01.28 |
Java 6일차 (0) | 2019.01.24 |
댓글