Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
0
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

今アプリを作るならDB連携は当然使いますよね?
ということで、今回はDBのアクセスしてみようと思います。

DBアクセスモジュールの追加

いつものようにmodule.ceylonファイルに追記します。
今回追加するモジュールはこれ。

import ceylon.dbc "1.0.0";

DBアクセスクラス

ceylon.dbcでは
Sqlクラスが用意されていて
DBにアクセスすることが出来ます!

しかし・・・
Sqlクラスのコンストラクタには
javax.sql.DataSourceの名前が・・・。

Java連携が必須のようです。。

DB周りの設定

DBと合わせてjavaのDataSourceも必要なので
今回はこちらのDBを使おうと思います。
http://www.h2database.com/html/main.html
オンメモリなDBも使うことも出来て手軽に使えます。

ここでダウンロードしてきたzipを解凍して出てきたjarファイルを
前回 のようにjarファイルを登録します。

ceylon import-jar org/h2 h2-1.3.174.jar

そしてmodule.ceylonファイルにもモジュールを追記します。

import java.base "7";
import org.hsqldb.hsqldb "2.3.1";

これで準備OKです。
それではコードに行ってみましょう。

コード


import ceylon.dbc { Sql }
import org.hsqldb.jdbc { JDBCPool }

void dbAccess() {
    value ds = JDBCPool();
    ds.url = "jdbc:hsqldb:mem:db";
    ds.user = "sa";
    ds.setPassword("sa");

    value sql = Sql(ds);
    sql.execute("create table messages (id integer, text varchar(20))");

    value count = sql.queryForInteger("SELECT count(*) FROM messages");
    print(count);

    sql.transaction(() { 
        sql.execute("insert into messages (id, text) values (?, ?)", 
        0, "hello world"); 
        sql.execute("insert into messages (id, text) values (?, ?)", 
        1, "goodbye world"); 
        return true; 
    }); 

    value count2 = sql.queryForInteger("SELECT count(*) FROM messages");
    print(count2);

    sql.eachRow { 
        sql = "select id, text from messages"; 
        void body(Map<String,Object> row) {
            print("{");
            for (key->item in row) {
                print("\t``key``: ``item``");
            }
            print("}");
        } 
    }; 
}

Sqlクラスを生成するためにDataSourceを生成します。
オンメモリでDBを立ち上げ、テーブルを作って
クエリ実行、インサートなどをしています。

見ただけで何となく分かりますよね。
トランザクションやパラメータ置き換えも良さげです。

Javaのデータソースが必須なのを除けば。。。
実際の業務ロジックでは
基盤部分のみが参照で隠蔽出来る部分かもしれないですけどね。

まとめ

残念ながら現状ではJava連携必須。
しばらくしたらCeylonモジュールだけで動かせるようになるのかなぁ。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
0
Help us understand the problem. What are the problem?