Groovy Sql模块的基本使用示例教程

标签:

本文出自jvm123.com-java技术分享站:http://jvm123.com/2019/10/groovy-sql.html

Groovy的groovy-sql 模块是对 JDBC 的高度抽象,提供了对关系型数据库的支持。 groovy-sql 模块中最常用到的是 groovy.sql.Sql 类,这个类又把JDBC的对关系型数据库访问的抽象度提高了一级。

Groovy连接数据库

Sql. newInstance

Groovy连接数据库使用  newInstance  静态方法参数分别为:

参数示例(HSQLDB)
urljdbc:hsqldb:mem:yourdb
usersa (or your username)
passwordyourPassword
driverorg.hsqldb.jdbcDriver

完整示例如下:

import groovy.sql.Sql

def url = 'jdbc:hsqldb:mem:yourDB'
def user = 'sa'
def password = ''
def driver = 'org.hsqldb.jdbcDriver'
def sql = Sql.newInstance(url, user, password, driver)

// use 'sql' instance ...

sql.close()

以下以mysql为例,使用如下:

    url = "jdbc:mysql://localhost:3306/test?serverTimezone=UTC&characterEncoding=UTF-8&useUnicode=true"
    sql = Sql.newInstance(url, "root", "root", "com.mysql.cj.jdbc.Driver")
    List<GroovyRowResult> testList = sql.rows("select * from test")

        for (GroovyRowResult row : testList) {
            println row
            println row.get("id")
            println row.get("name")
            println row.get("remark")
        }
        println testList

    sql.close()

Sql.withInstance

Sql.withInstance 可以自动关闭sql实例,不需要手动调用 sql.close() 方法。使用如下:

Sql.withInstance(url, user, password, driver) { sql ->
  // use 'sql' instance ...
}

new Sql(dataSource)

对于一个已有的数据源datasource,创建sql实例连接可使用 new Sql(dataSource), 如下代码:

import groovy.sql.Sql
import org.hsqldb.jdbc.JDBCDataSource

def dataSource = new JDBCDataSource(database: 'jdbc:hsqldb:mem:yourDB', user: 'sa', password: '')
def sql = new Sql(dataSource)

// use then close 'sql' instance ...

此外,还可以使用数据库连接池以及@Grab实例化Sql,连接数据库,详情可以参考文档

Groovy执行SQL语句

可以使用sql实例的  execute()  方法执行任意的SQL语句。

创建数据表示例:

// ... create 'sql' instance
sql.execute '''
  CREATE TABLE Author (
    id          INTEGER GENERATED BY DEFAULT AS IDENTITY,
    firstname   VARCHAR(64),
    lastname    VARCHAR(64)
  );
'''
// close 'sql' instance ...

添加数据行 insert

添加数据可以使用execute方法,如下:

sql.execute "INSERT INTO Author (firstname, lastname) VALUES ('Dierk', 'Koenig')"

也可以使用 executeInsert 方法。

sql.executeInsert 执行sql语句

List<List<Object>> keysList =
                sql.executeInsert("INSERT INTO Author (firstname, lastname) VALUES ('Dierk', 'Koenig')")

执行的sql语句可以是批量插入语句,所以sql.executeInsert方法的返回值是多次insert之后自动生成的列的list。一般自动生成的是主键等。

sql.executeInsert 执行预编译sql语句

def insertSql = 'INSERT INTO Author (firstname, lastname) VALUES (?,?)'
def params = ['Jon', 'Skeet']
def keys = sql.executeInsert(insertSql, params)
def insertSql1 = 'INSERT INTO Author (firstname, lastname) VALUES (:firstname,:firstname)'
def paramMap = ['firstname':'Jon', 'lastname':'Skeet']
def keys1 = sql.executeInsert(paramMap, insertSql1)

sql.executeInsert 使用GString参数

def first = 'Guillaume'
def last = 'Laforge'
def myKeyNames = ['ID']
def myKeys = sql.executeInsert("""
          INSERT INTO Author (firstname, lastname)
          VALUES (${first}, ${last})
        """, myKeyNames)

sql.executeInsert 的返回值

此外,以上三个 executeInsert 方法都可以传入最后一个参数 List<Object> keyColumnNames, 这个参数就是需要返回的 column 的列名的list。

返回值就是多次insert之后自动生成的这些列的list。

更新数据行 executeUpdate

sql.execute "UPDATE Author SET firstname='Erik' where lastname='Thorvaldsson'"
def updateSql = "UPDATE Author SET lastname='Pragt' where lastname='Thorvaldsson'"
def updateCount = sql.executeUpdate(updateSql)
assert updateCount == 1

删除数据行 execute

boolean r = sql.execute("DELETE FROM Author WHERE lastname = 'Skeet'")

Groovy Sql数据查询

Groovy Sql的数据查询可以使用 queryeachRowfirstRow 和 rows方法,如下:

query 查询数据

def expected = ['Dierk Koenig', 'Jon Skeet', 'Guillaume Laforge']

def rowNum = 0
sql.query('SELECT firstname, lastname FROM Author') { resultSet ->
  while (resultSet.next()) {
    def first = resultSet.getString(1)
    def last = resultSet.getString('lastname')
    assert expected[rowNum++] == "$first $last"
  }
}

eachRow数据查询

rowNum = 0
sql.eachRow('SELECT firstname, lastname FROM Author') { row ->
  def first = row[0]
  def last = row.lastname
  assert expected[rowNum++] == "$first $last"
}

firstRow数据查询

def first = sql.firstRow('SELECT lastname, firstname FROM Author')
assert first.values().sort().join(',') == 'Dierk,Koenig'

rows数据查询

List authors = sql.rows('SELECT firstname, lastname FROM Author')
assert authors.size() == 3
assert authors.collect { "$it.FIRSTNAME ${it[-1]}" } == expected

sql函数查询

assert sql.firstRow('SELECT COUNT(*) AS num FROM Author').num == 3

其他 groovy-sql 高级内容请参考:

发表评论