开发支持
本章主要介绍应用开发示例、应用开发设计、连接数据库方式、创建和管理数据库对象、数据写入、数据查询、分布式事务特性、 SQL 性能调优、 SQL 实践和建议等。
应用开发示例
本节提供不同编程语言连接到 GoldenDB 代码示例。
Java 语言连接示例
GoldenDB 驱动完全实现 JDBC 标准接口,可以按照 JDBC 标准接口连接数据库。以下所有示例代码,都需要依赖 GoldenDB 自研驱动,需要将驱动包引入到代码依赖中。
JDBC 直接连接
环境配置
推荐JDK1.8。
GoldenDB 自研驱动。示例代码
public static void main(String[] args) { String url = "jdbc:goldendb://host:port/test"; String pass = "****"; String username = "****"; String sql = "insert into good (id, name) values (1, 'name')"; Connection connection = null; Statement st = null; try { connection = DriverManager.getConnection(url, username, pass); st = connection.createStatement(); st.execute(sql); } catch (SQLException e) { if(st != null){ try { st.close(); } catch (SQLException ex) { throw new RuntimeException(ex); } } if(connection != null){ try { connection.close(); } catch (SQLException ex) { throw new RuntimeException(ex); } } throw new RuntimeException(e); } }核心参数说明
字段
描述
url
连接字符串,采用标准 JDBC 连接串写法。
pass
数据库密码。
username
数据库用户名。
sql
需要执行的 SQL。
Mybatis 框架连接
环境配置
JDK1.8。maven3.6以上。
GoldenDB 驱动。示例代码
pom.xml
使用
maven来管理项目,其中pom.xml中引入框架依赖,pom.xml文件示例如下:<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.test</groupId> <artifactId>mybatis_single3_5_0</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <name>mybatis_single3_5_0</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.0</version> </dependency> </dependencies> </project>mybatis-config.xml
mybatis配置连接相关参数,mybatis-config.xml文件示例如下:<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <environments default="development"> <environment id="development"> <!-- JDBC transaction manager --> <transactionManager type="JDBC"/> <!-- Database pool --> <dataSource type="POOLED"> <property name="driver" value="com.goldendb.jdbc.Driver"/> <property name="url" value="jdbc:goldendb://host:port/test"/> <property name="username" value="****"/> <property name="password" value="****"/> </dataSource> </environment> </environments> <mappers> <mapper resource="GoodMapper.xml"/> </mappers> </configuration>核心参数说明
参数
描述
driver
驱动完整类名。
url
连接字符串,采用标准 JDBC 连接串写法。
pass
数据库密码。
resource
mapper 文件地址, 文中示例 GoodMapper.xml 在 resources 目录下。
GoodMapper.xml
MyBatis中,Mapper是一个用于将SQL操作与Java对象进行映射的接口或XML文件,GoodMapper.xml具体写法如下:<?xml version="1.0" encoding="UTF8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.test.GoodMapper"> <select id="listUser" resultType="com.test.Good"> select * from user; </select> </mapper>核心参数说明
参数
描述
namespace
mapper 文件命名空间。
id
namespace + id 需要全局唯一。
Hibernate 框架连接
环境配置
JDK1.8。maven3.6以上。
GoldenDB 驱动。示例代码
pom.xml
使用
maven来管理项目,其中pom.xml中引入框架依赖,pom.xml文件示例如下:<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId> <artifactId>x</artifactId> <version>1.0-SNAPSHOT</version> <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>3.6.10.Final</version> </dependency> <dependency> <groupId>javassist</groupId> <artifactId>javassist</artifactId> <version>3.12.1.GA</version> </dependency> </dependencies> </project>hibernate.cfg.xml
hibernate配置连接相关参数如下,hibernate.cfg.xml文件示例如下:<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.connection.driver_class"> com.goldendb.jdbc.Driver </property> <property name="hibernate.connection.password"> **** </property> <property name="hibernate.connection.url"> jdbc:goldendb://host:port/test </property> <property name="hibernate.connection.username"> **** </property> <mapping resource="Good.hbm.xml"/> </session-factory> </hibernate-configuration>核心参数说明
参数
描述
driver_class
驱动完整类名。
url
连接字符串,采用标准 JDBC 连接串写法。
password
数据库密码。
username
数据库用户名。
resource
hibernate 对象关系映射文件地址,文中示例 Good.hbm.xml 在 resources 目录下。
Good.hbm.xml
hibernate中映射配置文件,Good.hbm.xml文件示例如下:<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="org.example.entity.Good" table="good2"> <id name="id" type="java.lang.Integer"> <column name="id" not-null="true" sql-type="NUMBER"/> <generator class="native"/> </id> <property name="name" type="java.lang.String"> <column name="name" /> </property> <property name="price" type="java.lang.Double"> <column name="price" /> </property> <property name="create_time" type="java.lang.String"> <column name="create_time" /> </property> </class> </hibernate-mapping>核心参数说明
参数
描述
class 标签中 name
完整 POJO 类的类型。
class 标签中 table
数据库表名称。
Spring Boot 框架连接
环境配置
JDK1.8。maven3.6以上。
GoldenDB 驱动。示例代码
pom.xml
使用
maven来管理项目,其中pom.xml中引入框架依赖,pom.xml文件示例如下:<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.6.0</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>org.example</groupId> <artifactId>boot</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <artifactId>spring-boot-starter-json</artifactId> <groupId>org.springframework.boot</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> </dependencies> </project>application.yml
Spring Boot配置连接相关参数,application.yml文件示例如下:spring: datasource: driver-class-name: com.goldendb.jdbc.Driver url: jdbc:goldendb://host:port/test username: ****** password: ******核心参数说明
参数
描述
driver-class-name
驱动完整类名。
url
连接字符串,采用标准 JDBC 连接串写法。
pass
数据库密码。
username
数据库用户名。
C++ 语言连接示例
ODBC(Open-DataBase-Connectivity) 是最早由微软提出的开放式数据库互连技术,其基本思想是为用户提供简单、标准、透明的数据库连接的公共编程接口,搭配不同的驱动程序,用户使用同一套应用程序就可以访问不同的数据库。
环境配置
GoldenDB 定制ODBC驱动。
硬件平台:x86_64/aarch64。
操作系统:x86_64架构下:CentOS/Redhat系Linux发行版 7 系列,suse12,海光麒麟。示例代码
#include<sql.h> #include<sqlext.h> #include<string.h> #include<time.h> #include<stdlib.h> #include<stdio.h> #define isSuc(result) ((result) == SQL_SUCCESS || (result) == SQL_SUCCESS_WITH_INFO) /** 可扩展设置 **/ char szConnectString[2560] ="DRIVER={/usr/lib64/libmyodbc5a.so};USER=xxx;PASSWORD=xxx;DATABASE=xx;PORT=8880;SERVER=10.10.10.10;SAFE=1;"; char szSQLDrop[256] = "drop table if exists t1;"; char szSQLCreate[256] = "CREATE TABLE t1(id int NOT NULL primary key,name char(50) NOT NULL,age int NOT NULL)distributed by hash(id)(g1)"; /** 输出缓存 **/ char szDriverOutput[256]; short sDriverOutputLength; /** 用于测试的函数 **/ int main() { short sret; //返回代码 void* henv; //环境句柄 void* hdbc; //连接句柄 long mode;//提交模式 void* hsmt; //语句句柄 /** 申请环境句柄 **/ sret = SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&henv); if(!isSuc(sret)){printf("申请环境句柄出错\n");return 0;} /** 设置环境属性,声明ODBC版本 **/ sret = SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION,(void*)SQL_OV_ODBC3,SQL_IS_INTEGER); if(!isSuc(sret)){printf("声明ODBC版本出错\n");return 0;} /** 申请连接句柄 **/ sret = SQLAllocHandle(SQL_HANDLE_DBC,henv,&hdbc); if(!isSuc(sret)){printf("申请连接句柄出错\n");return 0;} /** 连接数据源 **/ sret = SQLDriverConnect(hdbc,NULL,(SQLCHAR*)szConnectString,SQL_NTS,(SQLCHAR *)szDriverOutput,2560,&sDriverOutputLength,SQL_DRIVER_NOPROMPT); if(!isSuc(sret)){printf("连接数据源出错\n");return 0;} else printf("\nCreate connection success !\n\n"); /** 分配语句句柄 **/ sret = SQLAllocHandle(SQL_HANDLE_STMT,hdbc,&hsmt); if(!isSuc(sret)){printf("分配语句句柄出错\n");return 0;} /** 执行drop语句 **/ printf("execute sql: %s\n\n", szSQLDrop); sret = SQLExecDirect(hsmt,(SQLCHAR *)szSQLDrop,256); if(!isSuc(sret)){printf("exec drop sql fail !\n\n");return 0;} else printf("drop table t1(old) success !\n\n"); /** 执行create语句 **/ printf("execute sql: %s\n\n", szSQLCreate); sret = SQLExecDirect(hsmt,(SQLCHAR *)szSQLCreate,256); if(!isSuc(sret)){printf("exec create sql fail !\n\n");return 0;} else printf("create table t1(new) success !\n\n"); /** 执行insert prepare语句 **/ char szSQLPrepareInsert[256] = "insert into t1 values(?,?,?)"; printf("prepare sql: %s\n\n", szSQLPrepareInsert); sret = SQLPrepare (hsmt,(SQLCHAR *)szSQLPrepareInsert,256); if(!isSuc(sret)){printf("prepare sql fail !\n\n");return 0;} else printf("prepare success !\n\n"); size_t batchSize = 9; int param1[9] = {1,2,3,4,5,6,7,8,9}; char param2[9][50] = {"name1","name2","name3","name4","name5","name6","name7","name8","name9"}; int param3[9] = {11,12,13,14,15,16,17,18,19}; sret = SQLBindParameter(hsmt,1,SQL_PARAM_INPUT,SQL_C_SLONG,SQL_INTEGER,0,0,param1,0,NULL); sret = SQLBindParameter(hsmt,2,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,5,0,param2,50,NULL); sret = SQLBindParameter(hsmt,3,SQL_PARAM_INPUT,SQL_C_SLONG,SQL_INTEGER,0,0,param3,0,NULL); if(!isSuc(sret))printf("bind param fail !\n\n"); sret = SQLSetStmtAttr(hsmt, SQL_ATTR_PARAMSET_SIZE,(SQLPOINTER)batchSize, 0); if(!isSuc(sret))printf("set paramSize fail !\n\n"); sret = SQLExecute(hsmt); if(!isSuc(sret))printf("exec stmt fail !\n\n"); else printf("exec stmt success !\n\n"); SQLLEN affRows = 0; sret = SQLRowCount(hsmt,&affRows); if(!isSuc(sret))printf("SQLRowCount stmt fail !\n\n"); else printf("SQLRowCount stmt success !\n\n"); printf("affect rows: %d\n\n",affRows); /** 执行select prepare语句 **/ char szSQLPrepareSelect[256] = "select id,name,age from t1 where id < ?"; printf("prepare sql: %s\n\n", szSQLPrepareSelect); sret = SQLPrepare (hsmt,(SQLCHAR *)szSQLPrepareSelect,256); if(!isSuc(sret)){printf("prepare sql fail !\n\n");return 0;} else printf("prepare success !\n\n"); int select_param1 = 12; sret = SQLBindParameter(hsmt,1,SQL_PARAM_INPUT,SQL_C_SLONG,SQL_INTEGER,0,0,&select_param1,0,NULL); if(!isSuc(sret))printf("bind param fail !\n\n"); sret = SQLExecute(hsmt); if(!isSuc(sret))printf("exec stmt fail !\n\n"); else printf("exec stmt success !\n\n"); sret = SQLSetStmtAttr(hsmt, SQL_ATTR_ROW_ARRAY_SIZE,(SQLPOINTER)1, 0); if(!isSuc(sret))printf("set paramSize fail !\n\n"); int ans1 = 0; char ans2[50]; int ans3 = 0; sret = SQLBindCol(hsmt,1,SQL_C_SLONG,&ans1,sizeof(int),NULL); sret = SQLBindCol(hsmt,2,SQL_C_CHAR,ans2,50,NULL); sret = SQLBindCol(hsmt,3,SQL_C_SLONG,&ans3,sizeof(int),NULL); if(!isSuc(sret))printf("define param fail !\n\n"); do{ sret = SQLFetch(hsmt); if(isSuc(sret)){ printf("fetch success: [id:%d,name:%s,age:%d]\n",ans1,ans2,ans3); } }while(sret == 0); /** 释放语句句柄 **/ SQLFreeHandle(SQL_HANDLE_STMT,hsmt); /** 提交连接的事务 **/ SQLEndTran(SQL_HANDLE_DBC,hdbc,SQL_COMMIT); /** 断开与数据源的连接 **/ SQLDisconnect(hdbc); /** 释放连接句柄 **/ SQLFreeHandle(SQL_HANDLE_DBC,hdbc); /** 释放环境句柄 **/ SQLFreeHandle(SQL_HANDLE_ENV,henv); printf("The connection will be closed !\nBye !\n"); }
Go 语言连接示例
database/sql Go 语言标准库中用于数据库操作的接口,提供了一种通用的数据库操作方式,使得可以以统一的方式连接和操作不同的类型的数据库,而无需关心具体的数据库内部具体实现细节,GoldenDB 提供实现了该标准的 Go 语言驱动。
环境配置
GoldenDB 定制Go驱动。示例代码
package main import ( "database/sql" "fmt" _ "github.com/go-sql-driver/goldenDB" "log" ) func main() { // 构建连接串 dsn := "username:password@tcp(ip:port)/xxx" // 连接数据库 db, err := sql.Open("mysql", dsn) if err != nil { log.Fatal(err) } defer db.Close() // 测试连接 err = db.Ping() if err != nil { log.Fatal(err) } fmt.Println("Connected to the database successfully!") // 查询表 "good" 的第一个字段 rows, err := db.Query("SELECT name FROM good") if err != nil { log.Fatal(err) } defer rows.Close() // 循环表的行 for rows.Next() { var firstField string err := rows.Scan(&firstField) if err != nil { fmt.Println("读取行失败:", err.Error()) return } fmt.Println("First field in table 'good':", firstField) } err = rows.Err() if err != nil { log.Fatal(err) } }
Python 语言连接示例
Python DB-API 是 Python 标准库中定义的数据库接口规范,用于开发数据库连接和操作模块,GoldenDB 提供实现了这一标准的驱动,用户可以遵循相同的操作方式和语法来使用。
环境配置
GoldenDB 定制Python驱动。示例代码
# -*- coding: utf-8 -*- import pymysql # 连接相关参数 conn = pymysql.connect( host='xx.xx.xx.xx', port=xxxx, user='xxxx', password='xxxx', database='xxx', ) # 创建游标对象 cursor = conn.cursor() # 执行 SQL 查询语句 cursor.execute("select * from good") # 获取查询结果 result = cursor.fetchall() # 获取第一条参数 first_column_values = [row[0] for row in result] print(first_column_values.pop()) # 关闭资源 cursor.close() conn.close()




