使用规范

  • 强烈建议表名和字段名统一使用小写或者大写,人大金仓数据库默认大小写敏感
  • 创建函数和存储过程可以使用Oracle的语法创建,兼容Oracle语法。
  • GROUP BY 查询需要在SELECT 中指明字段,如不指明不能使用GROUP BY,可以使用DISTINCT ON
  • 分页使用ROWNUM伪列来实现分页可参考Oracle语法 或者 使用limit进行分页也可以语法参考postgresql
  • 支持序列,用法和ORACLE一样
  • 不支持where条件中判断非NULL的空字段,如下:
--不支持的写法
SELECT * FROM USER WHERE ADDR = '';
--建议写法,使用length函数,支持oracle/mysql/postgresql/kingbase等多种数据库
SELECT * FROM USER WHERE length(ADDR) = 0;

引入依赖

在pom.xml中配置如下:

驱动包需要本地安装,或者通过systemPath引入:

<dependency>
	<groupId>com.kingbase8</groupId>
	<artifactId>kingbase8</artifactId>
	<version>8.2.0</version>
	<!-- scope>system</scope>
	<systemPath>${project.basedir}/lib/kingbase8-8.2.0.jar</systemPath-->
</dependency>

Druid 数据库连接池

Druid 金仓V82 的配置例子:

jdbc.driverClassName=com.kingbase8.Driver
jdbc.url=jdbc:kingbase8://127.0.0.1:54321/test
jdbc.username=root
jdbc.password=1qaz!QAZ
filters= stat,log4j

filters常用种类:
监控统计用的filter:stat
日志用的filter:log4j
防御sql注入的filter:wall目前不支持国产数据库

模式指定

默认使用public模式,建议指定模式,指定方式,如下:

jdbc.url=jdbc:kingbase8://127.0.0.1:54321/test?currentSchema=rdp_server

rdp_server 会自动变成大写 RDP_SERVER、rdp_server和"rdp_server"是相等的

Mybatis注意事项

  • 需要使用MyBatis 3及后续版本
  • 建议使用版本Mybatis3.2.8,Mybatis3.3.0和Mybatis3.4.5 官方均已通过版本适配的验证测试
  • KingbaseES 支持array数据类型,在MyBatis中需要增加ArrayTypeHandler来处理这以特殊类型;
  • KingbaseES 支持json数据类型,在Mybatis中需要增加JsonTypeHandler来处理这一特殊类型;
  • KingbaseES 支持hstore数据类型,在Mybatis中需要增加HstoreTypeHandler来处理这一特殊类型;
  • KingbaseES 支持XML数据类型,在Mybatis的映射中,需要对xml数据类型做标注,如:
insert into t_xml(value) values ((#{content})::xml)
  • KingbaseES String转存Blob字段类型需要增加转换类来处理,参考如下:
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;

import java.io.ByteArrayInputStream;
import java.sql.*;

/**
 * @author:WC
 * @date: 2021/6/4
 * @time: 10:09
 */
public class BlobToStringTypeHandler extends BaseTypeHandler<String> {
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
        byte[] bytes = parameter.getBytes();
        ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
        ps.setBinaryStream(i, bis, bytes.length);
    }

    @Override
    public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
        Blob blob = rs.getBlob(columnName);
        return new String(blob.getBytes(1, (int)blob.length()));
    }

    @Override
    public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        Blob blob = rs.getBlob(columnIndex);
        return new String(blob.getBytes(1, (int)blob.length()));
    }

    @Override
    public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        Blob blob = cs.getBlob(columnIndex);
        return new String(blob.getBytes(1, (int)blob.length()));
    }
}

Mybatis-plus配置

如果使用mybatis-plus快速开发,建议指定模式,配置方式如下:

mybatis-plus:
    global-config:
        db-config:
            #主键类型  0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID";
      		id-type: NONE #oracle兼容,人大金仓建议配置为NONE
            schema: rdp_server #指定模式

触发器注意事项

如果使用触发器实现插入数据自增主键,实体中注解不能使用IdType.AUTO,否则触发器不能被触发

@TableId(value = "user_id",type = IdType.NONE)

分页配置

推荐方式一:使用 v3.3.0 (包括)以上版本的mybatis-plus版本

推荐方式二:修改方言,将方言修改为ORACLE或者POSTGRE_SQL,都可以。

/**
 * 分页插件
 */
@Bean
public PaginationInterceptor paginationInterceptor() {
    dbType = dialectType;
    PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
    if("KingbaseES".equals(dialectType)){
        paginationInterceptor.setDialectType(DbType.POSTGRE_SQL.getDb());
    }else if("MySQL".equals(dialectType)){
    }
    return paginationInterceptor;
}

不推荐方式三:重写插件中JdbcUtils.java 类,人大金仓兼容ORACLE语法,我们可以直接返回DbType为Oracle或者postgresql,参考如下:

public class JdbcUtils {
    /**
     * <p>
     * 根据连接地址判断数据库类型
     * </p>
     *
     * @param jdbcUrl 连接地址
     * @return
     */
    public static DbType getDbType(String jdbcUrl) {
    	......
        } else if (jdbcUrl.contains(":oracle:")||jdbcUrl.contains(":kingbase8:")) {//在此处添加
            return DbType.ORACLE;
        } 
    	......
    }

}

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