2016-04-12 15 views
0

こんにちは私は学生ですが、現在GrailsとGroovyを学んでいます。私はサービス、コントローラ、GSPでクルードサービスを作りたいです。 GrailsアプリケーションをPostgreSQLデータベースに接続しました。私の問題は、私はCRUDサービスを作ることができないということです。足場でそれをやったのですが、コントローラーで手作業で試してみました。今はサービスに入れたいです。私のコードはこれです:Grails/Groovy CRUDサービス

マイサービス

import groovy.sql.Sql 
import grails.transaction.Transactional 

@Transactional 
class ContactListService { 
    def DataSource 

    def listAction(){ 
     def sql = new Sql(DataSource) 
     return sql.rows ("SELECT * FROM mn") 
    } 

    def insertAction(){ 
     def sql = new Sql(DataSource) 
     sql.execute("INSERT INTO mn (id, name) VALUES ($Id,$Name)") 
    } 

私は、この "メッセージクラスのID:A:いいえ、そのようなプロパティcontactlist.ContactListService" を取得

+0

:さて、あなたはリストを

class Mn{ Long id String name } 

書くことができ、このようなサービスでアクションを挿入します。あなたはこのようなマンガンという名前のクラスを持っていると仮定すると

そのようにSQL接続を作成する必要があります。 GnM:Mn.list()= select * from mnを使用し、新しいMn(id:Id、name:name).save()= insertを使用します。 Mn – quindimildev

答えて

0

第一、ありますDataServiceをという名前の豆ません(何のため奇妙な命名btw)。代わりに、コンパイルエラーを解決するためにdataService

第二、名前のBeanがあります、あなたは(私の目が今出血している!)どこかinsertAction()方法の文脈でIdNameを宣言する必要があります。どちらかのような引数、またはフィールドまたはローカルVARS、など:あなたは休止状態で行うことができない非標準であるものを使用する必要がある場合、私はそれが必要とされる場合を除き、たとえば、SQLを使用して回避する手始めに

def insertAction(String Id, String Name){ // aaarrrgggghhhh 
    def sql = new Sql(DataSource) 
    sql.execute("INSERT INTO mn (id, name) VALUES ($Id,$Name)") 
} 
+1

という名前のクラスがあると仮定すると、生成されたセッターとゲッターは 'dataSource'と' DataSource'と同じです(そしてセッターはDIでSpringが使うものなので) 。もちろん、それを標準的な方法でやるのがベストです。 –

+0

応答のためのThanx。更新タグは同じ方法で動作していますか? – Andrew

+0

@Andrewあなたは 'sql.execute(" update ... ")'を意味しますか?はい、そうです。あなたが 'groovy.sql'を使いたいのであれば、' sql.execute( 'INSERT INTO mn(id、name)VALUES(?、?)'、[id、name] ) ' – injecteer

1

および/またはGORM。 GrailsとGORMの組み込み機能を使用することで、あなたのような簡単なinsert文とselect文が簡単になります。

Grailsの基本を学ぶには、多くのリソースがあります。 reference docsを参照してください。利用可能なmany booksの1つ以上をチェックアウトしてください。 Grails 3に固有の本はまだありませんが、Grails 2と3のコアコンセプトは非常に似ていますので、Grails 2の本は多くを助けます。

あなたのコードが失敗した理由は、あなたのSQLでGString内に存在しないId変数を参照しているためです。これを修正したと仮定すると、変数が見つからないために再び失敗します。Nameあなたはおそらく、それらのメソッドを、コントローラやサービスを呼び出す他のクラスから渡すことをお勧めします。あなたはこのような組み込み変数とSQLを使用して、アプリケーションにSQLインジェクションのリスクを追加することに非常に近い

def insertAction(long id, String name) { 
    def sql = new Sql(DataSource) 
    sql.execute("INSERT INTO mn (id, name) VALUES ($id,$name)") 
} 

注意。 Groovy.sql.SqlがGStringsを理解し、この場合の問題を回避することは幸いです。

0

@AndrewこのようなシナリオでSQLクエリを記述する必要はなく、アプリケーションでSQLインジェクションのリスクが発生する可能性があります。むしろGORM機能を利用して作業を簡単にすることができます。あなたはいけない、ちょうどあなたが知っているメイクのため

@Transactional 
class ContactListService { 

def listAction(){ 
    return Mn.list() 
} 

def insertAction(id, name){ 
    def mn = new Mn(id: id, name: name) 
    mn.save() 
} 
}