Spring DAO, Spring ORM vs Spring JDBC


103

Spring tarafından desteklenen veri erişim teknolojilerinden geçiyordum ve birden fazla seçenekten bahsettiğini fark ettim ve aralarındaki farktan emin değilim:

Anladığım kadarıyla Spring JDBC, bir veritabanına eski yöntemle erişmek için standart kodu azaltmak için şablonlar sağlar - kendi SQL sorgularınızı yazarsınız.

Spring-ORM, Hibernate, My (i) Batis vb. Gibi ORM teknolojileri aracılığıyla veritabanlarına erişim için basitleştirilmiş şablonlar sağlar.

Spring'in web sitesine göre Spring-DAO:

Spring'deki Veri Erişim Nesnesi (DAO) desteği, JDBC, Hibernate veya JDO gibi veri erişim teknolojileriyle tutarlı bir şekilde çalışmayı kolaylaştırmayı amaçlamaktadır.

DB'ye erişimin farklı yollarını hedefledikleri için ORM ve JDBC hakkında biraz netim. Ancak Spring-DAO sadece kafa karıştırıcı!

Lütfen bu üçü arasındaki farkların tam olarak ne olduğunu açıklayabilir misiniz? Hangi senaryolarda hangisi tercih edilmelidir?

Ayrıca, başka bir proje daha Spring-DATAvar ( http://projects.spring.io/spring-data/ ) Şimdi, Spring tarafından desteklenen tüm veri erişim teknisyenleri için bir tür ana proje mi yoksa Spring için yeni bir isim mi? -DAO?

Yanıtlar:


162

Bahsedilen her teknolojiye bir giriş burada.

İlkbahar-DAO

Spring-DAO, tam anlamıyla bir yay modülü değil, daha çok DAO yazmanızı ve onları iyi yazmanızı gerektiren kurallardır. Bu nedenle, verilerinize erişmek için arabirimler, uygulamalar veya şablonlar sağlamaz. Bir DAO yazarken @Repository, temel teknolojiyle bağlantılı istisnaların (JDBC, Hibernate, JPA, vb.) Tutarlı bir şekilde uygun DataAccessExceptionalt sınıfa çevrilmesi için bunlara açıklama eklemelisiniz .

Örnek olarak, şimdi Hazırda Bekletme kullandığınızı ve hizmet katmanınızın HibernateExceptionbuna tepki vermek için yakaladığını varsayalım . JPA'ya geçerseniz, DAO arayüzleriniz değişmemelidir ve hizmet katmanı yine de yakalanan bloklarla derlenecektir HibernateException, ancak DAO'larınız artık JPA attığı için bu bloklara asla girmeyeceksiniz PersistenceException. DAO'nuzda kullanarak @Repository, temel teknolojiyle bağlantılı istisnalar Spring'e çevrilir DataAccessException; hizmet katmanınız bu istisnaları yakalar ve kalıcılık teknolojisini değiştirmeye karar verirseniz, aynı BaharDataAccessExceptions , bahar yerel istisnaları tercüme ettiği için yine de fırlatılacaktır.

Bununla birlikte, aşağıdaki nedenlerden dolayı bunun sınırlı kullanımı olduğunu unutmayın:

  1. Sağlayıcı işlemi geri almış olabileceğinden (tam istisna alt türüne bağlı olarak) kalıcılık istisnalarını genellikle yakalamamalısınız ve bu nedenle yürütmeye alternatif bir yolla devam etmemelisiniz.
  2. İstisnalar hiyerarşisi genellikle sağlayıcınızda Spring'in sağladığından daha zengindir ve bir sağlayıcıdan diğerine kesin bir eşleştirme yoktur. Buna güvenmek tehlikelidir. Ancak bu @Repository, çekirdekler tarama prosedürü tarafından otomatik olarak ekleneceğinden, DAO'larınıza açıklama eklemek için iyi bir fikirdir . Ayrıca, Bahar ek açıklamaya başka kullanışlı özellikler ekleyebilir.

İlkbahar-JDBC

Spring-JDBC, sıhhi tesisat kodunu kaldıran ve SQL sorgusu ve parametreleri üzerinde konsantre olmanıza yardımcı olan JdbcTemplate sınıfını sağlar. Bunu bir ile yapılandırmanız yeterlidir DataSourceve ardından şu şekilde kod yazabilirsiniz:

int nbRows = jdbcTemplate.queryForObject("select count(1) from person", Integer.class);

Person p = jdbcTemplate.queryForObject("select first, last from person where id=?", 
             rs -> new Person(rs.getString(1), rs.getString(2)), 
             134561351656L);

Spring-JDBC ayrıca DAO'nuzu geliştirmek için genişletebileceğiniz bir Jdbc DaoSupport sağlar. Temel olarak 2 özelliği tanımlar: her ikisi de DAO yöntemlerini uygulamak için kullanılabilen bir DataSource ve bir JdbcTemplate. Ayrıca SQL istisnalarından Spring DataAccessExceptions'a bir istisna çevirmeni sağlar.

Düz jdbc kullanmayı planlıyorsanız, kullanmanız gereken modül budur.

Bahar-ORM

Spring-ORM, JPA, JDO, Hibernate ve iBatis gibi pek çok kalıcı teknolojiyi kapsayan bir şemsiye modüldür. Spring, bu teknolojilerin her biri için entegrasyon sınıfları sağlar, böylece her teknoloji Spring konfigürasyon ilkelerine göre kullanılabilir ve Spring işlem yönetimi ile sorunsuz bir şekilde entegre olur.

Her teknoloji için, konfigürasyon temelde bir DataSourcefasulyenin bir çeşit SessionFactoryveya EntityManagerFactoryvb. Fasulyeye enjekte edilmesinden oluşur . Tam JDBC için, JDBC yalnızca bir DataSource'a dayandığından, bu tür entegrasyon sınıflarına (JdbcTemplate dışında) gerek yoktur.

JPA veya Hibernate gibi bir ORM kullanmayı planlıyorsanız, spring-jdbc'ye değil, yalnızca bu modüle ihtiyacınız olacak.

Bahar Verileri

Spring-Data, hem SQL hem de NOSQL veri kaynaklarını kapsayan, verilere nasıl erişileceğini (DAO + ek açıklamaları) daha genel bir şekilde tanımlamak için ortak bir API sağlayan bir şemsiye projedir.

İlk fikir, geliştiricinin bir DAO için arabirimi (bulucu yöntemleri) ve varlık sınıflarını teknolojiden bağımsız bir şekilde ve yalnızca yapılandırmaya dayalı olarak (DAO'lar ve varlıklar üzerindeki açıklamalar + yay yapılandırması) yazması için bir teknoloji sağlamaktır. xml veya java tabanlı), uygulama teknolojisine karar verir; JPA (SQL) veya redis, hadoop, vb. (NOSQL).

Bulucu yöntem adları için spring tarafından tanımlanan adlandırma kurallarını izlerseniz, en basit durumlar için bulucu yöntemlere karşılık gelen sorgu dizelerini sağlamanız bile gerekmez. Diğer durumlar için, bulucu yöntemlerdeki ek açıklamalar içinde sorgu dizesini sağlamanız gerekir.

Uygulama bağlamı yüklendiğinde, spring veri erişim teknolojisi ile ilgili tüm standart kodu içeren DAO arayüzleri için proxy'ler sağlar ve yapılandırılmış sorguları çağırır.

Spring-Data, SQL dışı teknolojilere odaklanır, ancak yine de JPA (tek SQL teknolojisi) için bir modül sağlar.

Sıradaki ne

Tüm bunları bilerek, şimdi ne seçeceğinize karar vermelisiniz. Buradaki iyi haber şu ki, teknoloji için kesin bir son seçim yapmanız gerekmiyor. Aslında Spring gücünün bulunduğu yer burasıdır: bir geliştirici olarak, kod yazarken işe konsantre olursunuz ve eğer bunu iyi yaparsanız, temel teknolojiyi değiştirmek bir uygulama veya yapılandırma ayrıntısıdır.

  1. Varlıklar için POJO sınıflarıyla bir veri modeli tanımlayın ve varlık özniteliklerini ve diğer varlıklarla ilişkileri temsil etmek için alma / ayarlama yöntemleri. Teknolojiye dayalı olarak varlık sınıflarına ve alanlarına kesinlikle açıklama eklemeniz gerekecek, ancak şimdilik POJO'lar başlamak için yeterli. Şimdilik sadece iş gereksinimlerine odaklanın.
  2. DAO'larınız için arayüzler tanımlayın. 1 DAO tam olarak 1 varlığı kapsar, ancak ilişkilerde gezinerek ek varlıkları yükleyebilmeniz gerektiğinden, her biri için kesinlikle bir DAO'ya ihtiyacınız olmayacak. Katı adlandırma kurallarına göre bulucu yöntemlerini tanımlayın.
  3. Buna dayanarak, başka biri DAO'larınız için taklitlerle hizmetler katmanı üzerinde çalışmaya başlayabilir.
  4. İhtiyaçlarınıza en uygun olanı bulmak için farklı kalıcılık teknolojilerini (sql, no-sql) öğrenir ve bunlardan birini seçersiniz. Buna dayanarak, varlıklara açıklama eklersiniz ve DAO'ları uygularsınız (veya yay verilerini kullanmayı seçerseniz, Spring'in bunları sizin için uygulamasına izin verirsiniz).
  5. İş gereksinimleri gelişirse ve veri erişim teknolojiniz bunu desteklemek için yeterli değilse (örneğin, JDBC ve birkaç kuruluşla başladınız, ancak şimdi daha zengin bir veri modeline ihtiyacınız varsa ve JPA daha iyi bir seçimdir), uygulamayı değiştirmeniz gerekecektir. DAO'larınızda, varlıklarınıza birkaç ek açıklama ekleyin ve yay yapılandırmasını değiştirin (bir EntityManagerFactory tanımı ekleyin). İşletme kodunuzun geri kalanı, değişikliğinizin diğer etkilerini görmemelidir.

Not: İşlem Yönetimi

Spring, işlem yönetimi için bir API sağlar. Veri erişimi için yayı kullanmayı planlıyorsanız, işlem yönetimi için yayı da kullanmalısınız, çünkü bunlar birbirlerine gerçekten iyi entegre olurlar. Spring tarafından desteklenen her veri erişim teknolojisi için, yerel işlemler için eşleşen bir işlem yöneticisi vardır veya dağıtılmış işlemlere ihtiyacınız varsa JTA'yı seçebilirsiniz. Hepsi aynı API'yi kullanır, böylece (bir kez daha) teknoloji seçimi, işletme kodu üzerinde daha fazla etki olmaksızın değiştirilebilecek bir konfigürasyon meselesidir.

Not: Yay belgeleri

Bahsettiğiniz Bahar belgelerine bağlantılar oldukça eskidir. İşte en son sürümün belgeleri (4.1.6, tüm konuları kapsar):

Bahar verileri, Bahar çerçevesinin bir parçası değildir. İlkelere alışmak için önce okumanız gereken ortak bir modül var. Belgeler burada bulunabilir:


Buradaki bazı açıklamalarda (Bahar Verileri gibi) "şemsiye" terimini kullanan bu Yanıtı takdir ediyorum, (bir şemsiyenin daha fazla alana özgü olması yerine) içinde alt bileşenler / modüller olduğunu tanımlıyorum. Ve Spring Data'dan bahsetmek, soruda bahsedilmemesine rağmen burada bağlamda çok yararlıdır.
cellepo

spring-jdbcBurada belirtilmeyen başka yararlı araçlar sağlamıyor mu ? Örneğin SimpleJdbcInsert, hem tek girişli giriş hem de toplu (elbette makul bir ölçeğe kadar) için çok temiz ve kullanışlı buluyorum .
Nom1fan

3

Spring DAO ( D ata A ccess O bject): JDBC uygulama çerçevelerine soyut bir arayüz sağlayan bir nesnedir, yani Spring DAO, JDBC ve Hibernate, MyBatis, JPA, JDO'ya kendi ayrı Destek sınıflarını kullanarak erişmek için genelleştirilmiş bir konsepttir. Ve ek açıklamayı tanımlayarak genelleştirilmiş istisna hiyerarşisi sağlar @Repository. İçin Bahar kaba Bu açıklama tanımlar SQL özel çeviri gelen SQLExceptionSpring'in veri erişim için strateji-agnostik DataAccessException hiyerarşi.

yani platforma özgü istisnalar yakalanır ve ardından Spring'in kontrol edilmeyen veri erişim istisnalarından biri olarak yeniden fırlatılır.


Yay JDBC : Düz JDBC için sadece bu modül bağlıdır kullanımı DataSourceve Şablon sınıfları gibi JdbcTemplate, NamedParameterJdbcTemplate(sargıları JdbcTemplate) ve SimpleJdbcTemplateçapraz kesim endişeleri azaltmak için.

public class EmployeeDao {  
private JdbcTemplate jdbcTemplate;  

public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {  
    this.jdbcTemplate = jdbcTemplate;  
}  

public int saveEmployee(Employee e){  
    return jdbcTemplate.update(query);  
}  
public int updateEmployee(Employee e){  
    return jdbcTemplate.update(query);  
}  
public int deleteEmployee(Employee e){  
       return jdbcTemplate.update(query);  
}  

}  

ve Spring XML'de:

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource" ref="dataSource"/>
</bean>

Bahar JDBC da sağlar JdbcDaoSupport, NamedParameterJdbcDaoSupport, SimpleJdbcDaoSupport, hangi destek (yani uygun genişletmek ve kendi geliştirmek için) bir yol DAO aşağıdaki gibi soyut arayüzü:

public interface EmployeeDao {

    public void saveEmployee(Employee emp);
}

public class EmployeeDaoImpl extends JdbcDaoSupport implements EmployeeDao{

    @Override
    public void saveEmployee(Employee emp) {

        Object[] inputs = new Object[] {emp.getName(), emp.getSalary(), emp.getDept()};
        getJdbcTemplate().update(query, inputs);
    }
}

ve ilkbaharda XML:

<bean id="employeeDAO" class="EmployeeDaoImpl">
        <property name="dataSource" ref="dataSource" />
    </bean>

Spring ORM: Hibernate, JPA, MyBatis gibi ORM araçları desteği için ... Spring'i DataSourceaşağıdaki sınıflar ve ilgili DaoSupportsınıflarla birlikte enjekte ederek kolayca entegre eder .

  • SessionFactory Hazırda Bekletme için
  • EntityManagerFactory JPA için
  • SqlSessionFactory MyBatis için

1

Spring-dao lib 2.0.8 (Ocak 2008) sürümünde durduruldu. Spring dao'daki sınıflar spring-tx'e kopyalandı. Eğer yay dao bulduğunuz bir sınıf gerekiyorsa, e bağımlılığını eklemek yay tx yerine. ( Kaynak .)


0

Sen gibi bir arayüz oluşturmak SomeObjectDaove sonra gibi bu arayüzün farklı uygulamalar oluşturabilmesi JdbcSomeObjectDao, HibernateSomeObjectDao. Daha sonra SomeObjectServicesınıfınızda SomeObjectDaoarayüz üzerinde çalışacak ve oraya somut uygulamalardan birini enjekte edeceksiniz . Yani her uygulamaSomeObjectDao , JDBC veya ORM vb. Kullansanız da, ayrıntıları gizleyecektir.

Genellikle JDBC ve farklı ORM uygulamaları farklı türde istisnalar atar. Spring'in DAO desteği , bu farklı, teknolojiye özgü istisnaları yaygın Spring DAO istisnalarına eşleyebilir. Böylece gerçek uygulamadan daha fazla ayrışmış olursunuz. Ayrıca Spring'in DAO desteği , *DataSupportDAO geliştirmeye daha da fazla yardımcı olan bir dizi soyut sınıf sunar . Dolayısıyla, SomeObjectDaoarayüzünüzü uygulamanın yanı sıra , Spring *DataSupportsınıflarından birini genişletebilirsiniz .


Yani Spring-dao'nun Hibernate / JDO / JDBC'ye özgü istisnaları kaldırıp standart bir istisna kümesi sağladığını mı söylüyorsunuz? DB'ye templateserişmek için var mı ? yoksa diğer yay bileşenleri ile kullanılacak bir soyutlama mı? Örneğin, db'ye erişmek için yalnızca spring-dao kullanan bir kod yazmak mümkün müdür (spring-jdbc, spring-orm, hibernate veya başka bir çerçeve kullanmadan)?
Pat

0

Ek bilgi olarak. Spring Data JPA kullanmanızı öneririm. @Repository, @Service gibi anotasyonları kullanma. Sana bir örnek gösteriyorum:

@Repository("customerEntitlementsRepository")
public interface CustomerEntitlementsRepository extends CrudRepository<BbsExerul, BbsExerulPK> {

  @Query(value = "SELECT " + "CONTRACT_NUMBER, EXECUTIVE_NUMBER, " + "GROUP_VALUE, " + "CODE, "
      + "SUBCODE, " + "CURRENCY " + "FROM BBS_EXERUL " + "WHERE CONTRACT_NUMBER =:clientId AND "
      + "EXECUTIVE_NUMBER =:representativeId", nativeQuery = true)
  Collection<CustomerEntitlementsProjection> getFieldsExerul(@Param("clientId") String clientId,
      @Param("representativeId") String representativeId);

}

CustomerEntitlementsProjection, kuruluşunuz veya DTO pojo ile bağlantılı olan Bahar projeksiyonu olduğunda;

@Projection(name = "customerEntitlementsProjection", types = { BbsExerul.class })
public interface CustomerEntitlementsProjection {

  String getContractNumber();

  String getExecutiveNumber();

1
Lütfen kodunuzu okunabilir olması için kod blokları halinde biçimlendirin.
CertainPerformance
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.