Skip to content

12. IBM DB2 Express-C 10.5

Vamos agora abordar a adaptação para o DB2 do que foi feito com o MySQL. Ambos os SGBDs utilizam, de facto, a mesma estratégia para gerar chaves primárias.

12.1. Configurar o ambiente de trabalho

12.1.1. Ambiente Eclipse

Iremos trabalhar com o seguinte ambiente Eclipse:

  

Os projetos DB2 acima referidos podem ser encontrados na pasta [<examples>/spring-database-config\db2\eclipse].

Nota: Prima [Alt-F5] para regenerar todos os projetos Maven.

12.1.2. Gerar as bases de dados

Tal como fizemos com o Oracle, teremos de instalar o controlador JDBC do DB2 no repositório local do Maven.

  

O ficheiro [install.bat] contém o seguinte código:

"%M2_HOME%\bin\mvn.bat" install:install-file -Dfile=db2jcc4.jar -Dpackaging=jar -DgroupId=com.ibm.jdbc -DartifactId=db2jcc4 -Dversion=1.0

onde [%M2-HOME%] é o diretório de instalação do Maven (ver secção 23.2). Após esta instalação, o controlador JDBC do DB2 pode ser referenciado nos ficheiros [pom.xml] utilizando a seguinte dependência:


        <dependency>
            <groupId>com.ibm.jdbc</groupId>
            <artifactId>db2jcc4</artifactId>
            <version>1.0</version>
</dependency>

Ao longo do resto deste guia, as ligações às bases de dados DB2 são feitas utilizando as credenciais [db2admin / db2admin]. Inicie o DB2 e o seu cliente [Db2Manager] (consulte a secção 23.8).

  

A base de dados [DBPROD] é a base de dados [dbproduits] do SGBD anterior. No entanto, o [DB2Manager] não me permitiu utilizar esse nome (talvez por ser demasiado longo para ele). Agora, criamos a tabela [PRODUITS] utilizando a seguinte configuração de execução do Eclipse [generic-create-dbproduits-jpa]:

A execução cria a tabela [PRODUITS] na base de dados [DBPROD]:

  • no ponto [1] acima, a sequência não foi gerada pelo [OpenJpa], mas pelo próprio DB2, que a utiliza internamente para gerar chaves primárias;

Agora, execute as configurações:

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

Todos devem ser aprovados.

Agora vamos gerar a base de dados [dbproduitscategories]. Aqui, será chamada [DBCAT] pelas razões já mencionadas relativamente às restrições de comprimento do nome da base de dados. Repita o procedimento utilizado para criar [DBPROD] para [DBCAT].

  

Vamos agora criar as tabelas para a base de dados [DBCAT] a partir do Eclipse, utilizando a configuração [generic-create-dbproduitscategories-openjpa]:

Esta execução produz o seguinte resultado:

 

Deve modificar a coluna [VERSIONING] das cinco tabelas para que tenham 1 como valor predefinido:

 
 

Este passo deve ser realizado para todas as cinco tabelas.

Agora, execute as configurações:

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

Ambas devem ser aprovadas.

12.2. Configurar a camada JDBC

 

O projeto [db2-config-jdbc] configura a camada [JDBC] da seguinte arquitetura de teste:

O projeto é análogo ao projeto de configuração [mysql-config-jdbc] para a camada JDBC do SGBD MySQL (ver Secção 3.3). Apresentamos apenas as alterações:

O ficheiro [pom.xml] importa o controlador JDBC do DB2:


<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>
        <!-- dépendances variables ********************************************** -->
        <!-- driver JDBC from SGBD -->
        <dependency>
            <groupId>com.ibm.jdbc</groupId>
            <artifactId>db2jcc4</artifactId>
            <version>1.0</version>
        </dependency>
        <!-- dépendances constantes ********************************************** -->
....
    </dependencies>
 
...
</project>
  • linhas 18-22: o controlador JDBC do DB2;

