GroovyでuroboroSQLをさくっと試してみる

## 概要

Groovyスクリプトにて、オープンソースの[uroboroSQL](https://github.com/future-architect/uroborosql)を試してみました。
uroboroSQLのドキュメントは[こちら](https://future-architect.github.io/uroborosql-doc/)

### サンプルのツリー構造
* sqlはsqlフォルダ配下に配置する

```
$ tree .                                                                                                                              .
├── logback.xml
├── sql
│   ├── ddl
│   │   └── createTable.sql
│   └── dml
│       ├── delete.sql
│       ├── insert.sql
│       └── select.sql
└── uroborotest.groovy
```

### 実行するSQL
```sql:sql/ddl/createTable.sql
create table if not exists  address (
    id bigserial,
    name text,
    zip text
)
```

```sql:sql/dml/delete.sql
delete from address
```

```sql:sql/dml/insert.sql
insert into address(name,zip) values (/*name*/'',/*zip*/'')
```

```sql:sql/dml/select.sql
select id,name,zip from address
where name = /*name*/''
```

### ログ設定

uroborosqlのレベルを変更(DEBUG)にすることにより、展開されたSQLやパラメータ等が詳細に表示されます

```logback.xml
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
	<!-- logを標準出力に出力 -->
	<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
		<!-- ターゲットを標準出力へ -->
		<Target>System.out</Target>
		<!-- パターンレイアウト -->
		<encoder>
			<pattern>[%-5p] %m%n</pattern>
		</encoder>
	</appender>

	<logger name="jp.co.future.uroborosql" level="${LOGLEVEL}" />

	<appender name="CoverageLog" class="ch.qos.logback.core.FileAppender">
		<file>target/coverage.log</file>
		<append>true</append>
		<encoder>
			<pattern>%m%n</pattern>
		</encoder>
	</appender>

	<logger name="jp.co.future.uroborosql.coverage" level="TRACE"
			additivity="false">
		<appender-ref ref="CoverageLog" />
	</logger>


	<!-- ログ出力に関する設定 -->
	<root>
		<!-- 出力するレベルを設定 -->
		<level value="INFO" />

		<!-- アペンダを設定 -->
		<appender-ref ref="STDOUT" />
	</root>
</configuration>
```

### Groovyスクリプト

```groovy:uroborotest.groovy
//@GrabConfig( systemClassLoader=true )
@Grab(group='jp.co.future', module='uroborosql', version='0.2.0') 
@Grab(group='org.postgresql', module='postgresql', version='42.1.3')
@Grab(group='ch.qos.logback', module='logback-classic', version='1.2.3')

import jp.co.future.uroborosql.* 
import jp.co.future.uroborosql.config.* 
import jp.co.future.uroborosql.store.* 

def url = "jdbc:postgresql://127.0.0.1:5432/dbname"
def usr = "user"
def psw = "password"

//Class.forName("org.postgresql.Driver")

// DB接続情報を設定
def config = DefaultSqlConfig.getConfig(url, usr, psw)
def sqlContextFactory = config.getSqlContextFactory()
sqlContextFactory.initialize();

// SqlAgentを作成
def agent = config.createAgent()

// テーブルを作成 (sqlファイルの指定では、拡張子は指定しない)
agent.update("ddl/createTable").count()

// データの削除
def count = agent.update("dml/delete").count()
println("$count rows deleted")

// 挿入するデータ
def params =  [ 
    [ name: 'Mr.Bean'      , zip: 'UK' ]
,   [ name: 'Mr.Nagashima' , zip: 'JP' ]
]

// データの更新(バッチモード)
def updater = agent.update("dml/insert")
params.each { 
    updater.paramMap(it)
    updater.addBatch()
}
def result = updater.batch()
println("${result.size()} rows created")


// データの選択
def selector = agent.query("dml/select")
selector.param("name","Mr.Nagashima").collect().each {
    println(it)
}

// 処理終了
agent.commit()
agent.close()
```

### 実行結果

-DLOGLEVELにINFO|DEBUG|TRACEのいずれかを指定することで、uroboroSQLのログレベルを調整できます

```shell-session
$ groovy --version                                                           
Groovy Version: 2.4.10 JVM: 1.8.0_121 Vendor: Oracle Corporation OS: Linux

$ groovy -DLOGLEVEL=DEBUG uroborotest.groovy
[DEBUG] Start loading SQL template.[/mnt/ramdisk/uroborosql/sql]
[DEBUG] Loading SQL template.[]
[DEBUG] Loading SQL template.[dml]
[DEBUG] Loading SQL template.[ddl]
[DEBUG] Executed SQL[
create table if not exists  address (
    id bigserial,
    name text,
    zip text
)
]
[DEBUG] Execute update SQL.
[DEBUG] SQL execution time [ddl/createTable] : [00:00:00.002]
[DEBUG] Executed SQL[
delete from address
]
[DEBUG] Execute update SQL.
[DEBUG] SQL execution time [dml/delete] : [00:00:00.000]
2 rows deleted
[DEBUG] Executed SQL[
insert into address(name,zip) values (?/*name*/,?/*zip*/)
]
[DEBUG] 2 items Added for batch process.
[DEBUG] Execute batch process.
[DEBUG] SQL execution time [dml/insert] : [00:00:00.002]
2 rows created
[DEBUG] Executed SQL[
select id,name,zip from address
where name = ?/*name*/
]
[DEBUG] Set the parameter.[INDEX[1], Parameter name[name], Value[Mr.Nagashima], Class[String]]
[DEBUG] Execute search SQL.
[DEBUG] SQL execution time [dml/select] : [00:00:00.008]
[ID:54, NAME:Mr.Nagashima, ZIP:JP]
```