Skip to content

13. SQL Server 2014

Şimdi, MySQL ile yapılan işlemlerin SQL Server 2014'e taşınmasına geçiyoruz.

13.1. Çalışma ortamının kurulması

13.1.1. Eclipse ortamı

Aşağıdaki Eclipse ortamında çalışacağız:

  

Yukarıdaki SQL Server projeleri, [<exemples>/spring-database-config\sqlserver\eclipse] klasöründe bulunur.

Not: Tüm Maven projelerini yeniden oluşturmak için [Alt-F5] komutunu çalıştırın.

13.1.2. Veritabanlarının Oluşturulması

Oracle ve DB2'te olduğu gibi, JDBC sürücüsünü SQL Sunucusu için yerel Maven deposuna yüklememiz gerekecektir.

  

[install.bat] dosyası aşağıdaki kodu içerir:

"%M2_HOME%\bin\mvn.bat" install:install-file -Dfile=sqljdbc4-3.0.jar -Dpackaging=jar -DgroupId=com.microsoft.sqlserver -DartifactId=sqljdbc4 -Dversion=4.0

burada [%M2-HOME%], Maven'ın kurulum klasörüdür (bkz. paragraf 23.2, sayfa 466). Bu kurulumun ardından, SQL Sunucusunun JDBC sürücüsü, [pom.xml] dosyalarında aşağıdaki bağımlılıkla referanslanabilir:


        <dependency>
            <groupId>com.microsoft.sqlserver</groupId>
            <artifactId>sqljdbc4</artifactId>
            <version>4.0</version>
</dependency>

Bundan sonra, SQL ve SERVER veritabanlarına bağlantı, [sa / msde] kimlik bilgileriyle gerçekleştirilir. SQL Sunucusunu ve [MsManager] istemcisini başlatın (bkz. paragraf 23.9).

  • [1]'te, SQL ve [<exemples>\spring-database-config\sqlserver\databases\dbproduits.sql] komut dosyalarını yükleyin;
  • [2]'te, [spring-jdbc-01 à 03] projeleri için aynı [PRODUITS] tablosunun kullanılması mümkün olmadı. Bunun nedeni şudur:
    • [spring-jdbc-01 et 02] projeleri, birincil anahtarlarıyla birlikte satırlar ekler;
    • [spring-jdbc-03] projesi ise birincil anahtarsız satırlar ekler ve SGBD projesinin bu anahtarları oluşturmasını bekler. Bunun için [ID] birincil anahtarının [Identity] türünde olması gerekir. Ancak SQL Sunucusundaki bu tür, yalnızca birincil anahtarların otomatik olarak oluşturulmasını destekler ve kullanıcı tarafından belirlenen birincil anahtara sahip bir satırın eklenmesine izin vermez. Bu durumda bir hata bildirilir ve ben bu hatayı aşamadım. [spring-jdbc-01 et 02] projeleri, birincil anahtarların otomatik olarak oluşturulmadığı [PRODUITS] tablosunu kullanır. [spring-jdbc-03] projesi ise birincil anahtarların otomatik olarak oluşturulduğu [PRODUITS2] tablosunu kullanır.

Şimdi şu yapılandırmaları çalıştırın:

  • [spring-jdbc-generic-01.IntroJdbc01] ;
  • [spring-jdbc-generic-01.IntroJdbc02] ;
  • [spring-jdbc-generic-03.JUnitTestDao1];
  • [spring-jdbc-generic-03.JUnitTestDao2];

Hepsi başarılı olmalıdır.

Şimdi [dbproduitscategories] veritabanını oluşturalım. [dbproduits]'i oluşturmak için uyguladığınız prosedürü [dbproduitscategories] için de tekrarlayın. Yüklenecek SQL komut dosyası, [<exemples>\spring-database-config\sqlserver\databases\ dbproduitscategories.sql] konumunda bulunur;

  

Şimdi, aşağıdaki yapılandırmaları uygulayın:

  • [spring-jdbc-generic-04.JUnitTestDao];
  • [spring-jpa-generic-JUnitTestDao-openjpa];

Her ikisi de başarılı olmalıdır.

13.2. JDBC katmanının yapılandırılması

 

[sqlserver-config-jdbc] projesi, aşağıdaki test mimarisinin [JDBC] katmanını yapılandırır:

Bu proje, SGBD MySQL'in JDBC katmanına ait [mysql-config-jdbc] yapılandırma projesine benzemektedir (bkz. paragraf 3.3). Burada yalnızca değişiklikleri sunuyoruz:

