First they ignore you
then they ridicule you
then they fight you
then you win
    -- Mahatma Gandhi
Chinese => English     英文 => 中文             
随笔-219  评论-1047  文章-0  trackbacks-0
由于在过去一段时间内,已有多位朋友向我询问如何用Grails处理遗留数据库,为了回答这个问题。我给出一个实例,并适当讲解,不足之处,敬请谅解。

在Grails0.6+中,配置稍有不同,详见 朝花夕拾——Groovy & Grails

我使用的数据库为MySQL5,其中存在一个名为legacy_dev的schema,legacy_dev中有一张表叫user:



1,创建Grails应用程序,我将它命名为legacy:grails create-app legacy
2,创建一个域类User:grails create-domain-class User
3,修改grails-app\domain\User.groovy的内容,如下所示:
class  User { 
    String userId
    String password
    
    
static  constraints  =  {
        userId(blank:
false , maxSize: 16 )    
        password(blank:
false , maxSize: 45 )
    }
}    

4,生成与域类User相关的所有Grails应用程序工件(artifact):grails generate-all User
5,将grails-app\conf\DevelopmentDataSource.groovy的内容改为:

class  DevelopmentDataSource {
   
boolean  pooling  =   true
   
//  将这行注释掉
   
// String dbCreate = 'update'  //  one of 'create', 'create-drop','update'
   
//  url和driver要正确
   String url  =   " jdbc:mysql://localhost:3306/legacy_dev "
   String driverClassName 
=   " com.mysql.jdbc.Driver "
   String username 
=   " root "
   String password 
=   ""   //  这里为您的密码 :)
}

6,自行配置Hibernate:
hibernate.cfg.xml
<? xml version='1.0' encoding='UTF-8' ?>
<! DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"
>

< hibernate-configuration >
    
< session-factory >
        
< property  name ="connection.driver_class" > com.mysql.jdbc.Driver </ property >
        
< property  name ="connection.url" > jdbc:mysql://localhost:3306/legacy_dev </ property >
        
< property  name ="connection.username" > root </ property >
        
< property  name ="connection.password" ></ property >
        
< property  name ="connection.pool_size" > 1 </ property >
        
< property  name ="dialect" > org.hibernate.dialect.MySQLDialect </ property >
        
< property  name ="current_session_context_class" > thread </ property >
        
< property  name ="cache.provider_class" > org.hibernate.cache.NoCacheProvider </ property >
        
< property  name ="show_sql" > true </ property >
        
< property  name ="hbm2ddl.auto" > validate </ property >
        
< mapping  resource ="User.hbm.xml" />
    
</ session-factory >
</ hibernate-configuration >

User.hbm.xml
<? xml version="1.0" ?>
<! DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>

< hibernate-mapping >
    
< class  name ="User"  table ="user" >
        
< id  name ="userId"  column ="user_id"  type ="java.lang.String"  length ="16" >
          
   <generator class="assigned" /> 
        
</id>
        
<property name="password" column="password" type="java.lang.String" length="45" /> 
    
</class>
</hibernate-mapping>

最后,别忘了修改grails-app\controllers\UserController.groovy以及各GSP的代码
(试验代码时,请不要在Edit User页面中更新用户的userId,否则出发生异常,因为‘主键’不可更改。
在自己的应用程序中,可以disable掉Edit User页面中的User Id文本域)

UserController.groovy
            
class  UserController {
    def index 
=  { redirect(action:list,params:params) }

    
//  the delete, save and update actions only
    
//  accept POST requests
    def allowedMethods  =  [delete: ' POST ' ,
                          save:
' POST ' ,
                          update:
' POST ' ]

    def list 
=  {
        
if ( ! params.max)params.max  =   10
        [ userList: User.list( params ) ]
    }

    def show 
=  {
        
// [ user : User.get( params.id ) ]
        [ user : User.findByUserId(params.id) ]
    }

    def delete 
=  {
        
// def user = User.get( params.id )
        def user  =  User.findByUserId(params.id)
        
if (user) {
            user.delete()
            flash.message 
=   " User ${params.id} deleted. "
            redirect(action:list)
        }
        
else  {
            flash.message 
=   " User not found with id ${params.id} "
            redirect(action:list)
        }
    }

    def edit 
=  {
        
// def user = User.get( params.id )
        def user  =  User.findByUserId(params.id)
        
if ( ! user) {
                flash.message 
=   " User not found with id ${params.id} "
                redirect(action:list)
        }
        
else  {
            
return  [ user : user ]
        }
    }


    def update 
=  {
        
// def user = User.get( params.id )
        def user  =  User.findByUserId(params.id)
        
if (user) {
            user.properties 
=  params
            
if (user.save()) {
                
// redirect(action:show,id:user.id)
                redirect(action:show,id:user.userId)
            }
            
else  {
                render(view:
' edit ' ,model:[user:user])
            }
        }
        
else  {
            flash.message 
=   " User not found with id ${params.id} "
            redirect(action:edit,id:params.id)
        }
    }

