Хороший способ генерировать строки SQL в Java? - PullRequest
9 голосов
/ 08 августа 2011

Я не ищу такой постоянный слой, как Hibernate, я просто хочу создать строки sql, и они должны быть совместимы с PreparedStatement. Я пробовал библиотеки, такие как Squiggle , но он поддерживает только SELECT, я также хотел бы создавать вставки и обновления. Идеальное использование было бы что-то вроде:

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

, который будет генерировать эту строку:

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

Я знаю, что существуют вопросы, очень похожие на мои, такие как this , но они не совсем задают то же самое, что и я.

Приветствия

Ответы [ 3 ]

11 голосов
/ 09 августа 2011

Для произвольного SQL используйте jOOQ . В настоящее время jOOQ поддерживает SELECT, INSERT, UPDATE, DELETE, TRUNCATE и MERGE. Вы можете создать SQL следующим образом:

// 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();

Поддерживаемый синтаксис довольно богат. Вы также найдете поддержку таких предложений, как ON DUPLICATE KEY UPDATE, FOR UPDATE, LOCK IN SHARE MODE и т. Д.

Подробнее см.

http://www.jooq.org

(Отказ от ответственности, я работаю в компании за jOOQ)

3 голосов
/ 08 августа 2011

Вы должны обязательно взглянуть на SQLBuilder .Это позволяет просто, но в то же время завершить генерацию SQL с использованием очень свободного API.

0 голосов
/ 09 августа 2011

Идя здесь на конечности, вы рассматривали iBatis?Это реальная и удобная структура отображения запросов (я не решаюсь назвать ее как-то ORM).Вы должны создать XML-файлы, подобные этому:

<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>

, который подключает маппер, подобный этому:

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

, который позволяет вам получать доступ к данным из таких сервисов:

  @Autowired
  private ProductMapper productMapper;  

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

Который вы можете подключить к Spring:

<!-- 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>

См. Также полный пример с домашним животным .

Я не однозначный фанатiBatis, но он может соответствовать вашим потребностям в данном конкретном случае.

...