技术开发 频道

Groovy入门—Grails实战之遗留数据库处理

  【IT168 技术文档】由于在过去一段时间内,已有多位朋友向我询问如何用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" >< a 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" >< a 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" >< a 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" >< a 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 >

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

0
相关文章