    def create 
=  {
        def user 
=   new  User()
        user.properties 
=  params
        
return  [ ' user ' :user]
    }

    def save 
=  {
        def user 
=   new  User()
        user.properties 
=  params
        
if (user.save()) {
            
// redirect(action:show,id:user.id)
            redirect(action:show,id:user.userId)
        }
        
else  {
            render(view:
' create ' ,model:[user:user])
        }
    }

}

grails-app\views\user\list.gsp
  
< html >
    
< head >
         
< meta  http-equiv ="Content-Type"  content ="text/html; charset=UTF-8" />
         
< meta  name ="layout"  content ="main"   />
         
< title > User List </ title >
    
</ head >
    
< body >
        
< div  class ="nav" >
            
< span  class ="menuButton" >< href ="${createLinkTo(dir:'')}" > Home </ a ></ span >
            
< span  class ="menuButton" >< g:link  action ="create" > New User </ g:link ></ span >
        
</ div >
        
< div  class ="body" >
           
< h1 > User List </ h1 >
            
< g:if  test ="${flash.message}" >
                 
< div  class ="message" >
                       ${flash.message}
                 
</ div >
            
</ g:if >
           
< table >
             
< thead >
               
< tr >
               
<!--
                           <g:sortableColumn property="id" title="Id" />
                
-->
                           
< g:sortableColumn  property ="userId"  title ="User Id"   />
                  
                           
< g:sortableColumn  property ="password"  title ="Password"   />
                  
                        
< th ></ th >
               
</ tr >
             
</ thead >
             
< tbody >
               
< g:each  in ="${userList}" >
                    
< tr >
                       
<!--
                            <td>${it.id?.encodeAsHTML()}</td>
            
-->
                       
                            
< td > ${it.userId?.encodeAsHTML()} </ td >
                       
                            
< td > ${it.password?.encodeAsHTML()} </ td >
                       
                       
< td  class ="actionButtons" >
                
<!--
                            <span class="actionButton"><g:link action="show" id="${it.id}">Show</g:link></span>
                
-->
                
< span  class ="actionButton" >< g:link  action ="show"  id ="${it.userId}" > Show </ g:link ></ span >
                       
</ td >
                    
</ tr >
               
</ g:each >
             
</ tbody >
           
</ table >
               
< div  class ="paginateButtons" >
                   
< g:paginate  total ="${User.count()}"   />
               
</ div >
        
</ div >
    
</ body >
</ html >

grails-app\views\user\show.gsp
  
< html >
    
< head >
         
< meta  http-equiv ="Content-Type"  content ="text/html; charset=UTF-8" />
          
< meta  name ="layout"  content ="main"   />
         
< title > Show User </ title >
    
</ head >
    
< body >
        
< div  class ="nav" >
            
< span  class ="menuButton" >< href ="${createLinkTo(dir:'')}" > Home </ a ></ span >
            
< span  class ="menuButton" >< g:link  action ="list" > User List </ g:link ></ span >
            
< span  class ="menuButton" >< g:link  action ="create" > New User </ g:link ></ span >
        
</ div >
        
< div  class ="body" >
           
< h1 > Show User </ h1 >
           
< g:if  test ="${flash.message}" >
                 
< div  class ="message" > ${flash.message} </ div >
           
</ g:if >
           
< div  class ="dialog" >
                 
< table >
                   
                   
< tbody >
                   
<!--
                        <tr class="prop">
                              <td valign="top" class="name">Id:</td>
                              
                                    <td valign="top" class="value">${user.id}</td>
                              
                        </tr>
                   
-->
                        
< tr  class ="prop" >
                              
< td  valign ="top"  class ="name" > User Id: </ td >
                              
                                    
< td  valign ="top"  class ="value" > ${user.userId} </ td >
                              
                        
</ tr >
                   
                        
< tr  class ="prop" >
                              
< td  valign ="top"  class ="name" > Password: </ td >
                              
                                    
< td  valign ="top"  class ="value" > ${user.password} </ td >
                              
                        
</ tr >
                   
                   
</ tbody >
                 
</ table >
           
</ div >
           
< div  class ="buttons" >
               
< g:form  controller ="user" >
        
<!--
                 <input type="hidden" name="id" value="${user?.id}" />
        
-->
        
< input  type ="hidden"  name ="id"  value ="${user?.userId}"   />
                 
< span  class ="button" >< g:actionSubmit  value ="Edit"   /></ span >
                 
< span  class ="button" >< g:actionSubmit  value ="Delete"   /></ span >
               
</ g:form >
           
</ div >
        
</ div >
    
</ body >
</ html >

grails-app\views\user\create.gsp
  
< html >
    
< head >
         
