Fountain-JDBC /

Filename Size Date modified Message
92 B
888 B
4.2 KB
5.1 KB
-*- markdown -*-

# Fountain-JDBC v0.2

Fountain-JDBC is a Clojure wrapper for Spring-JDBC (a component to deal with JDBC
in Spring framework.) The current scope is:

* Parameterized SQL statements
* Database metadata assisted Inserts
* Transactions (1. programmatic, 2. predicate based, 3. rule based)

## Usage

Maven/Leiningen dependency details are here: [](

Examples for usage can be found in the tutorial below:

## Building/Installation

You will need Maven 2 to build from sources. Execute the following:

    $ mvn clean package  # packages up a JAR in "target" dir
    $ mvn install        # to install to your local Maven repo
    $ mvn clojure:gendoc # generate Clojure API documentation

## License

   Copyright (C) 2011 Shantanu Kumar (kumar[dot]shantanu[at]gmail[dot]com)

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this software except in compliance with the License.
   You may obtain a copy of the License at


   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   See the License for the specific language governing permissions and
   limitations under the License.

# Documentation

You can include Fountain-JDBC to your project by including its namespace:

    (use 'org.bituf.fountain.jdbc)

## Quickstart

Create a new project and include the following dependencies:

    [org.bituf/clj-dbcp "0.5"]
    [org.bituf/oss-jdbc "0.4"]
    [org.bituf/fountain-jdbc "0.2"]

Define the CRUD functions as follows:

    ;; filename fooapp/src/fooapp/dbcrud.clj
    (ns fooapp.dbcrud
        [org.bituf.fountain.jdbc :as jd]))
    (def sql-ct "CREATE TABLE sample
                       (sample_id INT         NOT NULL PRIMARY KEY AUTO_INCREMENT,
                        name      VARCHAR(30) NOT NULL,
                        age       INT)")
    (defn create-table
      (jd/update sql-ct))
    (defn insert-new
      [m] {:pre [(map? m)]}
      (let [sji (jd/make-sji :sample
                  :gencols :sample-id)]
        (jd/insert-give-id sji m)))
    (defn find-by-id
        "SELECT * FROM sample WHERE sample_id = :id"
        {:id id}))
    (defn update-age-by-id
      [id new-age]
        "UPDATE sample SET age = :age WHERE sample_id = :id"
        {:age new-age
         :id  id}))
    (defn delete-by-id
        "DELETE FROM sample WHERE sample_id = :id"
        {:id id}))

Now create another file that you can use for integration:

    ;; filename fooapp/src/fooapp/dbaction.clj
    (ns fooapp.dbaction
      (:require [fooapp.dbcrud :as crud]
        [org.bituf.clj-dbcp      :as dbcp]
        [org.bituf.clj-dbspec    :as spec]
        [org.bituf.fountain.jdbc :as jd]))
    ;; define datasource for supported database using Clj-DBCP
    (def ds (dbcp/mysql-datasource "localhost" "dbname" "dbuser" "password"))
    (defn do-action "Wrap f using DBSpec middleware and execute it"
      [f] {:pre [(fn? f)]}
      (let [g (spec/wrap-dbspec (spec/make-dbspec ds)
        (jd/wrap-sjt f))]

Once you are done with these, you can go to the REPL and execute commands as follows:

    user=> (require ['fooapp.dbcrud :as 'cr])
    user=> (require ['fooapp.dbaction :as 'ac])
    user=> (ac/do-action cr/create-table)
    CREATE TABLE...(rest of the message truncated)
    user=> (ac/do-action #(cr/insert-new {:name "Harry" :age 30}))
    Returning generated...(rest of msg truncated)

You got the drift. You need to pass a function to do-action be executed in the
context of data source etc.

## Reference

Please check The Bitumen Framework Handbook [](