Java: JOOQ persistance du rendement du cadre et du feed-back [fermé]

j'ai trébuché avec un bon générateur SQL cadre, appelé JOOQ . BTW, en russe JOOQ sonne comme substantif signifiant "bug" (comme les insectes), "beetle" ;)

si vous avez des commentaires à propos de JOOQ, c'est la performance et ainsi de suite, s'il vous plaît partager. Les liens vers les blogs sur JOOQ sont également les bienvenus.

26
demandé sur Community 2011-04-11 22:36:10

3 réponses

je pense que je dois répondre ici aussi parce que j'ai commencé à utiliser jooq un mois et demi donc j'ai une certaine expérience avec elle.

je voulais utiliser un outil comme jooq parce que:

  • ORM est un overkill dans mon projet actuel (calculs distribués plate-forme pour le groupe) car j'ai besoin de lire et d'écrire des champs de db, pas de compléter le tableau en lignes et certaines de mes questions sont suffisamment complexes pour ne pas être exécuté par simple et Ormes légers.
  • je voulais que la syntaxe soit autocomplète pour mes requêtes afin de ne pas avoir à garder toute ma base de données à l'esprit
  • je voulais être capable d'écrire des requêtes directement en Java pour que le compilateur puisse vérifier la syntaxe de requête de base sur build.
  • je voulais que mes requêtes soient sur type-safe de sorte que je ne puisse pas accidentellement passer une variable d'un type, où une autre est attendue.
  • je voulais SQL, mais je le voulais très pratique et facile à utiliser

Eh bien, avec jooq j'ai pu réaliser tout cela. Ma principale exigence était que jooq traite des requêtes assez complexes (imbriquées, avec regroupement, etc.). Qui a été accomplie.

je voulais aussi être capable d'exécuter des requêtes en utilisant le moins de lignes de code possible et j'ai pu atteindre cela avec l'API jooq fluent qui permet aux appels de type jquery d'effectuer des sélections.

sur mon chemin en utilisant le jooq j'ai rapporté un un ou deux bogues et je dois dire, qu'ils ont été fixés étonnamment vite.

je raté certaines fonctionnalités et encore, je dois dire, que j'ai déjà presque tous.

ce que j'ai beaucoup aimé, c'est que jooq utilise maintenant SLF4J pour rapporter des données très intéressantes sur ses performances ainsi que pour sortir les requêtes réelles qu'il a construites. Il m'a vraiment aidé avec le débogage.

Jooq même générer des artéfacts Java pour les procédures stockées, UDFs et recordsets actualisables, que je n'utilise pas actuellement, cependant.

ce qui est important, jooq soutient de manière transparente DB2, Derby, H2, HSQLDB, MySQL, Oracle, PostGreSQL, SQLite, SQL Server, Sybase SQL Anywhere. Assez vaste, liste, je pense.

Jooq a forum de soutien dans les Groupes Google où Lukas est jour et nuit prêt à répondre, même le plus stupide des mes questions.

Jooq supporte Maven et c'est un grand soulagement pour moi puisque tous mes projets Java sont basés sur Maven. Nous manquons toujours maven plugin pour generator, mais ce n'est pas important puisque faire tourner generator est un jeu d'enfant.

en écrivant mes requêtes avec jooq j'ai soudain découvert qu'elles sont devenues vraiment portables parce que je n'ai presque jamais utilisé de fonctionnalité spécifique à MySQL dans le code depuis que jooq essaie d'être aussi portable que possible. Pour ceux qui ne peuvent pas vivre avec de telles particularités, comme je sais que le soutien pour les extensions SQL est également en cours de route.

de mon point de vue, qu'est-ce qui manque à jooq?

bien, il n'y a pas D'API fluente pour les déclarations autres que SELECT. Cela complique un peu le code et rend les déclarations UPDATE/DELETE un peu plus compliquées à écrire. Mais je pense que cela sera ajouté bientôt. vient d'être implémenté en 1.5.9! Ha! Trop rapide pour moi ;)

et encore une chose. Jooq a un bon manuel, mais... Je ne sais pas. Peut-être que je ne comprends pas sa structure ou son architecture... Quand j'ai commencé à utiliser jooq pour la première fois, j'ai ouvert une page après l'autre à la recherche d'une fonctionnalité dont j'ai besoin. Par exemple, essayer de deviner, où dans manuel de jooq mise à jour et supprimer les déclarations sont décrites, en regardant le contenu... Mais c'est vraiment subjectif, je crois. Je ne peux pas non plus expliquer ce qui ne va pas avec le manuel de mon de point de vue. Quand je peux, je vais poster un billet ou deux ;)

Le manuel

N'est pas très bien non plus-navigable car il n'y a pas de liens automatiques"ici, là-bas et en arrière".

