1.spring-config-mybatis.xml文件加入方言支持(只列出必要字段)
<!-- 配置方言 -->
<bean name="databaseIdProvider" class="org.apache.ibatis.mapping.VendorDatabaseIdProvider" >
<property name="properties">
<map>
<entry key="MySQL" value="mysql"></entry>
<entry key="ORACLE" value="oracle"></entry>
<entry key="Zenith" value="gaussdb"></entry><!-- 高斯数据库 -->
</map>
</property>
</bean>
<bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="databaseIdProvider" ref="databaseIdProvider" /> <!-- 配置方言 -->
<!-- 其他配置 请参见项目代码 -->
</bean>
配置说明:key:数据库类型-mybatis可以根据数据源类型自动识别
value:mapper xml文件中用到,后续说明
自动识别数据源类型备注:
MyBatis 接口:org.apache.ibatis.mapping.VendorDatabaseIdProvider#getDatabaseProductName
实现该接口 java.sql.DatabaseMetaData
Mysql实现类:com.mysql.jdbc.DatabaseMetaData#getDatabaseProductName : return "MySQL"
2.Mapper说明
2.1 因为mapper XML 文件不支持继承,(一个接口中的方法在XML文件中必须有实现-否则启动报错),
所以采用 Mapper.java 接口类继承的方式
3.Mapper支持 案例说明
数据库驱动 | 引入 新数据库驱动文件(高斯数据库) | ||||
数据源 变更 | <!-- GaussDB 高斯数据库不能有下边的配置,否则报错 --> | ||||
分页说明 | 经过测试 高斯数据库支持 limit 操作,如下: select id, trace_account, business_type, tache_type, industry_code from zt_trace_data_store where del_flag=0 and trace_account = 'jmm' order by create_time desc LIMIT 5, 5
MyBatis 分页插件可用:(com.github.pagehelper.PageInterceptor) | ||||
数据库-语法变更 | 部分预发差异
| ||||
案例-现有接口 |
| ||||
案例-现有接口实现Mapper |
| ||||
案例-Mapper类继承 | 继承类 空实现即可 - 目的是为了后续可以单独写 mapper.xml 切记:将项目中用到 TraceDataStoreExtMapper 的地方都替换成 TraceDataStoreExtDialectMapper | ||||
案例-Mapper.xml 实现 | 备注: 只比原始配置多了一个 databaseId="mysql" 当数据源是MySQL时会自动加载该配置 databaseId 说明: MyBatis 会加载不带 databaseId 属性和带有匹配当前数据库 databaseId 属性的所有语句。 | ||||
案例-测试结论 | 1.TraceDataStoreExtDialectMapper类对应的xml配置可以为空或只写符合业务的sql配置(打破了之前必须要填写所有接口方法的限制) 2.当databaseId跟数据源匹配时对应 sql xml 被加载 3.当databaseId跟数据源不匹配时 加载原始xml配置(被继承者的) 4.当 TraceDataStoreExtDialectMapper 的 databaseId 为空时加载继承者(TraceDataStoreExtDialectMapper)的 xml配置 (相当于重写) | ||||
改造目录结 | 多方言支持可以采用该方式-分别实现各自的 databaseId 对应的配置 已经过测试可行; |
99.java原生代码调用数据库简单案例(测试)
package com.jd.bt.middle.service;
import java.sql.*;
public class GaussDBTest {
private static Connection connection = null;
private static PreparedStatement preState = null;
private static ResultSet resultSet = null;
private static final String username = "jr";
private static final String passwd = "data****_123";
private static Connection getConnection() {
String driver = "com.huawei.gauss.jdbc.ZenithDriver"; //数据库连接描述符。
String sourceURL = "jdbc:zenith:@127.0.0.1:3358?useSSL=true";
Connection conn = null;
try { //加载数据库驱动。
Class.forName(driver).newInstance();
} catch (Exception e) {
e.printStackTrace();
return null;
}
try {
//创建数据库连接。
conn = DriverManager.getConnection(sourceURL,username,passwd);
System.out.println("Connection 成功!\n");
} catch (Exception e) {
e.printStackTrace();
return null;
}
return conn;
};
private static void executeSqlQuery(String sql,Object ... args )throws Exception{
connection = getConnection();
preState = connection.prepareStatement(sql);
if(null!=args){
for(int i=1;i<=args.length;i++){
Object value = args[i-1];
if(value instanceof String){
preState.setString(i, String.valueOf(value));//1是指sql语句中第一个?, 2是指第一个?的values值
}else if(value instanceof Integer){
preState.setInt(i,Integer.valueOf(value.toString()));
}else if(value instanceof Long){
preState.setLong(i,Long.valueOf(value.toString()));
}else{
throw new RuntimeException("参数格式异常");
}
}
}
boolean execute = preState.execute();
System.out.println("执行结果:"+execute);
resultSet = preState.getResultSet();
}
private static void printResult(String ... fieldName)throws Exception{
try{
System.out.println("\n================打印结果如下================");
while (resultSet.next()) {
for(String item : fieldName){
String val = resultSet.getString(item);
System.out.print(item+":"+ val + " ");
}
System.out.println(); //打印输出结果集
}
System.out.println("================打印结果如上================\n");
}catch(Exception e){
e.printStackTrace();
}finally {
try {
if (resultSet!=null && !resultSet.isClosed()){
resultSet.close();
}
if (connection!=null && !connection.isClosed()) {
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args)throws Exception {
try{
// executeSql("select * from ADM_TABLESPACES where tablespace_name = ?","SYDB_RESOURCE" );
// printResult("tablespace_name","datafile_count");
// executeSqlQuery("select * from ZT_TRACE_DATA_STORE where id = ?",1 );
// printResult("trace_account","sku_id");
Long id = System.currentTimeMillis();
executeSqlQuery("insert into zt_trace_data_store (id,trace_account,business_type,tache_type,industry_code,sku_id) values (?,?,?,?,?,?)",id,"ofc",3,4,"jdbiz",69000001);
// printResult("trace_account","sku_id");
executeSqlQuery("select * from ZT_TRACE_DATA_STORE where trace_account = ?", "ofc" );
printResult("id","trace_account","industry_code");
}catch(Exception e){
e.printStackTrace();
}
}
}