在前一篇文章裏,咱們學習了在Grails應用中使用Hibernate SQL。一樣的,咱們也可使用Groovy SQL執行自定義的SQL語句。咱們必須建立一個groovy.sql.Sql
實例來執行SQL代碼。最簡單的方式就是將javax.sql.DataSources
做爲一個構造函數的參數傳給groovy.sql.Sql
。在Grails應用的上下文中,已經存在一個DataSource
實例,咱們只須要將其注入到咱們的代碼中。在Grails應用中必須使用dataSource
來引用那個默認的數據源。html
在下面的樣例中,咱們使用Groovy SQL執行一個自定義查詢。請注意,在Grails service PersonService
中,咱們定義了一個屬性dataSource
,Grails會自動注入一個DataSouce
實例。java
package com.mrhaki.grails import groovy.sql.Sql import groovy.sql.GroovyRowResult class PersonService { // Reference to default datasource. def dataSource List<GroovyRowResult> allPersons(final String searchQuery) { final String searchString = "%${searchQuery.toUpperCase()}%" final String query = '''\ select id, name, email from person where upper(email collate UNICODE_CI_AI) like :search ''' // Create new Groovy SQL instance with injected DataSource. final Sql sql = new Sql(dataSource) final results = sql.rows(query, search: searchString) results } }
在Grails應用中,能夠將groovy.sql.Sql
實例定義爲一個Spring bean。這樣,咱們就能夠將Sql
實例注入到咱們的service中了。在grails-app/conf/spring/resources.groovy
,咱們定義一個Sql
bean:spring
// File: grails-app/conf/spring/resources.groovy beans = { // Create Spring bean for Groovy SQL. // groovySql is the name of the bean and can be used // for injection. groovySql(groovy.sql.Sql, ref('dataSource')) }
如今咱們使用groovySql
bean重寫上的例子:sql
package com.mrhaki.grails import groovy.sql.GroovyRowResult class PersonService { // Reference to groovySql defined in resources.groovy. def groovySql List<GroovyRowResult> allPersons(final String searchQuery) { final String searchString = "%${searchQuery.toUpperCase()}%" final String query = '''\ select id, name, email from person where upper(email collate UNICODE_CI_AI) like :search ''' // Use groovySql bean to execute the query. final results = groovySql.rows(query, search: searchString) results } }
以上使用的是Grails 2.3.7。app