# executeQuery
- 질의 실행, 결과 가져오기, 출력
ResultSet rset = stmt.executeQuery( "select dept_name, avg (salary)
from instructor
group by dept_name");
while (rset.next()) {
System.out.println(rset.getString("dept_name") + "" + rset.getFloat(2));}
- SQL 결과와 Java 변수 바인딩
string d_name; float sal;
ResultSet rset = stmt.executeQuery("select dept_name, avg (salary)
from instructor
group by dept_name");
while (rset.next()) {
d_name = rset.getString("dept_name");
sal = rset.getFloat(2);
System.out.println(d_name + " " + sal);
}
- 결과 필드 얻기 (속성의 이름이나 위치) :
rs.getString(“dept_name”) = rs.getString(1)
- null 값 처리
int a = rs.getInt(“a”);
if (rs.wasNull()) Systems.out.println(“Got null value”);
# executeUpdate
- 데이터베이스에 갱신
try {
stmt.executeUpdate("insert into instructor values(’77987’, ’Kim’, ’Physics’, 98000)");
} catch (SQLException sqle)
{
System.out.println("Could not insert tuple. " + sqle);
}
# 준비된 구문 – preparedStatement
PreparedStatement pStmt = conn.prepareStatement(
"insert into instructor values(?,?,?,?)");
pStmt.setString(1, "88877");
pStmt.setString(2, "Perry");
pStmt.setString(3, "Finance");
pStmt.setInt(4, 125000);
pStmt.executeUpdate();
pStmt.setString(1, "88878");
pStmt.executeUpdate();
# 메타데이터
- ResultSet metadata
- 질의를 실행한 후 결과 집합 rs를 가져올 때 :
ResultSetMetaData rsmd = rs.getMetaData();
for(int i = 1; i <= rsmd.getColumnCount(); i++) {
System.out.println(rsmd.getColumnName(i));
System.out.println(rsmd.getColumnTypeName(i))
}
=> 결과 집합의 모든 열의 타입과 이름을 출력
- 메타데이터는 데이터베이스에 대한 아무 정보 없이 도출 가능
- DatabaseMetabase 인터페이스 :
데이터베이스에 대한 메타데이터를 찾는 방법을 제공함
객체를 반환하는 “getMetaData()” 메소드 가짐
DatabaseMetaData dbmd = conn.getMetaData();
ResultSet rs = dbmd.getColumns(null, "univdb", "department", "%");
while( rs.next()) {
System.out.println(rs.getString("COLUMN_NAME"),
rs.getString("TYPE_NAME");
}
- 다른 메소드 : 릴레이션, 외래 키 참조, 인증, 접속되는 최대 수
# JDBC에서 트랜잭션 처리
- 자동 커밋 (default)
- 자동 커밋 off
conn.setAutoCommit(false);
트랜잭션을 커밋하거나 롤백 해야함
conn.commit();
conn.rollback();
- 자동 커밋 on
conn.setAutoCommit(true)
# 대형 객체 불러오기
- getBlob() 와 getClob() 메소드
- blob 와 clob 타입의 객체를 반환
- 객체 전체를 저장하는게 아니라 위치자(포인터)를 저장함
- getBytes()를 통해 객체에서 데이터 불러옴
예)
Statement sta = con.createStatement();
ResultSet res = sta.executeQuery("SELECT * FROM Image");
int i = 0;
while (res.next() && i<3) {
i++; System.out.println("Record ID: "+res.getInt("ID"));
System.out.println(" Subject = "+res.getString("Subject"));
Blob bodyOut = res.getBlob("Body");
int length = (int) bodyOut.length();
System.out.println(" Body Size = "+length);
byte[ ] body = bodyOut.getBytes(1, length);
String bodyHex = bytesToHex(body, 32);
System.out.println(" Body in HEX = "+bodyHex+"...");
// bodyOut.free(); // new in JDBC 4.0
}
res.close();
sta.close();
# 대형 객체 설정
- setBlob(int parameterIndex, InputStream inputStream)
- 입력 스트림에 연결함
예)
String INSERT_PICTURE = "insert into blob1 values (?)";
FileInputStream fis = null;
PreparedStatement ps = null;
try {
conn.setAutoCommit(false);
File file = new File("1.wma");
fis = new FileInputStream(file);
byte b[ ] = new byte[(int)file.length()];
fis.read(b);
System.out.println(b.length);
java.sql.Blob b2 = new SerialBlob(b);
ps = conn.prepareStatement(INSERT_PICTURE);
ps.setBlob(1,b2);
ps.executeUpdate();
conn.commit();
System.out.println("Record inserted successfully");
} catch(Exception ex){
ex.printStackTrace();
throw ex;
}
finally {
ps.close();
fis.close();
}
'전공 공부 > 데이터베이스시스템' 카테고리의 다른 글
프로시저 (0) | 2021.01.03 |
---|---|
내장 SQL (0) | 2021.01.03 |
JDBC 코드 예시 (0) | 2021.01.03 |
JDBC와 ODBC (0) | 2021.01.03 |
프로그래머스 MySQL (level 1) (0) | 2021.01.02 |