2013-03-15 14 views
14

Uygulamamdaki bazı büyük sorguları properties.m sql \ xml dosyalarıyla dışlamak istiyorum. Bununla birlikte, birinin bunu nasıl temiz bir şekilde başardığına dair bazı tavsiyelerde bulunup bulunmadığını merak ediyordum. Çoğu sonuç bir ORM çerçevesi kullanmanızı önerir, ancak bu bazı veri kısıtlamaları nedeniyle geçerli değildir.Yay jdbc kullanırken uzun (+ 20 satırlık sql) dışsallaştırmanın temiz yolu?

Java - Storing SQL statements in an external file'a bir göz attım ama bu propertyname .1, .2'yi yapmak, her biri 20 satırlık daha az olan birkaç sorgu için bu temiz görünmüyor.

+1

Sorguyu dışlayarak ne kazanırsınız? Şimdi, kodu okurken veya hata ayıklarken hangi sorguyu çalıştırdığınızı görmek yerine, sorgunun tanımlandığı dosyayı bulmanız gerekir. –

+1

Artı Sorgular dinamik olarak oluşturulduğunda, dışa aktarılan sorguların kullanılması oldukça zordur. Örneğin, belirli bir cisme göre dinamik bir cümle kurarsanız veya öğelerin sırasını kullanıcının sıralanmasını nasıl istediğine göre seçerseniz veya farklı konfigürasyonlara veya veri görüntüleme gereksinimlerine göre sütun sayısını kısıtlarsanız. Yani, dışa aktarma sorguları deneyimimde hiç iyi bir fikir olmamıştı. –

+0

JB Nizet, Ondan hiçbir şey elde edemem. Ama bunlar içinde çalışmak zorunda olduğum kısıtlar. –

cevap

0

Satır sonuna bir \ koyarak, özellik dosyasında çok satırlı sorguları yapabilirsiniz. Örneğin

queries.myquery = select \ 
foo, bar \ 
from mytable \ 
where baz > 10 
21

For You DAO sınıfında bu fasulye enjekte, Bahar uygulama Bağlamında Bir xml dosyasında

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> 

<properties> 
<entry key="getPersonById"> 
    <![CDATA[ 
     Select Name From Person 
     Where Id =?  
    ]]> 

</entry>  
<entry key="getPersonBySSN"> 
    <![CDATA[ 

    ]]> 
</entry> 

</properties> 

Sorgularınızı koymak bu xml dosyası

<bean id="queryProps" class="org.springframework.beans.factory.config.PropertiesFactoryBean"> 
    <property name="locations" value="classpath:/queries.xml" /> 
</bean> 

yükleyebilirsiniz

<bean id="myDAO" class="com.xyz.dao.MyDAOImpl"> 
    <property name="queryProps" ref="queryProps" /> 
</bean> 

Defi ne DAO sınıfında queryProps ve Şimdi bu gibi DAO'sunda sorguya erişebilirsiniz bu

private Properties queryProps; 

setter yöntemine sahip unutmayın - bu yardımcı olur

String query = queryProps.getProperty("getPersonById"); 

Umut.

+0

Bu çözüm, DBA'nın güncellemelerini uyguladığı ve daha sonra dosyaya kaydettiği durumlarda çok yararlıdır. Tabii ki, yeni güncellemeler için bir çeşit değişiklik dinleyicisi kullanabilir ve XML özellik dosyalarının konumunun bulunduğu yeri okuyarak uygulamanıza görünür olan "WEB-INF" ve başka bir özellik dosyasının dışında bulunan XML özellik dosyalarına sahip olabilirsiniz. – Malvon

+1

CDATA olmadan benim için çalıştı. –

+0

Bu harika ve sorunu çözüyor, ancak sorgu başına bir .sql dosyası olmasını ve bunları çalıştıracak Java koduyla birlikte depolanmasını tercih ediyorum. Ve bence Java dosyasından yüklenen sorgu dosyasına sahip olmak, XML dosyalarındaki Spring konfigürasyonundan kaçınmak daha güzel olurdu. Mümkün mü? – lpacheco

1

JdbcTestUtils numaralı telefondan ve "executeSqlScript" ve "readScript" yöntemlerinden yararlanın.

