12. IBM DB2 Express-C 10.5
接下来我们将探讨如何将针对 MySQL 所做的修改移植到 DB2 上。事实上,这两个数据库管理系统在生成主键时采用的是相同的策略。
![]() |
12.1. 设置工作环境
12.1.1. Eclipse 环境
我们将使用以下 Eclipse 环境:
![]() |
上述 DB2 项目位于 [<examples>/spring-database-config\db2\eclipse] 文件夹中。
注意:按 [Alt-F5] 可重新生成所有 Maven 项目。
12.1.2. 生成数据库
与处理 Oracle 时一样,我们需要将 DB2 JDBC 驱动程序安装到本地 Maven 仓库中。
![]() |
[install.bat] 文件包含以下代码:
"%M2_HOME%\bin\mvn.bat" install:install-file -Dfile=db2jcc4.jar -Dpackaging=jar -DgroupId=com.ibm.jdbc -DartifactId=db2jcc4 -Dversion=1.0
其中 [%M2-HOME%] 是 Maven 安装目录(参见第 23.2 节)。安装完成后,可在 [pom.xml] 文件中通过以下依赖项引用 DB2 JDBC 驱动程序:
<dependency>
<groupId>com.ibm.jdbc</groupId>
<artifactId>db2jcc4</artifactId>
<version>1.0</version>
</dependency>
在本指南的其余部分中,连接 DB2 数据库将使用凭据 [db2admin / db2admin]。启动 DB2 及其客户端 [Db2Manager](参见第 23.8 节)。
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
![]() |
数据库 [DBPROD] 就是之前 DBMS 中的 [dbproduits] 数据库。不过,[DB2Manager] 不允许我使用该名称(可能是因为名称太长)。现在,我们将使用以下 Eclipse 运行配置 [generic-create-dbproduits-jpa] 来创建 [PRODUITS] 表:
![]() | ![]() |
执行该操作将在 [DBPROD] 数据库中创建 [PRODUITS] 表:
![]() |
- 在上文[1]中,该序列并非由[OpenJpa]生成,而是由DB2自身生成的,DB2在内部使用该序列来生成主键;
现在,运行以下配置:
- [spring-jdbc-generic-01.IntroJdbc01];
- [spring-jdbc-generic-01.IntroJdbc02];
- [spring-jdbc-generic-03.JUnitTestDao1];
- [spring-jdbc-generic-03.JUnitTestDao2];
它们都应该通过。
现在让我们生成 [dbproduitscategories] 数据库。出于前面提到的数据库名称长度限制的原因,这里将其命名为 [DBCAT]。请按照创建 [DBPROD] 时所用的步骤来创建 [DBCAT]。
![]() |
现在,我们将使用 [generic-create-dbproduitscategories-openjpa] 配置,通过 Eclipse 为 [DBCAT] 数据库创建表:
![]() | ![]() |
此操作将产生以下结果:
![]() | ![]() |
您必须修改这五个表的 [VERSIONING] 列,使其默认值为 1:
![]() |
![]() |
此步骤必须对所有五个表执行。
现在,运行以下配置:
- [spring-jdbc-generic-04.JUnitTestDao];
- [spring-jpa-generic-JUnitTestDao-openjpa];
两者都应通过。
12.2. 配置 JDBC 层
![]() | ![]() |
[db2-config-jdbc] 项目配置了以下测试架构的 [JDBC] 层:
![]() |
该项目与 MySQL 数据库管理系统(DBMS)JDBC 层的 [mysql-config-jdbc] 配置项目类似(参见第 3.3 节)。此处仅列出变更内容:
[pom.xml] 文件引入了 DB2 JDBC 驱动程序:
<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>
- 第 18-22 行:DB2 JDBC 驱动程序;
第二个改动位于 [ConfigJdbc] 类中,该类定义了数据库访问凭据:
// 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";
可以进行的第三项修改是调整 [PreparedStatement] 支持的参数最大数量:
// max number of parameters of a [PreparedStatement]
public final static int MAX_PREPAREDSTATEMENT_PARAMETERS = 10000;
[JUnitTestPushTheLimits] 测试会为 5,000 种产品生成 SQL 语句,这将生成包含 5,000 个参数的 [PreparedStatement] 对象。MySQL 支持这一数值,DB2 同样支持。
第四项更改是 [ROLES] 表的名称。该名称在 DB2 数据库管理系统中已被保留。因此,我们将它重命名为 [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. 配置 OpenJPA JPA 层
![]() | ![]() |
[db2-config-jpa-openjpa] 项目用于配置测试架构的 [JPA] 层:
![]() |
该项目类似于针对 MySQL 数据库管理系统 (DBMS) 的 OpenJpa JPA 层的 [mysql-config-jpa-openjpa] 配置项目(参见第 8.3 节)。 实际上,这两个数据库管理系统都使用 [@GeneratedValue(strategy = GenerationType.IDENTITY)] 注解来生成主键。只需进行一项修改,即在 [ConfigJpa] 类中对 [jpaVendorAdapter] Bean 的定义进行调整:
// the provider JPA
@Bean
public JpaVendorAdapter jpaVendorAdapter() {
OpenJpaVendorAdapter openJpaVendorAdapter = new OpenJpaVendorAdapter();
openJpaVendorAdapter.setShowSql(false);
openJpaVendorAdapter.setDatabase(Database.DB2);
openJpaVendorAdapter.setGenerateDdl(true);
return openJpaVendorAdapter;
}
- 第 6 行:我们告知 JPA 实现,它将与 DB2 数据库进行交互。随后,JPA 实现将采用该数据库管理系统(DBMS)的专有数据类型和专有 SQL 语句。
完成这些修改后,运行 [spring-jpa-generic-JUnitTestDao-openjpa] 配置应能成功。
![]() | ![]() |
12.4. 配置 Hibernate JPA 层
![]() | ![]() |
注意:按 [Alt-F5] 可重新生成所有 Maven 项目。
[db2-config-jpa-hibernate] 项目与 [mysql-config-jpa-hibernate] 项目(第 6.3 节)类似,采用了与将 [mysql-config-jpa-openjpa] 项目移植到 [db2-config-jpa-openjpa] 项目(第 12.3 节)时相同的修改。
完成这些更改后,运行 [spring-jpa-generic-JUnitTestDao-hibernate-eclipselink] 配置应该会成功。
12.5. 配置 EclipseLink JPA 层
![]() | ![]() |
注意:按 [Alt-F5] 可重新生成所有 Maven 项目。
[db2-config-jpa-eclipselink] 项目与 [mysql-config-jpa-eclipselink](第 7.3 节)类似,采用了与将 [mysql-config-jpa-openjpa] 项目移植到 [db2-config-jpa-openjpa] 项目(第 12.3 节)时相同的修改。
完成这些修改后,[spring-jpa-generic-JUnitTestDao-hibernate-eclipselink] 配置的执行应能成功。































