12. IBM DB2 Express-C 10.5
现在,我们将讨论如何将 MySQL 中的工作移植到 DB2 上。实际上,这两个 SGBD 具有相同的primary key生成策略。
![]() |
12.1. 工作环境的搭建
12.1.1. Eclipse 环境
我们将使用以下 Eclipse 环境:
![]() |
上述项目 DB2 位于文件夹 [<exemples>/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] 是基于之前 [dbproduits] 的 SGBD。但 [DB2Manager] 不允许我使用这个名称(也许对他来说太长了)。 现在,我们将使用以下 Eclipse 运行配置创建 [PRODUITS] 表:
![]() | ![]() |
该执行操作在数据库 [DBPROD] 中创建了表 [PRODUITS]:
![]() |
- 在上述的 [1] 中,该序列并非由 QZXXW2HTMLP003401ZQX 生成,而是由 DB2 自身生成的,该表在内部使用该序列来生成主键;
现在,请执行以下配置:
- [spring-jdbc-generic-01.IntroJdbc01];
- [spring-jdbc-generic-01.IntroJdbc02] ;
- [spring-jdbc-generic-03.JUnitTestDao1] ;
- [spring-jdbc-generic-03.JUnitTestDao2] ;
它们都必须成功。
现在生成数据库 [dbproduitscategories]。出于前面提到的数据库名称长度限制,此处将其命名为 [DBCAT]。请针对 [DBCAT] 重复执行创建 [DBPROD] 时所用的步骤。
![]() |
现在,我们将使用配置 [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] 层:
![]() |
该项目与 SGBD MySQL 架构中 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>
<!-- 变量依赖关系 ********************************************** -->
<!-- SGBD 的驱动程序 JDBC -->
<dependency>
<groupId>com.ibm.jdbc</groupId>
<artifactId>db2jcc4</artifactId>
<version>1.0</version>
</dependency>
<!-- 常量依赖项 ********************************************** -->
....
</dependencies>
...
</project>
- 第 18-22 行:JDBC 驱动程序(源自 DB2);
第二个修改位于定义数据库访问凭据的类 [ConfigJdbc] 中:
// 连接参数
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] 所能支持的参数最大数量:
// [PreparedStatement] 的最大参数数
public final static int MAX_PREPAREDSTATEMENT_PARAMETERS = 10000;
[JUnitTestPushTheLimits]测试会在5000种产品上生成SQL订单,这些订单将生成包含5000个参数的[PreparedStatement]。MySQL此前已支持该参数数量。 DB2 同样支持该值。
第四项修改是表名 [ROLES] 的变更。实际上,该名称在 SGBD 和 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. JPA 和 OpenJpa 层的配置
![]() | ![]() |
项目 [db2-config-jpa-openjpa] 配置了测试架构中的 [JPA] 层:
![]() |
该项目与 SGBD MySQL OpenJpa JPA 层中的配置项目 [mysql-config-jpa-openjpa] 类似 (参见第8.3节)。实际上,这两个SGBD项目均使用[@GeneratedValue(strategy = GenerationType.IDENTITY)]注解来生成主键。 只需进行一项修改。该修改位于 [ConfigJpa] 类的 [jpaVendorAdapter] Bean 定义中:
// 提供程序 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 将采用该 SGBD 的专有数据类型及其所属的 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. JPA 层的配置 EclipseLink
![]() | ![]() |
注意:执行 [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] 的配置执行应能成功。