5

Bu, Pankaj has answered'a ek olarak verilmiştir. Bu, Properties XML'de CDATA yok ve autowiring kullanıyor. Bunu yanıt olarak eklemeliydim, çünkü bunu yorum bölümünde yapmam gerekirse kodu biçimlendiremedim.

Yay uygulama içeriği xml dosyasında aşağıdaki ad alanının bulunduğundan emin olun.

xmlns:util="http://www.springframework.org/schema/util 

uygulama bağlam XML dosyasının

<util:properties id="sqls" location="classpath:oracle/sqls.xml" /> 

İçindekiler bahar için aşağıdaki fasulye ekleyin sqls.xml aşağıdaki gibi özellikleri

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> 
<properties> 
    <comment>Employee Queries</comment> 
    <entry key="employee.insert"> 
     INSERT 
     INTO EMPLOYEE 
      (
      ID, 
      NAME, 
      AGE, 
      DEPARTMENT 
     ) 
     VALUES 
      (
      EMPLOYEE_SEQ.NEXTVAL, 
      ?, 
      ?, 
      ? 
     ) 
    </entry> 
</properties> 

Autowired olduğunu

@Autowired 
@Qualifier("sqls") 
private Properties sqls; 

sql sorgusu almak için sql sorgu

String sql = sqls.getProperty("employee.insert"); 
+0

Bence ihtiyacım var! 'gibi. 'CDATA' içinde kapalı olmadan, uygulama içeriğini yüklerken Spring istisna atardı. –

+0

> için > ve

+3

Evet, bu IMHO'nun amacını yenilgiye uğratın. Bu şekilde dışsallaştırmanın bir yararı, sorguyu görebilmemizdir ve ayrıca sql'leri doğrudan kopyalayıp bir sql aracına yapıştırabilir ve çalıştırabiliriz. 2 tane benimhttp://www.springframework.org/schema/ "= util: –

6

Ben aynı sorunla bir süre önce karşılaştım ve YAML ile geldi.

selectSomething: > 
    SELECT column1, column2 FROM SOMETHING 

insertSomething: > 
    INSERT INTO SOMETHING(column1, column2) 
    VALUES(1, '1') 
İşte

, selectSomething ve insertSomething sorgu adları şunlardır: Eğer sorgu dosyalarında böyle bir şey yazabilirsiniz, böylece çok satırlı dize özellik değerlerini destekler. Bu yüzden gerçekten kullanışlı ve çok az özel karakter içeriyor. Sorgular boş satırlarla ayrılır ve her sorgu metni girintili olmalıdır. Daha sonra SnakeYAML kütüphane yardımıyla bir karma-haritası içine dosyanın içeriğini okuyabilir

anotherSelect: < 
    SELECT column1 FROM SOMETHING 
    WHERE column2 IN (
    SELECT * FROM SOMETHING_ELSE 
) 

kullanarak: Aşağıdaki tamamen geçerli olacak şekilde sorgular kesinlikle kendi girintilemesini içerebileceğini unutmayın aşağıdaki kodu: haritaların haritasında yukarıdaki örnekte

import org.apache.commons.io.FilenameUtils; 
import org.apache.commons.io.FileUtils; 
import java.io.FileReader; 

import org.yaml.snakeyaml.Yaml; 
import java.io.File; 
import java.io.FileNotFoundException; 

public class SQLReader { 
    private Map<String, Map> sqlQueries = new HashMap<String, Map>(); 

    private SQLReader() { 
    try { 
     final File sqlYmlDir = new File("dir_with_yml_files"); 
     Collection<File> ymlFiles = FileUtils.listFiles(sqlYmlDir, new String[]{"yml"}, false); 
     for (File f : ymlFiles) { 
     final String fileName = FilenameUtils.getBaseName(f.getName()); 
     Map ymlQueries = (Map)new Yaml().load(new FileReader(f)); 
     sqlQueries.put(fileName, ymlQueries); 
     } 
    } 
    catch (FileNotFoundException ex) { 
     System.out.println("File not found!!!"); 
    } 
    } 
} 

sorgu adları/dizeleri içeren bir haritaya her YAML dosyası haritalama, oluşturulur.