[pom.xml] dosyası, SQL Sunucusundan JDBC sürücüsünü içe aktarmaktadır:


<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>dvp.spring.database</groupId>
    <artifactId>generic-config-jdbc</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>configuration generic jdbc</name>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.2.3.RELEASE</version>
    </parent>

    <dependencies>
        <!-- değişken bağımlılıklar ********************************************** -->
        <!-- SGBD'in JDBC sürücüsü -->
        <dependency>
            <groupId>com.microsoft.sqlserver</groupId>
            <artifactId>sqljdbc4</artifactId>
            <version>4.0</version>
        </dependency>
        <!-- sabit bağımlılıklar ********************************************** -->
        ...
    </dependencies>
...
</project>
  • 18-22. satırlar: SQL Sunucusundaki JDBC sürücüsü;

İkinci değişiklik, veritabanlarına erişim kimliklerini tanımlayan [ConfigJdbc] sınıfındadır:


    // bağlantı parametreleri
    public final static String DRIVER_CLASSNAME = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
    public final static String URL_DBPRODUITS = "jdbc:sqlserver://localhost\\SQLEXPRESS:1433;databaseName=dbproduits";
    public final static String USER_DBPRODUITS = "sa";
    public final static String PASSWD_DBPRODUITS = "msde";
    public final static String URL_DBPRODUITSCATEGORIES = "jdbc:sqlserver://localhost\\SQLEXPRESS:1433;databaseName=dbproduitscategories";
    public final static String USER_DBPRODUITSCATEGORIES = "sa";
public final static String PASSWD_DBPRODUITSCATEGORIES = "msde";

Yapılabilecek üçüncü değişiklik, bir [PreparedStatement]'in destekleyebileceği maksimum parametre sayısıyla ilgilidir:


    // bir [PreparedStatement]'in maksimum parametre sayısı
    public final static int MAX_PREPAREDSTATEMENT_PARAMETERS = 2000;

[JUnitTestPushTheLimits] testi, 5000 ürün üzerinde SQL emirleri oluşturur ve bu emirler 5000 parametre içeren [PreparedStatement]'leri üretir. MySQL bu değeri desteklemişti. SQL Sunucusu, bu sınırın 2100 olduğunu belirten bir hata mesajı vermiştir.

Dördüncü değişiklik, [spring-jdbc-03] projesi tarafından kullanılan tabloda yapılmıştır. Artık [PRODUITS] değil, [PRODUITS2]'tir:


    // komutlar SQL [jdbc-03]
    public final static String V2_INSERT_PRODUITS = "INSERT INTO PRODUITS2(NOM, CATEGORIE, PRIX, DESCRIPTION) VALUES (?, ?, ?, ?)";
    public final static String V2_DELETE_ALLPRODUITS = "DELETE FROM PRODUITS2";
    public final static String V2_DELETE_PRODUITS = "DELETE FROM PRODUITS2 WHERE ID=?";
    public final static String V2_SELECT_ALLPRODUITS = "SELECT ID, NOM, CATEGORIE, PRIX, DESCRIPTION FROM PRODUITS2";
    public final static String V2_SELECT_PRODUIT_BYID = "SELECT NOM, CATEGORIE, PRIX, DESCRIPTION FROM PRODUITS2 WHERE ID=?";
    public final static String V2_SELECT_PRODUIT_BYNAME = "SELECT ID, CATEGORIE, PRIX, DESCRIPTION FROM PRODUITS2 WHERE NOM=?";
public final static String V2_UPDATE_PRODUITS = "UPDATE PRODUITS2 SET NOM=?, PRIX=?, CATEGORIE=?, DESCRIPTION=? WHERE ID=?";

13.3. JPA katmanının yapılandırması OpenJpa

 

[sqlserver-config-jpa-openjpa] projesi, test mimarisinin [JPA] katmanını yapılandırır:

