一、 多数据库 优先级问题
上一篇讲了怎么使用**_databaseId**、databaseIdProvider 写不同的数据库语句
<databaseIdProvider type="DB_VENDOR" >
<property name="DB2" value="db2" />
<property name="Oracle" value="oracle" />
<property name="Adaptive Server Enterprise" value="sybase" />
<property name="MySQL" value="mysql" />
</databaseIdProvider>
讲实话,项目中很少这样用,因为数据库一般都是确定的而且变得概率是不大的。
但是作为一个知识点,我们可以学习一下,从学如果能悟出点儿解决工作中复杂业务的一些灵感那就更好了。
我不知道从哪儿看到了一句优先级的问题,但是今天想不到这个是什么意思了,这个优先级就当我没说吧,哈哈!
二、属性 databaseId
上一篇这样写的
<!--选择不同的数据库-->
<select id="testDb" resultType="string" >
<!--如果是mysql 执行这个 -->
<if test="_databaseId == 'mysql'">
select CONCAT('mysql-->',#{_databaseId},'-->',now()) from dual
</if>
<!--如果是oracle 执行这个-->
<if test="_databaseId == 'oracle'">
select 'oracle-->'||#{_databaseId} from dual
</if>
</select>
也可以这样写:
<!--选择不同的数据库-->
<!--mysql-->
<select id="testDb" resultType="string" databaseId="mysql">
select "mysql" from dual
</select>
<!--oracle-->
<select id="testDb" resultType="string" databaseId="oracle">
select "oracle"
</select>
<!--其他-->
<select id="testDb" resultType="string" databaseId="">
select "其他"
</select>
经过测试发现用了databaseId 标签就不能用**_databaseId**了
三、 自定义DatabaseIdProvider
创建类:
package config;
import org.apache.ibatis.mapping.DatabaseIdProvider;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.SQLException;
import java.util.Map;
import java.util.Properties;
/**
* @author 发现更多精彩 关注公众号:木子的昼夜编程
* 一个生活在互联网底层,做着增删改查的码农,不谙世事的造作
* @create 2021-09-03 21:35
*/
public class MyDatabaseIdProvider implements DatabaseIdProvider {
Properties prop ;
// 这个properties就是 mybatis-config.xml中 databaseIdProvider的所有property
@Override
public void setProperties(Properties p) {
this.prop = p;
}
@Override
public String getDatabaseId(DataSource dataSource) throws SQLException {
// 这里自己判断类型返回
// 获取连接
Connection con = null;
try {
con = dataSource.getConnection();
// 获取元信息
DatabaseMetaData metaData = con.getMetaData();
// 获取数据库产品名称
String productName = metaData.getDatabaseProductName();
System.out.println("产品名称:"+productName);
if (this.prop != null) {
for (Map.Entry<Object, Object> property : prop.entrySet()) {
String key = (String) property.getKey();
String value = (String) property.getValue();
System.out.println("key="+key+",value="+value);
if (productName.contains(key)) {
return value;
}
}
// 默认返回空
return null;
}
} finally {
if (con != null) {
try {
con.close();
} catch (SQLException e) {
// ignored
}
}
}
// 默认返回空
return null;
}
}
mybatis-config.xml指定类:
<databaseIdProvider type="config.MyDatabaseIdProvider" >
<property name="DB2" value="db2" />
<property name="Oracle" value="oracle" />
<property name="Adaptive Server Enterprise" value="sybase" />
<property name="MySQL" value="mysql" />
</databaseIdProvider>
测试:
public class TestMain {
public static void main(String[] args) throws Exception {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
// 通过sesson获取Mapper 这个Mapper会编程Mybatis的代理Mapper
PersonMapper mapper = session.getMapper(PersonMapper.class);
String type = mapper.testDb();
System.out.println("数据库类型:"+type);
}
}
输出结果:
有事儿没事儿关注公众号: 木子的昼夜