3.8 databaseIdProvider 数据库厂商标识
在相同数据库厂商的环境下,数据库厂商标识没有什么意义,在实际的应用中使用得比较少,因为使用不同厂商数据库的系统还是比较少的。MyBatis 可能会运行在不同厂商的数据库中,它为此提供一个数据库标识,并提供自定义,它的作用在于指定 SQL 到对应的数据库厂商提供的数据库中运行。
3.8.1 使用系统默认规则
MyBatis 提供默认的配置规则,如代码清单 3-30 所示。
代码清单 3-30:使用默认数据库标签
<databaseIdProvider type="DB_VENDOR"> <property name="SQL Server" value="sqlserver"/> <property name="MySQL" value="mysql"/> <property name="DB2" value="db2"/> <property name="Oracle" value="oracle" /> </databaseIdProvider>
type="DB_VENDOR"是启动 MyBatis 内部注册的策略器。首先 MyBatis 会将你的配置读入 Configuration 类里面,在连接数据库后调用 getDatabaseProductName() 方法去获取数据库的信息,然后用我们配置的 name 值去做匹配来得到 DatabaseId。我们把这些配置到我们的例子里,而我们的例子使用的正是 MySQL 数据库。这个时候,我们可以用下面的代码来获得数据库的 ID,显然结果就是 MySQL。
sqlSessionFactory.getConfiguration().getDatabaseId();
我们也可以指定 SQL 在哪个数据库厂商执行,我们把 Mapper 的 XML 配置修改一下,如代码清单 3-31 所示。
代码清单 3-31:定义数据库标签
<select parameterType="string" id="getRole" resultType="role" databaseId= "mysql"> select role_no as roleNo, role_name as roleName, note from t_role where role_no =#{roleNo, javaType=String, jdbcType=VARCHAR} </select>
在多了一个 databaseId 属性的情况下,MyBatis 将提供如下规则。
如果没有配置 databaseIdProvider 标签,那么 databaseId 就会返回 null。
如果配置了 databaseIdProvider 标签,MyBatis 就会用配置的 name 值去匹配数据库信息,如果匹配得上就会设置 databaseId,否则依旧为 null。
如果 Configuration 的 databaseId 不为空,则它只会找到配置 databaseId 的 SQL 语句。
MyBatis 会加载不带 databaseId 属性和带有匹配当前数据库 databaseId 属性的所有语句。如果同时找到带有 databaseId 和不带 databaseId 的相同语句,则后者会被舍弃。
3.8.2 不使用系统默认规则
MyBatis 也提供规则允许自定义,我们只要实现 databaseIdProvider 接口,并且实现配置即可,下面我们来看一个实例。
首先,写好我们自定义的规则类,如代码清单 3-32 所示。
代码清单 3-32:MydatabaseIdProvider.java
package com.learn.chapter3.databaseIdprovider; import java.sql.SQLException; import java.util.Properties; import javax.sql.DataSource; import org.apache.ibatis.mapping.DatabaseIdProvider; public class MydatabaseIdProvider implements DatabaseIdProvider{ private Properties properties = null; @Override public void setProperties(Properties properties) { this.properties = properties; } @Override public String getDatabaseId(DataSource ds) throws SQLException { String dbName = ds.getConnection().getMetaData().getDatabaseProductName(); String dbId = (String)this.properties.get(dbName); return dbId; } }
其次,注册这个类到 MyBatis 上下文环境中,我们这样配置 databaseIdProvider 标签,如代码清单 3-33 所示。
代码清单 3-33:配置 databaseIdProvider
<databaseIdProvider type="com.learn.chapter3.databaseIdprovider.MydatabaseIdProvider"> <property name="SQL Server" value="sqlserver"/> <property name="MySQL" value="mysql"/> <property name="DB2" value="db2"/> <property name="Oracle" value="oracle" /> </databaseIdProvider>
我们把 type 修改为我们自己实现的类,类里面 setProperties 方法的参数传递进去的将会是我们在 XML 里面配置的信息,我们保存在类的变量 properties 里,方便以后读出。在方法 getDatabaseId 中,传递的参数是数据库数据源,我们获取其名称,然后通过 properties 的键值找到对应的 databaseId。
如有特殊的要求,我们可以根据自己所需要的规则来编写 databaseIdProvider。配置 Mapper、使用规则和默认规则是一致的。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论