Bu proje, [mysql-config-jpa-openjpa] yapılandırma projesine benzerdir; bu proje ise JPA, OpenJpa, SGBD ve MySQL katmanlarına aittir (bkz. paragraf 8.3). Aslında, her iki SGBD de birincil anahtarları oluşturmak için [@GeneratedValue(strategy = GenerationType.IDENTITY)] ek açıklaması kullanmaktadır. Yapılması gereken iki değişiklik vardır. Bu değişiklik, [ConfigJpa] sınıfının [jpaVendorAdapter] bean tanımında yer almaktadır:


    // JPA sağlayıcısı
    @Bean
    public JpaVendorAdapter jpaVendorAdapter() {
        OpenJpaVendorAdapter openJpaVendorAdapter = new OpenJpaVendorAdapter();
        openJpaVendorAdapter.setShowSql(false);
        openJpaVendorAdapter.setDatabase(Database.SQL_SERVER);
        openJpaVendorAdapter.setGenerateDdl(true);
        return openJpaVendorAdapter;
}
  • 6. satır: JPA uygulamasına, bir SQL Server veritabanıyla çalışacağı belirtilir. Böylece JPA uygulaması, hem özel veri türlerini hem de bu SGBD'in sahibi olan SQL'i benimseyecektir.

İkinci değişiklik, [PRODUITS] ve [PRODUITS2] tablolarıyla ilişkili JPA varlıklarını ilgilendirir:

  

[Produit] varlığı, birincil anahtarların otomatik olarak oluşturulmaması durumunda ([@GeneratedValue] notasyonunun bulunmaması) [PRODUITS] tablosuyla ilişkilidir:


@Entity(name = "Produit1")
@Table(name = ConfigJdbc.TAB_PRODUITS)
public class Produit {

// alanlar
@Id
@Column(name = ConfigJdbc.TAB_PRODUITS_ID)
private Long id;

[Produit2] varlığı, birincil anahtarların otomatik olarak oluşturulduğu [PRODUITS2] tablosuyla ilişkilidir:


@Entity(name = "Produit2")
@Table(name = ConfigJdbc.TAB_PRODUITS2)
public class Produit2 {

// alanlar
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = ConfigJdbc.TAB_PRODUITS_ID)
private Long id;

Ayrıca, [dbproduits] veritabanını oluşturan proje, veritabanında artık iki adet JPA varlığı olduğunu belirtmek üzere değiştirilmelidir:

  

[persistence.xml] dosyası şu şekilde değiştirilir:


<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
    <persistence-unit name="generic-jpa-entities-dbproduits" transaction-type="RESOURCE_LOCAL">
        <!-- varlıklar JPA -->
        <class>generic.jpa.entities.dbproduits.Produit</class>
        <class>generic.jpa.entities.dbproduits.Produit2</class>
        <exclude-unlisted-classes>true</exclude-unlisted-classes>
    </persistence-unit>
</persistence>

[generic-create-dbproduits] projesi, tüm SGBD'ler için ortaktır. Daha önce incelenenlerin JPA katmanında [Produit2] varlığı bulunmamaktaydı. Bu durumda, var olmayan bir JPA varlığına başvurmanın, bu SGBD projelerini çökertip çökertmeyeceği sorusu akla gelebilir. Testler bunun böyle olmadığını göstermektedir.

Bu değişiklikler yapıldıktan sonra, [spring-jpa-generic-JUnitTestDao-openjpa] yapılandırmasının çalıştırılması başarılı olmalıdır.

13.4. JPA Hibernate katmanının yapılandırılması

 

Not: Tüm Maven projelerini yeniden oluşturmak için [Alt-F5] komutunu çalıştırın.

[sqlserver-config-jpa-hibernate] projesi, [mysql-config-jpa-hibernate] (6.3. paragraf) ile aynıdır ve [mysql-config-jpa-openjpa] projesinin [sqlserver-config-jpa-openjpa] projesine taşınmasında yapılan değişikliklerin aynısı bu projede de uygulanmıştır (8.3. paragraf).

Bu değişiklikler yapıldıktan sonra, [spring-jpa-generic-JUnitTestDao-hibernate-eclipselink] yapılandırmasının çalıştırılması başarılı olmalıdır.

 

Not: Tüm Maven projelerini yeniden oluşturmak için [Alt-F5] komutunu çalıştırın.

[sqlserver-config-jpa-eclipselink] projesi, [mysql-config-jpa-eclipselink] projesine (7.3. paragraf) ve [mysql-config-jpa-openjpa] projesinin [sqlserver-config-jpa-openjpa] projesine taşınmasında yapılan değişikliklerin aynısı uygulanmıştır (8.3. paragraf).

Bu değişiklikler yapıldıktan sonra, [spring-jpa-generic-JUnitTestDao-hibernate-eclipselink] yapılandırmasının çalıştırılması başarılı olmalıdır.