Groovy Sql模块的基本使用示例教程
2019-10-03 16:13:47.0
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 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> 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 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的数据查询可以使用 query, eachRow, firstRow 和 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 高级内容请参考:
http://jvm123.com/2019/10/groovy-sql-advance.html
2019-10-03 16:13:47.0