人大金仓(Kingbase)数据库配置注意事项
使用规范强烈建议表名和字段名统一使用小写或者大写,人大金仓数据库默认大小写敏感创建函数和存储过程可以使用Oracle的语法创建,兼容Oracle语法。避免使用关键字建表、建视图、函数等,关键参考 SQL关键词文档,GROUP BY 查询需要在SELECT 中指明字段,如不指明不能使用GROUP BY,可以使用DISTINCT ON分页使用ROWNUM伪列来实现分页可参考Oracle语法 或者 使用
·
使用规范
- 强烈建议表名和字段名统一使用小写或者大写,人大金仓数据库默认大小写敏感
- 创建函数和存储过程可以使用Oracle的语法创建,兼容Oracle语法。
- 避免使用关键字建表、建视图、函数等,关键参考 SQL关键词文档,
- 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;
}
......
}
}
更多推荐
已为社区贡献3条内容
所有评论(0)