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

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

数据库驱动
先删除 原有数据库驱动(当前都是MySQL)
<dependency>
 <groupId>mysql</groupId>
 <artifactId>mysql-connector-java</artifactId>
 <version>5.1.38</version>
</dependency>

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

<dependency>
 <groupId>com.huawei.gauss</groupId>
 <artifactId>com.huawei.gauss.jdbc.ZenithDriver</artifactId>
 <version>GaussDB_100_1.0.1.SPC2.B003</version>
</dependency>
数据源 变更
<property name="driverClass" value="com.huawei.gauss.jdbc.ZenithDriver"/>
<property name="jdbcUrl" value="jdbc:zenith:@127.0.0.1:3358?useSSL=false"/>
<property name="user" value="jr"/>
<property name="password" value="data****_123"/>

<!-- GaussDB 高斯数据库不能有下边的配置,否则报错 -->
<!-- <property name="testConnectionOnCheckout" value="true"/>-->

分页说明

经过测试 高斯数据库支持 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<TraceDataStoreWithBLOBs> getList(TraceDataStoreVo record) throws Exception;

 
    int insertSelectiveGetKey(TraceDataStoreWithBLOBs record) throws Exception;

 
    Integer insertBatch(List<TraceDataStoreWithBLOBs> datas)throws Exception;

}

 

<mapper namespace="com.TraceDataStoreExtMapper">
 
  <resultMap id="BaseResultMap" type="com.TraceDataStoreWithBLOBs" extends="com.TraceDataStoreMapper.ResultMapWithBLOBs">
  </resultMap>
 
  <!--基础查询条件-->
  <sql id="selectList_Count_Where">
    <where>
      AND del_flag=0
      <if test="traceAccount != null">
        AND trace_account = #{traceAccount,jdbcType=VARCHAR}
      </if>
    </where>
  </sql>
 
  <select id="getList" parameterType="com.TraceDataStoreVo" resultMap="BaseResultMap">
    select
    <include refid="com.TraceDataStoreMapper.Base_Column_List" />
    ,
    <include refid="com.TraceDataStoreMapper.Blob_Column_List" />
 
    from zt_trace_data_store
    <include refid="selectList_Count_Where"></include>
    order by create_time desc
  </select>
 
  <insert id="insertSelectiveGetKey" parameterType="com.TraceDataStoreWithBLOBs"  useGeneratedKeys="true" keyProperty="id">
    insert into zt_trace_data_store
    <trim prefix="(" suffix=")" suffixOverrides=",">
      <if test="id != null">
        id,
      </if>
      <if test="traceAccount != null">
        trace_account,
      </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides=",">
      <if test="id != null">
        #{id,jdbcType=BIGINT},
      </if>
      <if test="traceAccount != null">
        #{traceAccount,jdbcType=VARCHAR},
      </if>
    </trim>
  </insert>
 
  <insert id="insertBatch"   parameterType="java.util.List"  useGeneratedKeys="true" keyProperty="id">
    INSERT INTO zt_trace_data_store (
      id, trace_account
    )
    VALUES
    <foreach collection="list" item="item" index="index" separator="," >
      (
        #{item.id,jdbcType=BIGINT}, #{item.traceAccount,jdbcType=VARCHAR}
      )
    </foreach>
  </insert>
</mapper>
案例-现有接口实现Mapper

 

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

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

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

案例-Mapper.xml 实现
<mapper  namespace="com.TraceDataStoreExtDialectMapper" >
  <!-- 设置方言 MySQL -->
  <insert id="insertSelectiveGetKey" databaseId="mysql" parameterType="com.TraceDataStoreWithBLOBs"  useGeneratedKeys="true" keyProperty="id">
    insert into zt_trace_data_store
    <trim prefix="(" suffix=")" suffixOverrides=",">
      <if test="id != null">
        id,
      </if>
      <if test="traceAccount != null">
        trace_account,
      </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides=",">
      <if test="id != null">
        #{id,jdbcType=BIGINT},
      </if>
      <if test="traceAccount != null">
        #{traceAccount,jdbcType=VARCHAR},
      </if>
    </trim>
  </insert>
</mapper>

备注: 只比原始配置多了一个 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配置 (相当于重写)

改造目录结

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

 

  • 0
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值