mybatis詳解-(12)配置多種資料庫SQL解析
前一篇介紹了mybatis配置多個數據源,可以切換不同的資料庫環境。有一種情況:比如一個系統中使用了多個數據源,系統該怎麼判別每個sql語句使用的是哪種型別資料庫的語法呢?mybatis提供了一種方法,可以在配置檔案中指定每個sql語句使用的是哪種資料庫語法,執行是可按照該資料庫解析對應的sql。
該標籤為<databaseIdProvider>
,在mybatis的主配置檔案中新增該標籤,在該標籤下新增多種資料庫,然後在mapper配置檔案中的每個語句中指定該語句使用的是哪種資料庫解析該語句。
具體操作詳見例項:
1.建立例項類
Employee
package org.mybatis.environments;
import org.apache.ibatis.type.Alias;
@Alias("empp")
public class Employee {
private Integer id;
private String lastName;
private String email;
private String gender;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getGender () {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
@Override
public String toString() {
return "Employee [id=" + id + ", lastName=" + lastName + ", email=" + email
+ ", gender=" + gender + "]";
}
}
2.建立介面類
EmployeeMapper
package org.mybatis.environments;
public interface EmployeeMapper {
public Employee getEmpById(Integer id);
}
3.建立主配置檔案
mybatis-config-environments.xml
在配置檔案中虹新增如下內容:
<databaseIdProvider type="VENDOR">
<property name="SQL Server" value="sqlserver"/>
<property name="DB2" value="db2"/>
<property name="Oracle" value="oracle" />
<property name="MySQL" value="mysql"/>
</databaseIdProvider>
有的版本type=DB_VENDOR,但是有的版本使用的是type=VENDOR,property中的name為mybatis統一提供不能自定義,但是value是自定義的名字可隨便擬定。並且databaseIdProvider 的位置需要在environments標籤之下。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties resource="db.properties"></properties>
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<typeAliases>
<!-- 為包下的所有類起別名,預設為類名大小寫(不區分大小寫) -->
<package name="org.mybatis.environments"/>
</typeAliases>
<!-- 預設development是開發環境,如果改成test則表示使用測試環境 -->
<environments default="dev_mysql">
<environment id="dev_mysql">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${mysql.driver}" />
<property name="url" value="${mysql.url}" />
<property name="username" value="${mysql.username}" />
<property name="password" value="${mysql.password}" />
</dataSource>
</environment>
<environment id="test_mysql">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${mysql.drivertest}" />
<property name="url" value="${mysql.urltest}" />
<property name="username" value="${mysql.usernametest}" />
<property name="password" value="${mysql.passwordtest}" />
</dataSource>
</environment>
</environments>
<!-- 如果一個平臺使用多個數據庫,因為每個資料庫都有自己特有的語法,所以系統沒法判斷到底每個SQL對應哪個資料庫,所以可以通過
databaseIdProvider申明多個數據庫,在mapper配置檔案中databaseId="mysql"或者databaseId="oracle"
VendorDatabaseIdProvider -->
<databaseIdProvider type="VENDOR">
<property name="SQL Server" value="sqlserver"/>
<property name="DB2" value="db2"/>
<property name="Oracle" value="oracle" />
<property name="MySQL" value="mysql"/>
</databaseIdProvider>
<mappers>
<mapper resource="mapper/environmentsmapper.xml"/>
</mappers>
</configuration>
4.建立mapper配置檔案
environmentsmapper.xml
在mapper配置檔案中指定每個sql語句所使用的是哪種資料庫解析,比如這裡使用的是mysql資料,那麼通過databaseId指定使用mysql資料庫方言解析該sql。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.mybatis.environments.EmployeeMapper">
<select id="getEmpById" resultType="empp" databaseId="mysql">
select id,last_name,email,gender from mybatis_employee where id = #{id}
</select>
</mapper>
5.建立測試類
package org.mybatis.environments;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
/**
* 使用介面式程式設計
*/
public class MybatisTest {
@Test
public void testMybatis() {
String resource = "mybatis-config-environments.xml";//全域性配置檔案
InputStream inputStream = null;
SqlSessionFactory sqlSessionFactory = null;
SqlSession sqlSession = null;
try {
inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
sqlSession = sqlSessionFactory.openSession();
EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
Employee emp = mapper.getEmpById(2);
System.out.println(emp);
sqlSession.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
}
}
}
可能在實際的開發過程中這種場景很少出現,可以作為一個拓展。