A segunda alteração está na classe [ConfigJdbc], que define as credenciais de acesso à base de dados:


    // paramètres de connexion
    public final static String DRIVER_CLASSNAME = "com.ibm.db2.jcc.DB2Driver";
    public final static String URL_DBPRODUITS = "jdbc:db2://localhost:50000/dbprod";
    public final static String USER_DBPRODUITS = "db2admin";
    public final static String PASSWD_DBPRODUITS = "db2admin";
    public final static String URL_DBPRODUITSCATEGORIES = "jdbc:db2://localhost:50000/dbcat";
    public final static String USER_DBPRODUITSCATEGORIES = "db2admin";
    public final static String PASSWD_DBPRODUITSCATEGORIES = "db2admin";

A terceira modificação que pode ser feita diz respeito ao número máximo de parâmetros que um [PreparedStatement] pode suportar:


    // max number of parameters of a [PreparedStatement]
    public final static int MAX_PREPAREDSTATEMENT_PARAMETERS = 10000;

O teste [JUnitTestPushTheLimits] gera instruções SQL para 5 000 produtos, o que irá gerar objetos [PreparedStatement] com 5 000 parâmetros. O MySQL suportou este valor. O DB2 também.

A quarta alteração diz respeito ao nome da tabela [ROLES]. Este nome está reservado no SGBD DB2. Por isso, renomeámo-la para [ROLES_]:


public final static String TAB_ROLES = "ROLES_";
public static final String SELECT_ROLES_BYUSERID = "SELECT DISTINCT r.ID as r_ID, r.VERSIONING as r_VERSIONING, r.NAME as r_NAME FROM ROLES_ r, users u, USERS_ROLES ur"
+ " WHERE u.ID=:id AND ur.USER_ID=u.ID AND ur.ROLE_ID=r.ID";

12.3. Configurar a camada JPA do OpenJPA

 

O projeto [db2-config-jpa-openjpa] configura a camada [JPA] da arquitetura de teste:

O projeto é análogo ao projeto de configuração [mysql-config-jpa-openjpa] para a camada JPA do OpenJpa do SGBD MySQL (ver Secção 8.3). Na verdade, ambos os SGBDs utilizam a anotação [@GeneratedValue(strategy = GenerationType.IDENTITY)] para gerar chaves primárias. Há apenas uma alteração a fazer. Esta encontra-se na definição do bean [jpaVendorAdapter] na classe [ConfigJpa]:


    // the provider JPA
    @Bean
    public JpaVendorAdapter jpaVendorAdapter() {
        OpenJpaVendorAdapter openJpaVendorAdapter = new OpenJpaVendorAdapter();
        openJpaVendorAdapter.setShowSql(false);
        openJpaVendorAdapter.setDatabase(Database.DB2);
        openJpaVendorAdapter.setGenerateDdl(true);
        return openJpaVendorAdapter;
}
  • Linha 6: Indicamos à implementação JPA que irá trabalhar com uma base de dados DB2. A implementação JPA irá então adotar tanto os tipos de dados proprietários como o SQL proprietário deste SGBD.

Com estas alterações efetuadas, a execução da configuração [spring-jpa-generic-JUnitTestDao-openjpa] deverá ser bem-sucedida.

12.4. Configurar a camada JPA do Hibernate

 

Nota: Prima [Alt-F5] para regenerar todos os projetos Maven.

O projeto [db2-config-jpa-hibernate] é análogo ao projeto [mysql-config-jpa-hibernate] (Secção 6.3), com as mesmas modificações que foram utilizadas para portar o projeto [mysql-config-jpa-openjpa] para o projeto [db2-config-jpa-openjpa] (Secção 12.3).

Depois de estas alterações terem sido feitas, a execução da configuração [spring-jpa-generic-JUnitTestDao-hibernate-eclipselink] deverá ser bem-sucedida.

 

Nota: Prima [Alt-F5] para regenerar todos os projetos Maven.

O projeto [db2-config-jpa-eclipselink] é análogo ao [mysql-config-jpa-eclipselink] (Secção 7.3), com as mesmas modificações que foram utilizadas para portar o projeto [mysql-config-jpa-openjpa] para o projeto [db2-config-jpa-openjpa] (Secção 12.3).

Com estas modificações implementadas, a execução da configuração [spring-jpa-generic-JUnitTestDao-hibernate-eclipselink] deverá ser bem-sucedida.