MyBatis 方言支持 - Mysql to 华为高斯数据库(gaussdb)

1.spring-config-mybatis.xml文件加入方言支持(只列出必要字段)



    
        
            
            
            
        
    

 
 

     
    

配置说明: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支持 案例说明

数据库驱动
先删除 原有数据库驱动(当前都是MySQL)

 mysql
 mysql-connector-java
 5.1.38

引入 新数据库驱动文件(高斯数据库)


 com.huawei.gauss
 com.huawei.gauss.jdbc.ZenithDriver
 GaussDB_100_1.0.1.SPC2.B003
数据源 变更





分页说明

经过测试 高斯数据库支持 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)

数据库-语法变更

部分预发差异

MySql 高斯数据库
sysdate()
sysdate

 

案例-现有接口
public interface TraceDataStoreExtMapper {

 
    List getList(TraceDataStoreVo record) throws Exception;

 
    int insertSelectiveGetKey(TraceDataStoreWithBLOBs record) throws Exception;

 
    Integer insertBatch(List datas)throws Exception;

}

 


 
  
  
 
  
  
    
      AND del_flag=0
      
        AND trace_account = #{traceAccount,jdbcType=VARCHAR}
      
    
  
 
  
 
  
    insert into zt_trace_data_store
    
      
        id,
      
      
        trace_account,
      
    
    
      
        #{id,jdbcType=BIGINT},
      
      
        #{traceAccount,jdbcType=VARCHAR},
      
    
  
 
  
    INSERT INTO zt_trace_data_store (
      id, trace_account
    )
    VALUES
    
      (
        #{item.id,jdbcType=BIGINT}, #{item.traceAccount,jdbcType=VARCHAR}
      )
    
  
案例-现有接口实现Mapper

 

案例-Mapper类继承
public interface TraceDataStoreExtDialectMapper extends TraceDataStoreExtMapper {
}

继承类 空实现即可 - 目的是为了后续可以单独写 mapper.xml

切记:将项目中用到 TraceDataStoreExtMapper 的地方都替换成 TraceDataStoreExtDialectMapper

案例-Mapper.xml 实现

  
  
    insert into zt_trace_data_store
    
      
        id,
      
      
        trace_account,
      
    
    
      
        #{id,jdbcType=BIGINT},
      
      
        #{traceAccount,jdbcType=VARCHAR},
      
    
  

备注: 只比原始配置多了一个 databaseId="mysql" 当数据源是MySQL时会自动加载该配置

databaseId 说明:

MyBatis 会加载不带 databaseId 属性和带有匹配当前数据库 databaseId 属性的所有语句。
如果同时找到带有 databaseId 和不带 databaseId 的相同语句,则后者会被舍弃。

案例-测试结论

1.TraceDataStoreExtDialectMapper类对应的xml配置可以为空或只写符合业务的sql配置(打破了之前必须要填写所有接口方法的限制)

2.当databaseId跟数据源匹配时对应 sql xml 被加载

3.当databaseId跟数据源不匹配时 加载原始xml配置(被继承者的)

4.当 TraceDataStoreExtDialectMapper 的 databaseId 为空时加载继承者(TraceDataStoreExtDialectMapper)的 xml配置 (相当于重写)

改造目录结

MyBatis 方言支持 - Mysql to 华为高斯数据库(gaussdb)_第1张图片

多方言支持可以采用该方式-分别实现各自的 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();
        }
    }
}

 

你可能感兴趣的:(02-数据库)