2011-08-08 8 views
8

Nie szukam warstwy trwałości, takiej jak Hibernate, chcę tylko generować ciągi sql i powinny one być kompatybilne z PreparedStatement. Próbowałem już bibliotek, takich jak Squiggle, ale obsługuje tylko SELECT, chciałbym również generować wstawiania i aktualizacje. Idealnym wykorzystanie byłoby coś takiego:Dobry sposób na generowanie ciągów SQL w języku Java?

generateInsertOn("myTable").addValue("value1").addValue("value2").generate(); 

które generują ten ciąg:

"INSERT INTO myTable (value1, value2) VALUES(?, ?)" 

wiem, że istnieje na pytania, które są bardzo podobne do moich, jak this, ale oni nie dość zapytać to samo co ja.

Cheers,

+1

Jeśli już wiesz, że są podobne pytania, to wspaniale, że mówisz nam o nich. Ale mówienie nam ** dlaczego ** te pytania nie są tym, czego chcesz, byłyby jeszcze lepsze! –

+0

Jaki jest twój problem przy pisaniu go samemu? –

+2

jaki jest problem z hibernacją, jego wielki ... – NimChimpsky

Odpowiedz

9

Dla dowolnego SQL, użyj jOOQ. jOOQ obsługuje obecnie SELECT, INSERT, UPDATE, DELETE, TRUNCATE i MERGE. Można tworzyć SQL tak:

// Since you're not executing the SQL, set connection to null 
Connection connection = null; 
Factory create = new MySQLFactory(connection); 
String sql1 = create.select(A, B, C) 
        .from(MY_TABLE) 
        .where(A.equal(5)) 
        .and(B.greaterThan(8)) 
        .getSQL(); 

String sql2 = create.insertInto(MY_TABLE) 
        .values(A, 1) 
        .values(B, 2) 
        .getSQL(); 

String sql3 = create.update(MY_TABLE) 
        .set(A, 1) 
        .set(B, 2) 
        .where(C.greaterThan(5)) 
        .getSQL(); 

Składnia obsługiwane jest dość bogaty. Znajdziesz tu również poparcie dla klauzul takich jak ON DUPLICATE KEY UPDATE, FOR UPDATE, LOCK IN SHARE MODE itp

Aby uzyskać więcej informacji, patrz

http://www.jooq.org

+0

jest sposób na wykorzystanie go bez generowania klas dla moich tabel? – wutzebaer

+0

@wutzebaer: Sprawdź strony podręcznika dotyczące zwykłego SQL *: http://www.jooq.org/doc/2.5/manual/sql-building/plain-sql/ –

2

Należy ostatecznie przyjrzeć SQLBuilder. Umożliwia proste, ale pełne generowanie kodu SQL przy użyciu bardzo płynnego API.

+0

Czy SQLBuilder jest nadal aktywny? W najnowszej historii nie ma zbyt wielu aktualizacji ... https://sourceforge.net/projects/openhms/files/sqlbuilder/ –

+0

Czy to działa? To znaczy, nie wiem, nie użyłem tego. Ale jeśli to działa, kogo to obchodzi, czy jest aktywne? –

+0

Cóż, to zależy, czy OP będzie szukał narzędzia do szybkich i brudnych prac, czy też musi żyć z tą decyzją przez jakiś czas. Weźmy na przykład Xalana. Działa bardzo dobrze, ale w ogóle nie działa. Jest kilka ważnych otwartych problemów, które prawdopodobnie nigdy nie zostaną rozwiązane ...: -/ –

0

Idąc w opałach tutaj, czy za iBatis? Jest to prawdziwa program do mapowania zapytań typu "down to earth" (w pewnym momencie waham się nazwać go strukturą ORM). Trzeba tworzyć pliki XML jak ten:

<mapper namespace="org.mybatis.jpetstore.persistence.ProductMapper">  
    <cache />  
    <select id="getProduct" parameterType="string" resultType="Product"> 
    SELECT 
     PRODUCTID, 
     NAME, 
     DESCN as description, 
     CATEGORY as categoryId 
    FROM PRODUCT 
    WHERE PRODUCTID = #{productId} 
    </select> 
</mapper> 

który drutów element odwzorowujący jak ten:

public interface ProductMapper { 
    Product getProduct(String productId); 
} 

, który pozwala na dostęp do danych z usług tak:

@Autowired 
    private ProductMapper productMapper; 

    public Product getProduct(String productId) { 
    return productMapper.getProduct(productId); 
    } 

Które można podłączyć do źródła:

<!-- enable autowire --> 
<context:annotation-config /> 

<!-- enable transaction demarcation with annotations --> 
<tx:annotation-driven /> 

<!-- define the SqlSessionFactory --> 
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="typeAliasesPackage" value="org.mybatis.jpetstore.domain" /> 
</bean> 

<!-- scan for mappers and let them be autowired --> 
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> 
    <property name="basePackage" value="org.mybatis.jpetstore.persistence" /> 
</bean> 

Zobacz także the full petstore example.

Nie jestem jednoznacznym fanem iBatis, ale może on pasować do twoich potrzeb w tym konkretnym przypadku.

Powiązane problemy