Eh bien, pour moi à Moscou (Russie) les pages Trac ne s'ouvrent pas aussi vite donc la lecture de manuel est un peu ennuyeux.

manuel manque également une bonne description de l'architecture de jooq pour les contributeurs. Jooq suit la conception par contrat principe, il semble, et quand j'ai voulu apprenez comment certaines fonctionnalités sont mises en œuvre à l'intérieur en utilisant mon Ctrl habituel-cliquez sur un nom de méthode dans IDE, j'ai fini à l'intérieur d'une interface ennuyeuse sans aucune mise en œuvre ;) non pas que je suis trop intelligent pour commencer à améliorer jooq tout de suite, mais certainement je serais heureux de comprendre comment exactement jooq est Architect é de la base à la hausse.

c'est dommage aussi que nous ne puissions pas contribuer au manuel jooq. Je m'attendais à être dans une sorte de wiki.

ce que je voudrais aussi pour améliorer, est la façon nouvelles sont rapportées . Je préférerais le lien vers le manuel ou des exemples comment ceci ou cette nouvelle fonctionnalité fonctionne.

des notes de Version lien dans le manuel est vraiment juste une feuille de route. Je pense que je le ferai moi-même demain...

Jooq ont également relativement petite communauté actuellement, mais je suis heureux de signaler qu'il n'affecte pas la qualité du code ou la façon nouvelle les fonctionnalités sont introduites.

Jooq est vraiment un bon projet. Je vais tenir mes futurs projets. Je l'aime vraiment.

32
répondu Vladislav Rastrusny 2011-05-15 22:08:54

vous pouvez également jeter un oeil sur MentaBean , un ORM léger et constructeur SQL qui vous permet d'être aussi près que possible de SQL offrant beaucoup d'aide avec le code boilerplate. Voici un exemple:

Configuration Programmatique:

private BeanConfig getUserBeanConfig() {

    // programmatic configuration for the bean... (no annotation or XML)

    BeanConfig config = new BeanConfig(User.class, "Users");
    config.pk("id", DBTypes.AUTOINCREMENT);
    config.field("username", DBTypes.STRING);
    config.field("birthdate", "bd", DBTypes.DATE); // note that the database column name is different
    config.field("status", new EnumValueType(User.Status.class));
    config.field("deleted", DBTypes.BOOLEANINT);
    config.field("insertTime", "insert_time", DBTypes.TIMESTAMP).defaultToNow("insertTime");

    return config;
}

   // create table Users(id integer primary key auto_increment, 
   // username varchar(25), bd datetime, status varchar(20), 
   // deleted tinyint, insert_time timestamp)

une simple requête SQL join:

Post p = new Post(1);

StringBuilder query = new StringBuilder(256);
query.append("select ");
query.append(session.buildSelect(Post.class, "p"));
query.append(", ");
query.append(session.buildSelect(User.class, "u"));
query.append(" from Posts p join Users u on p.user_id = u.id");
query.append(" where p.id = ?");

stmt = conn.prepareStatement(query.toString());
stmt.setInt(1, p.getId());

rset = stmt.executeQuery();

if (rset.next()) {

    session.populateBean(rset, p, "p");

    u = new User();

    session.populateBean(rset, u, "u");

    p.setUser(u);
}
2
répondu TraderJoeChicago 2011-09-24 19:43:53

si vous recherchez seulement une solution de constructeur SQL. J'ai un projet qui est un cadre ORM pour Java mais il est encore prématuré et dans le développement continu cependant traite de nombreuses utilisations primitives de bases de données. https://github.com/ahmetalpbalkan/orman

il n'y a pas de documentation à ce stade, cependant elle peut construire des requêtes sûres en utilisant seulement les méthodes de la chaîne Java et peut gérer de nombreuses opérations SQL. Il peut aussi mapper des classes-champs à tableaux-colonnes respectivement.

voici un exemple d'opération de construction de requête pour requête

SELECT COUNT(*) FROM sailors WHERE
    rating>4 AND rating<9 GROUP BY rating HAVING AVG(age)>20;

code Java:

    QueryBuilder qb = QueryBuilder.getBuilder(QueryType.SELECT);
    System.out.println(qb
            .from("sailors")
            .where(
                    C.and(
                            C.gt("rating", 5),
                            C.lt("rating", 9)))
            .groupBy("rating")
            .having(
                    C.gt(
                            new OperationalField(QueryFieldOperation.AVG,
                    "age").toString(), 20)
                    ).getQuery());

(LOL venez de donner l'élaboration de ce cadre!)

très probablement cela ne fonctionnera pas pour vous, mais je voulais juste annoncer mon projet: p

0
répondu Ahmet Alp Balkan - Google 2011-05-22 13:09:31