DATOR


Groovy SQL을 이용한 데이터 핸들링 #2

지난 강좌에 이어 이번엔 Groovy SQL의 유용한 기능들을 다음의 순서대로 알아보도록 하겠습니다.

1. 데이터베이스 접속
2. execute (Create / Insert / Update / Delete)
3. eachRow, rows (Select)
4. DataSet

1. 데이터베이스 접속
Groovy SQL에서 데이터베이스에 접속하는 방법은 아래와 같습니다.
 def sql = Sql.newInstance([JDBC DRIVER], [ID], [PASSWORD], [JDBC URL])

 def sql = Sql.newInstance('oracle.jdbc.driver.OracleDrive', 'userid', 'passwd', 'jdbc:oracle:thin:@192.168.1.36:1521:ora11g') 
 기존 어플리케이션에서 WAS를 사용하고 있고 사용하는 Data Source가 있다면
   def sql = Sql.newInstance(dataSource) 
기존에 사용하던 Connection 객체가 있다면   
 def sql = Sql.newInstance(connection) 
 이런식으로 넣어주면 됩니다.  
#. execute (Create / Insert / Update / Delete)
  위에서 생성한 sql 객체를 이용해서 진행을 합니다.
  * create 구문의 사용 

    sql.execute('''
    create table t1 (
      col1 varchar2(100)
     ,col2 varchar2(100)
    )
   ''')   

   간단하죠? 그런데 작은 따옴표를 3개 연달아 사용하고, 줄바꿈을 해주고 있습니다. 

   Groovy에서 지원하는 문자열 형식입니다. 덕분에 문자열 처리가 상당히 쉬워졌습니다.
* insert 구문의 사용      

   sql.execute('''
   insert into t1 (col1, col2) values ('유재석', '유느님'); 
   insert into t1 (col1, col2) values ('박명수', '2인자'); 
   insert into t1 (col1, col2) values ('정준아', '식신'); 
   ''')
    insert 구문도 마찬가지로 간단합니다. prepare 방식으로 넣고 싶을때는 아래와 같이 사용합니다.
   def insertSql =  '''
    insert into t1 (col1, col2) values (?, ?);
 '''
   sql.execute(insertSql, ['유재석', '유느님'])
   sql.execute(insertSql, ['박명수', '2인자'])
   sql.execute(insertSql, ['정준아', '식신'])
 

update, delete도 동일한 방법을 사용합니다.    

sql.execute("update t1 set col2 = '1인자' where col1 = '박명수'") 
배치작업이 필요한 경우에는 anonymous pl/sql block으로 작성하는 것보다 코드량을 훨씬 줄일 수 있습니다.

 * select 
 select에는 insert보다 좀 더 다양한 메서드가 지원되고 Closure를 최대한 활용합니다.
  - eachRow 

  sql.eachRow('''
   select * from t1
  ''') { row -> 
   println row.col1
   // 여기서 필요한 처리를 하면 됩니다. 
  } 

  select한 결과를 출력하는 코드가 몇줄 안됩니다. 조건을 주고 싶을때는 아래와 같이 처리합니다. 

  sql.eachRow('''
   select * from t1 where col1 = ? 
  ''', ['유재석']) { row -> 
   println row.col1   
  }

또는   

def name = '유재석'
  sql.eachRow('''
   select * from t1 where col1 = ${name}
  ''') { row -> 
   println row.col1   
  }

  closure에 익숙하지 않다면 다음과 같이 rows를 이용해도 됩니다. 

  def list = sql.rows('select * from t1') 
    조건을 주고 싶을때는 이렇게 하면 됩니다.
  def list = sql.rows("select * from t1 where col1 = ${col1}")
  for (def row : list) {
   println row.col1
  } 
  뭔가 자동화된 작업을 하려고 할때는 DBMS의 메타데이터를 활용해야 할 경우가 자주 있습니다.
  select 쿼리 결과의 메타데이터를 가지고 작업해야 할 경우에는 다음과 같습니다.   
  sql.query('select * from t1') { rs ->
 def meta = rs.metaData
   for (i in 0..<meta.columnCount) {
    println "${meta.getColumnLabel(i + 1)} / ${rs.getObject(i)}"
   }
  } 

 "${}" 문자열은 GString에서 지원하는 특별한 기능입니다. 

이번 강좌는 여기까지입니다. DataSet은 다음 강좌에서 알아보도록 하겠습니다.

.

Leave Comments

댓글 쓰기 권한이 없습니다. 회원 가입후에 사용 가능합니다