< meta  http-equiv ="Content-Type"  content ="text/html; charset=UTF-8" />
         
< meta  name ="layout"  content ="main"   />
         
< title > Create User </ title >          
    
</ head >
    
< body >
        
< div  class ="nav" >
            
< span  class ="menuButton" >< href ="${createLinkTo(dir:'')}" > Home </ a ></ span >
            
< span  class ="menuButton" >< g:link  action ="list" > User List </ g:link ></ span >
        
</ div >
        
< div  class ="body" >
           
< h1 > Create User </ h1 >
           
< g:if  test ="${flash.message}" >
                 
< div  class ="message" > ${flash.message} </ div >
           
</ g:if >
           
< g:hasErrors  bean ="${user}" >
                
< div  class ="errors" >
                    
< g:renderErrors  bean ="${user}"  as ="list"   />
                
</ div >
           
</ g:hasErrors >
           
< g:form  action ="save"  method ="post"   >
               
< div  class ="dialog" >
                
< table >
                    
< tbody >

                       
                       
                                  
< tr  class ='prop' >< td  valign ='top'  class ='name' >< label  for ='userId' > User Id: </ label ></ td >< td  valign ='top'  class ='value  ${hasErrors(bean:user,field:'userId','errors')}' >< input  type ="text"  name ='userId'  value ="${user?.userId?.encodeAsHTML()}" /></ td ></ tr >
                       
                                  
< tr  class ='prop' >< td  valign ='top'  class ='name' >< label  for ='password' > Password: </ label ></ td >< td  valign ='top'  class ='value  ${hasErrors(bean:user,field:'password','errors')}' >< input  type ="text"  name ='password'  value ="${user?.password?.encodeAsHTML()}" /></ td ></ tr >
                       
                    
</ tbody >
               
</ table >
               
</ div >
               
< div  class ="buttons" >
                     
< span  class ="formButton" >
                        
< input  type ="submit"  value ="Create" ></ input >
                     
</ span >
               
</ div >
            
</ g:form >
        
</ div >
    
</ body >
</ html >

grails-app\views\user\edit.gsp
  
< html >
    
< head >
         
< meta  http-equiv ="Content-Type"  content ="text/html; charset=UTF-8" />
         
< meta  name ="layout"  content ="main"   />
         
< title > Edit User </ title >
    
</ head >
    
< body >
        
< div  class ="nav" >
            
< span  class ="menuButton" >< href ="${createLinkTo(dir:'')}" > Home </ a ></ span >
            
< span  class ="menuButton" >< g:link  action ="list" > User List </ g:link ></ span >
            
< span  class ="menuButton" >< g:link  action ="create" > New User </ g:link ></ span >
        
</ div >
        
< div  class ="body" >
           
< h1 > Edit User </ h1 >
           
< g:if  test ="${flash.message}" >
                 
< div  class ="message" > ${flash.message} </ div >
           
</ g:if >
           
< g:hasErrors  bean ="${user}" >
                
< div  class ="errors" >
                    
< g:renderErrors  bean ="${user}"  as ="list"   />
                
</ div >
           
</ g:hasErrors >
<!--
           <div class="prop">
          <span class="name">Id:</span>
          <span class="value">${user?.id}</span>
           </div>        
-->    

           
< g:form  controller ="user"  method ="post"   >
        
<!--
               <input type="hidden" name="id" value="${user?.id}" />
        
-->
        
< input  type ="hidden"  name ="id"  value ="${user?.userId}"   />
               
< div  class ="dialog" >
                
< table >
                    
< tbody >

                       
                       
                
< tr  class ='prop' >< td  valign ='top'  class ='name' >< label  for ='userId' > User Id: </ label ></ td >< td  valign ='top'  class ='value  ${hasErrors(bean:user,field:'userId','errors')}' >< input  type ="text"  name ='userId'  value ="${user?.userId?.encodeAsHTML()}" /></ td ></ tr >
                       
                
< tr  class ='prop' >< td  valign ='top'  class ='name' >< label  for ='password' > Password: </ label ></ td >< td  valign ='top'  class ='value  ${hasErrors(bean:user,field:'password','errors')}' >< input  type ="text"  name ='password'  value ="${user?.password?.encodeAsHTML()}" /></ td ></ tr >
                       
                    
</ tbody >
                
</ table >
               
</ div >

               
< div  class ="buttons" >
                     
< span  class ="button" >< g:actionSubmit  value ="Update"   /></ span >
                     
< span  class ="button" >< g:actionSubmit  value ="Delete"   /></ span >
               
</ div >
            
</ g:form >
        
</ div >
    
</ body >
</ html >


好了,整个处理过程已经呈现给大家了,希望对大家有用 :)

附:朝花夕拾——Groovy & Grails
posted on 2007-06-06 19:45 山风小子 阅读(3942) 评论(5)  编辑  收藏 所属分类: Groovy & Grails