среда, 27 января 2016 г.

Groovy и JDBC. Выборка данных

Уже давно слышал о Groovy, но поработать с этим в продакшене не удавалось (как и со многими другими вещами, которые может включать в себя "интересный проект"). Поэтому начал изучать самостоятельно

Но перед тем как начать изучать, потратить время, неплохо было бы увидеть несколько простых примеров. Примеров, которые бы помогли как, где и для чего это можно использовать и какие в этом преимущества

Те, кто сталкивался с JDBC знают, что такие опрерации как подключение к базе данных, выполнение и обработка запроса требуют не мало boilerplate кода. Несколько примеров из JDBC Bascis

Соединение:


public Connection getConnection() throws SQLException {

    Connection conn = null;
    Properties connectionProps = new Properties();
    connectionProps.put("user", this.userName);
    connectionProps.put("password", this.password);

    if (this.dbms.equals("mysql")) {
        conn = DriverManager.getConnection(
                   "jdbc:" + this.dbms + "://" +
                   this.serverName +
                   ":" + this.portNumber + "/",
                   connectionProps);
    } else if (this.dbms.equals("derby")) {
        conn = DriverManager.getConnection(
                   "jdbc:" + this.dbms + ":" +
                   this.dbName +
                   ";create=true",
                   connectionProps);
    }
    System.out.println("Connected to database");
    return conn;
}

Запрос и обработка:


public static void viewTable(Connection con, String dbName)
    throws SQLException {

    Statement stmt = null;
    String query = "select COF_NAME, SUP_ID, PRICE, " +
                   "SALES, TOTAL " +
                   "from " + dbName + ".COFFEES";
    try {
        stmt = con.createStatement();
        ResultSet rs = stmt.executeQuery(query);
        while (rs.next()) {
            String coffeeName = rs.getString("COF_NAME");
            int supplierID = rs.getInt("SUP_ID");
            float price = rs.getFloat("PRICE");
            int sales = rs.getInt("SALES");
            int total = rs.getInt("TOTAL");
            System.out.println(coffeeName + "\t" + supplierID +
                               "\t" + price + "\t" + sales +
                               "\t" + total);
        }
    } catch (SQLException e ) {
        JDBCTutorialUtilities.printSQLException(e);
    } finally {
        if (stmt != null) { stmt.close(); }
    }
}

Прекрасно, что есть возомжность работать с бд, но в таком ключе это довольно утомительно. Что заметила сама Java.

Как же Groovy работает с JDBC?

Напишем класс, который будет содержать детали нашей базы (hsqldb):


import org.hsqldb.Server

class DBUtil {

    static dbSettings = [
            url   : 'jdbc:hsqldb:hsql://localhost/embassydb',
            user  : 'sa', password: '',
            driver: 'org.hsqldb.jdbc.JDBCDriver'
    ]

    static startServer() {
        Server server = new Server();
        def logFile = new File("db.log");
        server.setLogWriter(new PrintWriter(logFile))
        server.with {
            setDatabaseName(0, 'embassydb');
            setDatabasePath(0, 'mem:embassydb')
            start()
        }
        server
    }

}

Далее нам нужен будет скрипт, который создаст, наполнит и сделает выборку по бд. Для это нам понадобится


import static db.jdbc.DBUtil.* //1 
import groovy.sql.Sql

где 1 это наш класс, который мы описали выше. Далее продготовим запросы для создания таблицы(рассмотрим на примере одной таблицы)


def ddls = [
        '''
            CREATE TABLE PERSON(
                ID VARCHAR(8) PRIMARY KEY,
                FIRSTNAME VARCHAR(100),
                LASTNAME VARCHAR(100))
        '''
]

наполнения


def dmls = [
        '''
            INSERT INTO PERSON(ID, FIRSTNAME, LASTNAME) VALUES
            'BB775566', 'John', 'Doe'
        ''',

        '''
            INSERT INTO PERSON(ID, FIRSTNAME, LASTNAME) VALUES
            'CC775566', 'Chris', 'Martin'
        '''
]

и сами операции


def createSchema(ddls) {
    Sql sql = Sql.newInstance(dbSettings)
    ddls.each { ddl ->
        sql.execute(ddl)
    }
    sql.close()
    println 'Schema created successfully'
}

def populateSchema(dmls) {
    Sql sql = Sql.newInstance(dbSettings)
    dmls.each { dml ->
        sql.execute(dml)
    }
    sql.close()
    println 'Schema populated successfully'
}

теперь самое интересное - выборка и обработка данных


sql.eachRow('SELECT * FROM PERSON') { person ->
    printf('%-20s%s\n',
    person.id,
    person[1])
} 

результат


BB775566            John
CC775566            Chris

мы так же можем передать параметр в запрос


sql.eachRow('SELECT * FROM PERSON WHERE id = :id', [id:'BB775566']) { person ->
    printf('%-20s%s\n',
            person.id,
            person[1])
} 

получаем


BB775566            John

или использовать пейджинацию


sql.eachRow('SELECT * FROM PERSON', 2, 1) { person ->
    printf('%-20s%s\n',
            person.id,
            person[1])
}

где первый параметр после самого запроса - это номер страницы, а второй количество элементов на странице


CC775566            Chris

Как это работает?

Класс groovy.sql.Sql содержит 3 основных метода:

  • eachRow
  • rows
  • query
при чем eachRow перегружен 20 раз.

В свою очередь eachRow - это итератор по результату переданного запроса, который итерируется по ResultSet (обернутый GroovyResultSet). Для каждой итерации выполняется переданное мной замыкание(closure).

Таким образом мы видим, что Groovy пердоставляет нам мощное API для работы с JDBC, что существенно упрощает взаимодействие в сравнении с Java.


Источники:


Код можно взять здесь

1 комментарий:

  1. Jammin' Jars Casino - Missouri
    Jammin' 사천 출장안마 Jars Casino is 세종특별자치 출장샵 the premier 순천 출장샵 Missouri gambling site. We offer sports betting, casino games, slots, table 상주 출장안마 games, 이천 출장안마 live entertainment and more.

    ОтветитьУдалить