在前一篇文章里,咱们学习了在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