如何在grails中搜索多个数据库

时间:2014-04-30 04:53:18

标签: spring hibernate grails groovy

在我的grails应用程序中,有一个Customer域和相关的customer表。 Java Web应用程序使用另一个数据库,该数据库还具有客户域和相关客户表。

另请注意,这两个应用程序使用两个不同的数据库。

我的grails应用程序中有一个客户搜索屏幕,当用户搜索带有字符串的客户时,我需要在两个数据库中搜索记录。

如何在grails中实现此要求?

我可以在不是由grails生成的数据库表上使用GORM(我想,我可以使用hibernate映射来实现)?

2 个答案:

答案 0 :(得分:1)

我们可以通过两种方式实现:

  1. 使用GORM(如果它们有相同的列)
  2. 使用查询
  3. 方式1:

    在DataSource.groovy中创建两个数据源。 对于已创建的数据库,在定义数据源时不要给出dbcreate选项。这将防止在创建客户对象时,它将仅在Test1数据库中创建记录。 两个数据库都有Customer表。所以我们可以使用GORM访问数据。因为必须在域中定义数据源'ALL'

    Test1的Customer表包含名称和年龄列 Test2的客户表包含姓名,电子邮件和电话。

    通过GORM,我们只能访问域属性。所以我只能从Test2的客户表中访问名称。

    在DataSource.groovy中,

    dataSource {
        pooled = true
        driverClassName = "com.mysql.jdbc.Driver"
        username = "admin"
        password = "admin"
    }
    hibernate {
        cache.use_second_level_cache = true
        cache.use_query_cache = false
        cache.region.factory_class = 'net.sf.ehcache.hibernate.EhCacheRegionFactory' // Hibernate 3
    //    cache.region.factory_class = 'org.hibernate.cache.ehcache.EhCacheRegionFactory' // Hibernate 4
    }
    
    // environment specific settings
    environments {
        development {
            dataSource {
                dbCreate = "update" // one of 'create', 'create-drop', 'update', 'validate', ''
                url = "jdbc:mysql://localhost:3306/test1"
            }
            dataSource_test2 {
                driverClassName = 'com.mysql.jdbc.Driver'
                username = "admin"
                             password = "admin"
                url = "jdbc:mysql://localhost:3306/test2"
            }
        }
        test {
            dataSource {
                dbCreate = "update"
                url = 
    
    
    
       "jdbc:h2:mem:testDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE"
                    }
                }
        ..........
        .......
    

    在Customer.groovy中,

    class Customer {
    
        static constraints = {
        }
        String name
        int age
    
        static mapping = {
            datasource 'ALL'
         }
    }
    

    在控制器中,

    class CustomerController {
    
        def dataSource_test2
    
        def testingDB(){
                Customer.test2.list().each{
                    println it.name
                }
                println Customer.list()
                render "hi"
    
        }
    }
    

    方式2:

    class MainController {
    
    def dataSource_test2
    
        def index() { 
            String nameSql = "select * from customer"
            Sql sql = new Sql(dataSource_test2)
            def rows = sql.rows(nameSql)
            println rows
    
        }
    
    }
    

答案 1 :(得分:1)

这个直接的方法有以下几个选项:

1.您可能需要在数据源groovy文件上为其他Java Web应用程序的数据库源定义新的数据库环境。

newenvironmentname {
        dataSource {
            dbCreate = "update" // one of 'create', 'create-drop', 'update', 'validate', ''
            url = "jdbc:mysql://localhost:3306/test1"
        }

然后在您想要在控制器上访问此数据源时加载或切换到环境中。

2.您需要使用groovy和

定义sql连接
import groovy.sql.Sql
sql = Sql.newInstance( 'jdbc:jtds:sqlserver:
      //serverName/dbName-CLASS;domain=domainName', 'username', 'password'
      ,'net.sourceforge.jtds.jdbc.Driver' )
sql.eachRow( 'select * from tableName' ) 
           { println "$it.id -- ${it.firstName} --" }

这可能不是最好的方法......

相关问题